본문 바로가기
프로그래밍/Swift

Swift - 함수

by Mr-후 2017. 11. 8.
반응형

Swift - 함수 


지난 주, 금요일 불현듯 Swift공부를 해볼까? 하는 생각이 떠 올라 그 바람에 바로 예스24를 통해 Swift책을 구입하게 되었다. 책은 '야곰' 이라는 분이 집필을 한 책인데 iOS를 Swift로 개발하는 책이 아니고, 그냥 Swift라는 언어에 대한 문법 공부를 위한 책인데, 서평도 좋은 편이고 사전 리뷰어들의 칭찬도 많이 있어 나름 기대 되는 책이라 판단 되어 구입을 했다. 생각보다 책은 저렴한 편이었다. 

월요일부터 오늘까지 3일째, 노트북위에 펼쳐 놓고 시간이 날때마다 한 장 한 장 읽으면서 넘기는데 느낌은 좋다. 우선 그런 느낌이 든 이유는 내가 이미 iOS개발을 하고 있는 현업 개발자라 그런 것 같다. 처음 프로그래밍을 접하는 사람이라면 어려울 수도 있을 것 같다는 생각이 들었다. 

어쨌튼 내 입장에서는 읽기 많이 어렵지는 않지만 어느 정도 이해를 할 수 있을 것 같아 희망을 가지고 책을 읽고 있다. 데이터 타입이나 조건문, 변수 등에 대한 내용은 이미 읽었지만 따로 정리를 할 필요성은 느끼지 못했는데 함수에 대한 부분은 책 초입에서 함수형 프로그래밍 패러다임이라고 하면서 설명하는 부분을 보니 잘 이해가 되지 않는 부분이 있어 7장 함수 부분에 대해서는 읽고 이해한 대로 정리를 좀 해보고자 블로그에 Swift카테고리를 개설 하고 첫 글을 작성한다. 


함수란 하나의 값으로도 사용되고 특정 기능을 기술하는 역할을 하며, 함수가 모여 하나의 프로그램이 되기도 하는 단위로 이해하면 된다. (메서드와 동일한 개념) 

스위프트에서 함수를 정의 하는 방법과 특징은 

다른 문법과 달리 소괄호( () )를 생략할 수 없으며, 재정의(오버라이드)와 중복정의(오버로드)가 모두 지원된다.
따라서 매개변수, 반환 타입이 다를 경우 다른 함수로 정의 되며 사용될 수 있다. 


함수 정의 키워드는 func  

func 함수명 (매개변수....) -> 반환 타입 { 

    //코드 

    return 반환값 


실제 책에 있는 예제를 코딩으로 옮겨 보았다. 이해가 쏙쏙 

import UIKit

func hello(name: String) -> String {

    return "Hello \(name)!";

}


let helloYoung: String = hello(name: "younghu");

print(helloYoung);

Hello younghu!


나의 경우 ;(세미콜론)을 붙히는게 익숙해서 붙히는 버릇을 들이고 있는데 Swift에서는 없어도 된다. 가독성이 떨어지는 것 같아서 난 아마도 계속 붙혀서 사용하지 싶다. 



다음은 매개변수가 없는 함수와 매개변수가 여러개인 함수에 대해 알아보자. 

Swift에서 매개변수가 필요 없을 경우 매개변수 위치는 공란으로 비워두면 된다. 

func helloYounghu() -> String {

    return "Hello Younghu~"

}

print (helloYounghu()); //Hello Younghu~


반면, 매개변수가 여러개 일때는 쉼표( , )로 구분해서 추가할 수 있다. 
중요 : 함수 호출 시, 매개변수 이름을 붙혀 주고 콜론( : )을 적어준 후 전달인자를 보내주어야 한다.  
함수 호출시 매개변수에 붙이는 이름을 매개변수 이름(Parameter Name)이라고 한다. 

func sayHello(myName: String, yourName: String) -> String {

    var message: String = String();

    message = "Hello " + yourName + "! I'm " + myName;

    return message;

}

print(sayHello(myName: "chunhwa oh", yourName: "younghu min"));


여기까진 문법만 약간 다를 뿐 다른 언어와 별반 차이를 모르겠다. ㅋ



다음은 매개변수 이름과 전달인자 레이블에 대한 이야기이다. 

위에 myName과 yourName이라는 매개변수 이름(parameter name)을 사용했는데 매개변수의 이름과 더불어 레이블(Argument Label)을 지정해 줄 수 있다. 전달인자 레이블을 사용하려면 함수정의에서 매개변수 이름 앞에 한 칸을 뛰운 후 전달인자 레이블을 지정하면 된다. 

func 함수이름 (전달인자 레이블 매개변수 이름: 매개변수 타입, 전달인자 레이블 매개변수 이름: 매개변수 타입, ....) -> 반환타입 { 

    //코드 

    return 반환값

}

func sayHello(from myName:String, to name:String) -> String {

    return "Hello \(name)! I'm \(myName)"

}

print(sayHello(from: "younghu", to: "chunhwa"));


레이블을 이용해서 값을 전달할 때 명확하게 표현할 수 있는 장점이 있다.
함수 내부에서는 전달인자 레이블을 사용할 수 없고 함수 호출 시에 명시적으로 매개변수의 값이나 역할을 이해하는데 도움이 된다. 그런데 요즘 이렇게까지 친절하게 프로그래밍 잘 하지 않는다. 쩝! 
주석만 좀 달아 줘도 보는 사람이 수월할 텐데 흠... 


매개변수에는 기본값을 지정할 수 있다. 매개변수에 기본 값을 지정한 예제 코드. 

func sayHello(_ name: String, times: Int = 3) -> String {

    var result: String = "";

    

    for _ in 0..<times {

        result += "Hello \(name)!" + " \n";

    }

    

    return result;

}

print(sayHello("younghu"));

print(sayHello("chunhwa", times: 5));

default(기본) 값 지정이 가능하고 생략이 가능하다. 기본값과 상관 없이 중요한 매개변수는 앞쪽에 배치하는 것이 좋다고 한다. 

가변 매개변수와 입출력 매개 변수에 대해서는 따로 언급하지 않는다. 다음에 따로 정리를 해서 포스팅을 해보도록 하겠다. 


함수는 결과값을 반환하는 경우와 반환하지 않는 경우가 있다. 반환 값이 없는 함수라면 반환 타입을 '없음'의 의미하는 Void로 표기하거나 아예 타입 표현을 생략해도 된다. 즉 반환 타입이 Void이거나 생략되어 있다면 반환 값이 없는 함수이다. 

다음 예제 구문을 참고 하면 된다. 

func sayHelloWYounghu() {

    print("Hello, Younghu");

}

sayHelloWYounghu();


func sayHelloNoReturn(from myName: String, to name: String) {

    print("Hello \(name)! I'm \(myName)");

}

sayHelloNoReturn(from: "min younghu", to: "oh chun hwa");


func sayGoobye() -> Void {

    print("Good bye~");

}

sayGoobye();


그외, 데이터 타입으로서의 함수, 중첩함수, 종료되지 않는 함수 등에 대한 이야기가 있는데 이부분은 일단 이 포스팅에서는 생략한다. 업무 회의가 지속적으료 요청되는 바람에 제대로 학습이 안된 상태라 여기서 마무리. 


반응형