Swift - 함수와 메서드

luminoux·2022년 6월 27일
0

Swift 문법

목록 보기
6/8
post-thumbnail

1 함수와 메서드

구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용하는 함수를 메서드라 부릅니다.
즉, 호칭이 달라질 뿐, 메서드 역시 함수입니다.


2 함수의 정의와 호출

함수에서는 소괄호 (())를 생략할 수 없습니다.
오버라이드와, 오버로드를 모두 지원합니다.
매개변수의 타입이 다르면 같은 이름의 함수를 여러 개 만들 수 있습니다.
매개변수의 개수가 달라도 같은 이름의 함수를 만들 수 있습니다.

func 함수이름(매개변수...) -> return Type {
	실행 구문
	return 반환 값
}

2.1 기본 형태의 함수 정의와 사용

func helloWorld(name: String) -> String {
    return "Hello\(name)!"
}

let helloLumi: String = helloWorld(name: "Lumi")
print(helloLumi)

2-2. 매개변수

매개변수가 없는 함수와 매개변수가 여러 개인 함수

1. 매개변수가 없는 함수

func helloWorld() -> String {
    return "Hello, world!"
}

print(helloWorld())

2. 매개변수가 여러개인 함수

매개변수가 여러개인 함수를 정의할 때는, 쉼표(,)로 매개변수를 구분합니다.

func sayHello(myName: String, yourName: String) -> String {
    return "Hello\(yourName)! , I'm \(myName)"
}

print(sayHello(myName: "Lumi", yourName: "Asher"))

전달인자 레이블

func 함수이름(전달인자레이블 매개변수이름: 매개변수타입) -> return Type {
	실행구문
	return 반환 값
}

앞서 코드에서 myName과 yourName이라는 매개변수 이름을 사용했습니다.
매개변수 이름과 더불어 전달인자 레이블을 지정해줄 수 있습니다.
전달인자 레이블을 별도로 지정하면 함수 외부에서 매개변수의 역할을 좀 더 명확히 할 수 있습니다.

func 함수이름(전달인자레이블 매개변수이름: 매개변수타입) -> return Type {
	실행구문
	return 반환 값
}

C언어와 자바 같은 기존 언어처럼 전달인자 레이블을 사용하고 싶지 않다면 와일드카드 식별자를 이용하세요

func sayHello(_ name: String, _ times: Int) -> String {
    var result = ""
    
    for _ in 0..<times {
        result += "Hello \(name)!" + " "
    }
    
    return result
}

print(sayHello("Lumi", 5))

매개변수 기본값

스위프트의 함수에서는 매개변수만다 기본값을 지정할 수 있습니다.
즉, 매개변수가 전달되지 않으면 기본값을 사용합니다.

func sayHello(_ name: String, _ times: Int = 3) -> String {
    var result = ""
    
    for _ in 0..<times {
        result += "Hello \(name)!" + " "
    }
    
    return result
}

print(sayHello("Lumi"))

가변 매개변수

매개변수로 몇개의 값이 들어올지 모를 때, 가변 매개변수를 사용할 수 있습니다.
가변 매개변수는 0개 이상의 값을 받아올 수 있으며, 0개도 포함합니다.
가변 매개변수로 들어온 인자 값은 배열처럼 사용할 수 있습니다.
함수 별로 가변 매개변수는 하나만 가질 수 있습니다.

func sayHelloToFriends(me: String, friends names: String...) -> String {
    var result: String = ""
    
    for friend in names {
        result += "hello \(friend)!" + " "
    }
    
    result += "I'm " + me + "!"
    return result
}

print(sayHelloToFriends(me: "Lumi", friends: "Asher", "Avery", "Charlie", "Kyu", "Youth"))

2.3 반환이 없는 함수

함수는 특정 연산을 실행한 후 결과를 반환합니다.
그러나 굳이 반환할 필요가 없는 경우가 있습니다.
만약, 반환 값이 없는 함수라면, 반환 타입을 '없음'을 의미하는 Void로 표기하거나
반환 타입 표현을 생략합니다. (보통 생략합니다.)

func printHello() {
    print("hello world")
}

printHello()

2.4 데이터 타입으로서의 함수

함수는 일급 객체입니다.
따라서, 하나의 데이터타입으로 사용할 수 있습니다.
즉, 각 함수는 매개변수 타입과 반환 타입으로 구성된 하나의 타입으로 사용(정의)할 수 있습니다.

// (매개변수 타입의 나열) -> 반환타입

func hello(name:String) -> String {
	return "hello \(name)!"
}

// hello 함수의 타입은 (String) -> String 입니다.

함수를 데이터 타입으로 사용할 수 있다는 것은,
함수를 전달인자로 받을 수도, 반환 값으로 돌려줄 수도 있다는 의미입니다.

typealias CaculateTwoInts = (Int, Int) -> Int
// 함수 데이터 타입을 지정해줍니다.

func addTwoInt(_ a: Int, _ b: Int) -> Int {
    return a + b
}

func multiplyTwoInt(_ a: Int, _ b: Int) -> Int {
    return a * b
}

var mathFunction: CaculateTwoInts = addTwoInt

print(mathFunction(2, 5))

mathFunction = multiplyTwoInt

print(mathFunction(2, 5))
typealias CaculateTwoInts = (Int, Int) -> Int
// 함수 데이터 타입을 지정해줍니다.

func addTwoInt(_ a: Int, _ b: Int) -> Int {
    return a + b
}

func multiplyTwoInt(_ a: Int, _ b: Int) -> Int {
    return a * b
}

func chooseMathFunction(_ toAdd: Bool) -> CaculateTwoInts {
    return toAdd ? addTwoInt : multiplyTwoInt 
}

print(chooseMathFunction(true)(3,5))

3 중첩 함수

스위프트는 데이터 타입의 중첩이 자유롭습니다.
함수의 중첩은 함수 안에 함수를 넣을 수 있다는 의미인데, 함수 안에 구현된 중첩함수는 상위 함수의 몸통 블록 내부에서만 함수를 사용할 수 있습니다.

func sayHello(myName: String, yourName: String) {
    
    func sayMyName(name: String) {
        print("Hello, I'm \(name)")
    }
    
    func helloTo(name: String) {
        print("Good moring \(name)~!")
    }
    
    sayMyName(name: myName)
    helloTo(name: yourName)
    
}

sayHello(myName: "Lumi", yourName: "Asher")

4 종료되지 않는 함수

스위프트에는 종료되지 않는 함수가 있습니다.
종료되지 않는다는 의미는 정상적으로 끝나지 않는 함수라는 뜻입니다.
이 함수를 실행하면 프로세스 동작은 끝났다고 볼 수 있습니다.

profile
Apple Developer Academy @ Postech 2022

0개의 댓글