본문 바로가기

전공/swift

swift (5) - Function, Optional

1. 함수 Functions
(1) 함수 정의하고 호출하기
func 키워드를 앞에 붙여 함수를 정의한다.
괄호 안에는 사용자로부터 입력 받아 함수 내에서 쓰일 파라미터의 이름과 타입을 지정하고,
반환 화살표 -> 뒤에는 반환 타입을 표기하여 함수의 반환 타입을 지정해준다. 
 
(예시)
func greet(person: String) -> String {
        let greeting = "Hello, " + person
        return greeting
}
print(greet(person: "alswn") )
// Hello, alswn 출력. greet 함수는 String 타입을 입력 받아 person 으로 사용한다. 
함수의 반환 타입은 String 이다.
 
(2) 변수

  • 파라미터가 없는 함수     
    func sayHelloWorld() -> String {
           return "hello, world!"
    }
    print(sayHelloWorld())
    // 입력 받는 파라미터가 없더라도 함수의 이름 뒤에는 소괄호가 필요하다.
    함수 호출 시에도 빈 소괄호를 붙여줘야 한다. 

  • 여러 개의 파라미터가 있는 함수
    func greet(person: String, man: Bool) -> String {
          if man {
                return person + " is man."
          } else {
                return person + "is woman."
          }
    }
    print(greet(person: "alswn", man: false))
    // alswn is woman. 출력
    함수의 소괄호 내에 콤마로 구분하여 여러 개의 입력 파라미터를 가질 수 있다. 

(3) 반환값

  • 반환값이 없는 함수
    func greet(person: String) {
             print("Hello, \(person)!")
    }
    greet(person: "alswn")
    // Hello, alswn! 출력. 반환값이 없기 때문에 return 과 반환 화살표 -> 를 포함하지 않는다. 

  • 암시적 반환값이 있는 함수
    func greeting(person: String) -> String {
          "Hello, " + person + "!" 
    }
    print(greeting(person: "alswn"))
    // Hello, alswn! 출력. 함수 몸체가 여러 줄로 이루어져 있을 때에는 반환값을 return 을 사용하여 명시해야 하지만,
    함수 몸체가 한 줄로 이루어져 있다면 반환값 앞에서 return 생략이 가능하다.

 
(4) Argument Lables and Parameter Name (전달인자 레이블과 파라미터 네임)
파라미터 네임은 함수의 정의에서, 전달인자 레이블은 함수의 호출에서 사용하는 호칭이다. 
모든 함수의 파라미터(매개변수)는 파라미터 네임과 전달인자 레이블을 갖고 있다. 
기본적으로, 매개변수들은 파라미터 네임을 전달인자 레이블로 사용한다.
 
(예시) - 전달인자 레이블 / 파라미터 네임 -> 파라미터 네임과 전달인자 레이블을 일치시킨 경우
func greeting(to: String, from: String) {
            print("안녕, \(to)야! 나는 \(from)이야.)
}
greeting(to: tjdgns, from: alswn)
// 안녕, tjdgns아! 나는 alswn이야. 출력
 
(예시) - 전달인자 레이블 / 파라미터 네임 -> 전달인자 레이블을 따로 작성해준 경우
func greet(name person: String, from hometown: String) -> String {
           return "Hello \(person)! Glad you could visit from \(hometown)."
}
print(greet(name: alswn, from: house))
// Hello, alswn! Glad you could visit from house. 출력

전달인자 레이블은 함수의 의도를 명확하게 나타내고 가독성을 높이는데에 도움을 준다. 
 
(예시) - 전달인자 레이블 / 파라미터 네임 -> 전달인자 레이블을 원치 않는 경우
func greet( _ person: String) -> String {
         return "Hello, \(person)."
}
print(greet("alswn"))
// Hello, alswn. 출력. 함수 호출 시에 전달 인자 레이블을 사용하지 않는다.


(5) 파라미터의 기본값
func greet(name person: String = "alswn") -> String { 
        return "Hello, \(person)"
}
print(greet())
print(greet(name: "tjdgns"))
// 차례로 Hello, alswn. 과 Hello, tjdgns. 를 출력한다.
기본값이 정의되어 있다면 함수를 호출할 때 파라미터를 생략할 수 있다. 
(기본값이 정의되어 있지 않을 때 파라미터 없이 함수를 호출할 수 없다.) 

 
 
 
 
2. Closures (익명 함수)
이름 없이 생성되는 함수.
funtion은 clousure에 이름이 붙은 특이 케이스라고 볼 수 있다. (넓은 의미에서 funtion은 closurea다)
{ (함수 파라미터) -> return 타입 in 
               ~~~~~~~~~~~~~~~
}
 
(예시) 
var numbers = [1, 2, 3, 4]
var numbersTwo= numbers.map( { (number: Int) -> Int in 
        let result = 3 * number
        return result
})
for n in numbers{
        print(n)
} // 1, 2, 3, 4 출력
for n in numbersTwo {
        print(n)
} // 3, 6, 9, 12 출력
.map -> 뒤 소괄호에 closure가 온다. 앞 array 등등의 각 아이템에 closure을 적용한 뒤 만들어진 새로운 array를 반환한다. 
.map 이 numbers 을 바꾸는 것이 아니다 !! return 값이 array로 존재하기 때문에 따로 변수 선언을 해줘야 한다. 
 
 
 
3. Optionals (옵셔널) - 값이 존재하지 않는 상황에서 사용한다

  • 옵셔널 내에 값이 존재하는 경우 -> 포장지를 벗겨서 해당 값에 접근한다
  • 옵셔널 내에 값이 존재하지 않는 경우 (nil)


(예시)
let number = "alswn"
let x = Int(number)
print(x) // nil 출력.
 
let number = "123"
let x = Int(number)
print(x) // Optional(123) 출력

해당 예시와 같이 초기화가 실패하는 경우(애초에 정수 타입으로 바꿀 수 없는 값이 number에 들어가 있음)를 대비하여 2번째 라인 Int는 진짜 Int가 아닌 옵셔널 Int를 반환한다. 

(1) 옵셔널 타입의 정의
var a : Int? = 3    // optional Int 타입인 a에 실제값인 3이 들어있음
a = nil                  // 이제 a에는 아무것도 들어있지 않음 (nil)
var b : String?    // optional String 타입인 b. 기본값 없이 정의되었으므로 b는 자동적으로 nil로 설정됨
 
(2) 옵셔널 타입의 출력 
var a : Int? = 3
if a != nil {
      print("a에는 정수 값이 들어있습니다. 해당 정수는 \(a!) 입니다.")
}
// 옵셔널 타입의 변수가 값을 가지고 있다고 확실시될 때,
느낌표 ! 표시를 변수 이름 뒤에 붙여서 포장지를 벗겨내어 안에 있는 실제값에 접근할 수 있다. 
if 문을 통해 해당하는 옵셔널이 값을 가지는지 안 가지는지 판단하는 과정이 필요하다.