함수

Ios_Roy·2022년 3월 24일
0

TIL

목록 보기
7/11
post-thumbnail

3.22(화)

제가 이해하고 공부 한대로 작성한 내용이다 보니 , 정확한 정보가 아닐수도 있습니다
고쳐야 할 부분이 있다면 , 편하게 애기 해주시면 감사 하겠습니다🙏🏻

📖 함수

스위프트 언어에서의 함수는 일하는 코드의 묶음에 이름을 붙여둔 것이라고 생각해볼 수 있습니다. 어떤 함수는 결과값이 없기도 하고, 어떤 함수는 입력값이 없기도 하지만, 우선은 아주 기본적인 형태의 함수를 살펴봅시다.

수학에서의 함수는 f(x) = x + 2처럼 표현하죠. 여기서 x는 어떤 수를 입력해줄 변수 자리이고, f(x)는 x의 특정 값을 넣었을 때의 함수의 결과값, 즉, 함수의 출력이 되는 셈이지요.

프로그래밍에서 함수도 이와 유사합니다. 다만, 표현하는 방법이 조금 다릅니다.
프로그래밍의 함수에는 값을 전달(pass) 하면 일을 처리해서 반환(return) 한다고 표현합니다.
함수에 전달하는 값을 인수(argument) 라고 표현하고, 함수가 일을 마치고 출력하는 값을 반환 값(return value) 이라고 표현합니다.

스위프트 언어로 f(x) = x + 2라는 함수를 표현해본다면 아래의 코드로 표현해 볼 수 있습니다.
스위프트의 함수가 수학의 함수와 다른점 중에 하나를 꼽자면 이름을 갖는다는게 처음으로 눈에 들어오겠네요 😃

func plusTwo(x: Int) -> Int {
    return x + 2
}

❗️ 여기서 잠깐 - TIP ❗️
스위프트에서 숫자에 사용할 수 있는 기본 연산자
더하기, 빼기, 나누기, 곱하기 : +, -, /, *
나머지 구하기(Remainder) : %
a % b는 a를 b로 나눈 나머지를 뜻합니다
예) 3 % 2 => 1, 5 % 3 => 2, 10 % 3 => 1, 2 % 3 => 2

return 이라는 표현은 아직 생소하죠? return은 함수가 일을 마치고 돌려줄 결과값이 바로 뒤에 올 것이라는 뜻으로 반환 값이라고도 합니다.
이 plusTwo라는 이름의 함수는 전달받은 x 값에 2를 더하는 x + 2를 연산해서 return 해주는 기능을 하는 것이지요. 즉, x + 2의 연산 결과는 이 함수의 반환 값이 되겠습니다.

또, 수학의 함수와 다른점이 있다면 값을 전달할 x 변수와 결과가 될 f(x)는 어떤 종류의 수인지 표현하지 않지만 프로그래밍에서는 x에는 어떤 종류의 데이터가 들어와야 하는지, 결과가 될 f(x)는 어떤 종류의 데이터가 들어와야 하는지 꼭 표시해줘야합니다. 위의 코드에서 Int라는 타입을 표시하고 있는데 Int는 정수 타입으로, 정수의 값이 들어올 수 있다는 의미입니다.

  • 이 데이터의 종류를 타입이라고 하는데요, 타입에 대해서는 뒤에서 더 알아보도록 합시다 😃
  • 또 여기서, 인수(argument)가 전달될 자리는 매개변수(parameter) 라고 표현합니다. 괄호 안의 x를 말합니다.
  • 마지막으로 함수에게 일을 시키는 과정은 함수를 호출(call)한다고 표현합니다.

👉 매개변수 기본 값

매개변수에 기본적으로 전달될 값을 미리 지정할 수 있습니다. 기본값을 갖는 매개변수는 매개변수 목록 중에 뒤쪽에 위치하는 것이 좋습니다.

func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 = 매개변수 기본값 ...) -> 반환타입 {
    /* 함수 구현부 */
    return 반환값
}

func greeting(friend: String, me: String = "yagom") {
    print("Hello \(friend)! I'm \(me)")
}

// 매개변수 기본값을 가지는 매개변수는 호출시 생략할 수 있습니다
greeting(friend: "hana") // Hello hana! I'm yagom
greeting(friend: "john", me: "eric") // Hello john! I'm eric

👉 전달인자 레이블

함수를 호출할 때 함수 사용자의 입장에서 매개변수의 역할을 좀 더 명확하게 표현하고자 할 때 사용합니다.

func 함수이름(전달인자 레이블 매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입 ...) -> 반환타입 {
    /* 함수 구현부 */
    return
}

// 함수 내부에서 전달인자를 사용할 때에는 매개변수 이름을 사용합니다
func greeting(to friend: String, from me: String) {
    print("Hello \(friend)! I'm \(me)")
}

// 함수를 호출할 때에는 전달인자 레이블을 사용해야 합니다
greeting(to: "hana", from: "Roy") // Hello hana! I'm Roy

👉 가변 매개변수

전달 받을 값의 개수를 알기 어려울 때 사용할 수 있습니다. 스위프트 버전 5.4 미만에서는 함수당 하나의 가변 매개변수만 가질 수 있습니다. (5.4 버전부터 여러개 가능)

func 함수이름(매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입...) -> 반환타입 {
    /* 함수 구현부 */
    return
}

func sayHelloToFriends(me: String, friends: String...) -> String {
    return "Hello \(friends)! I'm \(me)!"
}
print(sayHelloToFriends(me: "Roy", friends: "hana", "eric", "wing"))
// Hello ["hana", "eric", "wing"]! I'm Roy!

print(sayHelloToFriends(me: "Roy"))
// Hello []! I'm Roy!

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

스위프트는 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임 언어이므로 스위프트의 함수는 일급객체입니다. 그래서 함수를 변수, 상수 등에 할당이 가능하고 매개변수를 통해 전달할 수도 있습니다.

✐ 함수의 타입표현

반환타입을 생략할 수 없습니다.
(매개변수1타입, 매개변수2타입 ...) -> 반환타입

✐ 함수타입 사용

var someFunction: (String, String) -> Void = greeting(to:from:)
someFunction("eric", "Roy") // Hello eric! I'm Roy

someFunction = greeting(friend:me:)
someFunction("eric", "Roy") // Hello eric! I'm Roy


// 타입이 다른 함수는 할당할 수 없습니다 - 컴파일 오류 발생
//someFunction = sayHelloToFriends(me: friends:)


func runAnother(function: (String, String) -> Void) {
    function("jenny", "mike")
}

// Hello jenny! I'm mike
runAnother(function: greeting(friend:me:))

// Hello jenny! I'm mike
runAnother(function: someFunction)

// 참고 : 스위프트의 전반적인 문법에서 띄어쓰기는 신경써야할 때가 많습니다

⛺️ 문제점 / 고민한 점 / 느낀점

  • 함수에 대해서 깊숙하게 이해를 했다 !
  • 집나간 개념을 찾아오고 있다
  • 모른는 개념을 조금더 집어가고 왜 라는 질문을 자주 던져 보자!!

⛺️ 참고 자료

profile
iOS 개발자 공부하는 Roy

0개의 댓글