반응형

참고 사이트: iOS 프로그래밍을 위한 스위프트 기초(edwith)
참고 문서: The Swift Language Guide (한국어)
실행 환경: Xcode 12 실행 → Create a new Xcode project → macOS → Command Line Tool 선택 → Product Name, Organization Identifier 입력 후 프로젝트 생성

 

목차

  1. 스위프트(Swift) 5 배워보기 - 1. 다양한 타입
  2. 스위프트(Swift) 5 배워보기 - 2. 함수, 제어문, 옵셔널
  3. 스위프트(Swift) 5 배워보기 - 3. 클래스, 구조체, 열거형
  4. 스위프트(Swift) 5 배워보기 - 4. 클로저
  5. 스위프트(Swift) 5 배워보기 - 5. 프로퍼티
  6. 스위프트(Swift) 5 배워보기 - 6. 상속, 인스턴스 생성/소멸
  7. (계속)

 

함수

함수의 기본 형태

  • 함수는 결과 값을 반환(return)하는 형태와, 반환 값이 없는(Void) 형태로 나뉜다.
    • 실제로는 반환 값이 없는 것이 아니라 Void를 반환하는 것이다. 
    • Void는 ()를 사용한 비어있는 튜플이다.
  • 함수를 실행할 때 파라미터(인자 값)를 받을 수도 있고, 안 받을 수도 있다.
// 결과 값을 반환하는 형태의 함수

func 함수명(파라미터1: 타입, 파라미터2: 타입 ...) -> 반환타입 {
    return 반환값
}

// 반환하는 값이 없는 형태의 함수
// '-> Void'는 생략 가능

func 함수명(파라미터1: 타입, 파라미터2: 타입 ...) -> Void {
    print("반환 값이 없습니다.")
}

// 파라미터가 없는 함수
func 함수명() -> 반환타입 {
	return 반환값
}

 

  • 함수는 함수명파라미터로 실행(호출)할 수 있다.
// String 타입의 파라미터 1개를 인자로 받고,
// String 타입으로 결과를 반환하는 함수

func greet(person: String) -> String {
    return "Hello, " + person + "!"
}

// '함수명(파라미터)' 로 함수 실행
// 출력 함수(print)가 반환 값에 없기 때문에, print 함수를 사용하여 결과 값 출력
print(greet(person: "nyebo")) // "Hello, nyebo!"

 

함수의 다른 형태

기본 파라미터 값 설정

  • 함수에 파라미터를 설정할 때, 기본 값을 설정할 수 있다. 
  • 기본 값을 설정하면 함수를 호출할 때, 별도로 파라미터를 적지 않아도 자동으로 기본 값이 호출된다.
  • 대체로 기본 값을 설정한 파라미터는, 파라미터 목록 맨 뒤에 위치하는 것이 좋다.
// parameter2 에 기본 값(10)을 설정한 함수 생성
func someFunc(parameter1: Int, parameter2: Int = 10) {
    print("parameter1: \(parameter1), parameter2: \(parameter2)")
}

// parameter1, parameter2 둘 다 값 지정 후 함수 호출
someFunc(parameter1: 5, parameter2: 20)
// parameter1: 5, parameter2: 20
// parameter2의 값이 기본 값으로 지정한 10이 아닌,
// 함수 호출 시 지정한 20으로 출력 됨.

// parameter1 만 값 지정 후 함수 호출
someFunc(parameter1: 7)
// parameter1: 7, parameter2: 10
// 이번에는 parameter2에 별도로 값을 지정하지 않아
// 기본 값인 10이 출력 됨.

 

파라미터 라벨 지정

  • 파라미터 앞에 별도의 이름을 지정하여, 함수 내부에서 사용할 이름함수 호출 시 사용하는 이름을 다르게 할 수 있다.
  • 파라미터의 역할을 좀 더 명확하게 표현할 때 사용한다.
// 함수 내부에서는 friend, me 함수를 사용하고,
func greeting(to friend: String, from me: String) {
	print("Hello \(friend)! I'm \(me)")
}

// 함수 호출 시에는 파라미터 라벨인 to, from을 사용해야 한다.
greeting(to: "jaehyuk", from: "nyebo")
// Hello jaehyuk! I'm nyebo

 

함수 호출 시 파라미터 생략

  • 함수를 호출 할 때, 파라미터명: 값으로 파라미터를 지정했는데 이를 생략할 수도 있다.
  • 파라미터명을 생략 할 경우에는, 함수 호출 시 파라미터 순서대로 값을 입력해야 한다.
// 파라미터 앞에 _를 붙이면, 함수 호출 시 해당 파라미터명을 생략할 수 있다.
func greeting(_ friend: String, me: String) {
	print("Hello \(friend)! I'm \(me)")
}

// _ 를 붙인 friend 파라미터는 생략하고 값을 입력할 수 있다.
greeting("jaehyuk", me: "nyebo")
// Hello jaehyuk! I'm nyebo


// 만약 파라미터를 전부 생략하면,
// 함수 호출 시에는 파라미터 순서대로 값을 입력해야 한다.
func greeting(_ friend: String, _ me: String) {
	print("friend: \(friend), me: \(me)")
}

greeting("jaehyuk", "nyebo")
// friend: jaehyuk, me: nyebo

// 순서를 바꿔서 호출 하면, 바뀐 순서대로 출력된다.
greeting("nyebo", "jaehyuk")
// friend: nyebo, me: jaehyuk

 

가변 파라미터 지정

  • 전달 받을 파라미터의 개수를 알 수 없을 때에 가변 파라미터를 지정할 수 있다.
  • 가변 파라미터는 함수 당 하나만 지정할 수 있다.
  • 기본 파라미터 값과 마찬가지로 파라미터 목록 맨 뒤에 위치하는 것이 좋다.
// 가변 파라미터는 타입에 ...을 붙여서 표현한다.
func sayHello(me: String, friends: String...) {
	print("Hello \(friends)! I'm \(me)")
}

sayHello(me: "nyebo", friends: "jaehyuk", "minjeong")
// Hello ["jaehyuk", "minjeong"]! I'm nyebo

 

함수 타입의 사용

  • 스위프트는 함수형 프로그래밍을 포함하기 때문에, 함수를 객체로 활용할 수 있다.
  • 따라서 함수를 변수, 상수 등에 할당 할 수 있고, 이를 파라미터를 통해 전달할 수도 있다. 
// add 함수 생성
func add(a: Int, b: Int) -> Int {
    return a + b
}

// add 함수를 변수로 정의
// someAdd 변수는 add 함수의 파라미터와 반환 값이 동일하기 때문에
// add 함수가 변수로 할당 될 수 있다.
// 만약 타입이 다르다면, 함수를 변수로 할당 할 수 없다.
var someAdd: (Int, Int) -> Int = add

// someAdd 변수에 파라미터 값 3, 4를 넣으면
// 이 파라미터가 add 함수로 전달되고,
// add 함수의 반환 값이 결과로 출력된다.
print(someAdd(3, 4))
// 7

 

위에서 언급한 함수 이외에도 다양한 함수 활용법이 존재한다.
The Swift Language Guide (한국어)의 함수 편 참고.
 

함수 (Functions)

 

jusung.gitbook.io

 

 

제어문

조건문

스위프트의 조건문에는 if-else, switch 등이 있다.

 

1. if-else 문

  • if만 단독으로 사용하거나, else, else if와 조합하여 사용할 수도 있다.
  • 조건에는 항상 true, false가 되는 bool 타입의 값만 사용해야 한다.
// 기본 형태
if (조건) {
  /* 실행 */
} else if {
  /* 실행 */
} else {
  /* 실행 */
}


// 사용 예
let someInt = 100

if (someInt < 100) {
	print("100 미만")
} else if (someInt > 100) {
	print("100 초과")
} else {
	print("100")
}

 

2. switch 문

  • 스위프트의 switch 문은 다양한 패턴과 응용이 가능하다.
  • 명시적으로 break를 입력하지 않아도 자동으로 case마다 break 된다.
  • fallthrough를 사용하여 break를 무시하고 진행할 수 있다.
  • case에 여러 패턴을 사용할 수 있다.
// 기본 형태
switch 비교값 {
case 패턴1:
	/* 실행 */
case 패턴2:
	/* 실행 */
default:
	/* 실행 */
}

// 사용 예
let someInt = 100
switch someInt {
case 0:
    print("zero")
case 1..<100:  // 인터벌 매칭, 숫자의 특정 범위를 조건으로 사용할 수 있다.
    print("1~99")
case 100:
    print("100")
case 101...Int.max:
    print("over 100")
default:
    print("unknown")
}

 

반복문

스위프트의 반복문에는 for-in, while, repeat-while 등이 있다.

 

1. for-in 문

  • 배열, 숫자, 문자열을 순서대로 순회(iterate)할 수 있다.
  • 딕셔너리를 순회할 때에는 key: value 쌍으로 구성된 튜플을 순회한다.
// 기본 형태
let items = ["a", "b", "c", "d"]
for item in items {
	print(item)
}
// a
// b
// c
// d

// 딕셔너리 순회
let numberOfLegs = ["거미": 8, "개미": 6, "고양이": 4]
for (animalName, legCount) in numberOfLegs {
    print("\(animalName)는 다리가 \(legCount)개 입니다.")
}
// 거미는 다리가 8개 입니다.
// 고양이는 다리가 4개 입니다.
// 개미는 다리가 6개 입니다.

 

2. while 문

  • 조건이 거짓이 될 때까지 구문을 반복한다.
// 기본 형태
while 조건 {
	/* 실행 */
}

// 사용 예

var count = 0
while count < 5 {
    count += 1
    print(count)
}

// 1
// 2
// 3
// 4
// 5

 

3. repeat-while 문

  • 구문을 최소 한 번 이상 실행하고, 조건이 거짓이 될 때까지 반복
  • 다른 언어의 do-while 문과 유사
// 기본 형태
repeat {
	/* 실행 */
} while 조건

// 사용 예
var count = 1
repeat {
    print("반복문을 \(count)번 실행합니다. ")
    count += 1
} while count < 0
// 반복문을 1번 실행합니다. 

 

 

옵셔널

  • 스위프트에서 중요한 개념 중 하나인 옵셔널(Optional)은, 사용자가 의도하지 않는 상황을 최소화하여 안전한 코딩을 하기 위해 사용한다.
  • 예를 들어, 일반적인 Int 변수를 선언한 경우, 이 변수에 값이 없다면(nil이 할당 된다면) 에러가 발생한다.
  • 반면, 옵셔널 Int 변수를 선언한 경우, nil이 할당될 수 있기 때문에 에러가 발생하지 않는다.
    • 이 경우, nil이 들어온 경우를 조건문으로 제어할 수 있다.
// 1. Int 변수에 nil이 들어간 경우
var value: Int = nil
// 변수 할당 오류 발생
// 'nil' cannot initialize specified type 'Int'


// 2. 옵셔널 Int 변수에 값이 있는 경우
var value: Int? = 100

switch value {
case .none:
    print("This Optional variable is nil")
case .some(let value):
    print("Value is \(value)")
}

// 해당 값이 출력 됨
// Value is 100


// 3. 옵셔널 Int 변수에 값이 없는 경우
var value: Int? = nil

switch value {
case .none:
    print("This Optional variable is nil")
case .some(let value):
    print("Value is \(value)")
}

// 값이 없는 경우를 제어할 수 있다.
// This Optional variable is nil

 

옵셔널 추출

옵셔널의 값을 사용하기 위해 꺼내오는 방법

 

옵셔널 바인딩

  • nil 체크 + 안전한 값 추출
  • 옵셔널(변수) 안에 값이 있는지 확인하고, 있으면 값을 꺼내옴
    • 값이 없으면 오류 발생 없이, 실행만 되지 않는다.
  • if-let 방식으로 값 추출
var myName: String? = "nyebo"
var yourName: String? = nil

// 콤마(,)를 사용해 한 번에 여러 옵셔널을 바인딩할 수 있다.
if let name = myName, let friend = yourName {
	print("\(name) and \(friend)")
}
// yourNmae이 nil이기 때문에 해당 구문은 실행되지 않는다.
// 오류 발생 없음.


// yourName에 값 할당
yourName = "jaehyuk"

// 다시 실행해보면 정상적으로 값 출력 됨.
if let name = myName, let friend = yourName {
	print("\(name) and \(friend)")
}
// nyebo and jaehyuk

 

옵셔널 강제 추출

  • 바인딩과는 다르게 강제로 값을 추출한다.
  • 강제 추출 시에는 값이 없으면(nil) 런타입 오류가 발생한다.
  • 강제 추출은 가능한 사용하지 않는 것이 좋다.
var myName: String? = "nyebo"

// 느낌표(!)로 강제 추출 할 수 있다.
// 현재는 myName에 값이 있어서 정상적으로 출력 됨.
print(myName!)
// nyebo

// myName에 nil을 할당하면,
myName = nil

// 런타임 오류 발생
print(myName!)
// Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기