-
안녕하세요. 그린입니다!
이번 포스팅에서는 스위프트에서의 함수에 대해 알아보도록 하겠습니다.
코딩을 하며 가장 많이 접하고 생성하게되는것이 함수입니다.
함수는 대부분의 작업의 가장 작은 단위이자 하나의 작은 프로그램입니다.
스위프트에서 함수는 일급 객체이기 때문에 하나의 값으로도 사용할 수 잇습니다.
자 그럼 이렇게 중요한 함수에 대해 이제 알아보도록 하죠!!
1. 함수와 메서드
기본적으로 둘은 동일합니다. 다만 상황이나 위치에 따라 다른 용어로 부릅니다.
-. 함수 : 모듈 전체에서 전역적으로 사용할 수 있는 함수
-. 메서드 : 구조체,클래스,열거형 등 특정 타입에 연관되어 사용하는 함수
2. 함수의 정의와 호출
-. 소괄호()를 생략 할 수 없습니다.
-. 재정의(오버라이드)와 중복정의(오버로드)를 모두 지원합니다.
-. 매개변수의 타입이나 개수가 다르면 같은 이름의 함수를 여러 개 생성 가능합니다.
-. 정의 방법 : 함수이름 + 매개변수(parameter,파라미터) + 반환타입(return type)
-. 함수 정의 키워드 : func 함수이름(매개변수...) -> 반환타입 {
실행구문
return 반환 값 }
-. return 키워드를 생략할 수 있습니다. (코드가 단 한줄의 표현이고, 결괏값의 타입이 함수의 반환 타입과 일치할 경우)
-. 매개변수 : 외부로부터 받아들이는 전달 값의 이름
-. 전달인자(argument) : 함수를 실제로 호출할 때 전달하는 값
2-1. 매개변수
매개변수에 따라서 함수의 모양과 기능이 다양함으로 어떻게 달라지는지 살펴보겠습니다.
-. 매개변수가 없는 함수
매개변수 위치를 공란으로 둡니다.
-. 매개변수가 여러개인 함수
쉼표(,)로 매개변수를 구분
매개변수 이름을 붙여주고 콜론(:)을 적어줌
호출 시 매개변수에 붙이는 이름 : 매개변수 이름(Parameter Name)
-. 매개변수 이름과 전달인자 레이블
위 코드에서 myName과 yourName이 매개변수 이름(Parameter Name)
전달인자 레이블(Argument Label) 지정 방법
func 함수이름(전달인자 레이블 매개변수 이름: 매개변수 타입, 전달인자 레이블 매개변수 이름: 매개변수 타입 ...) -> 반환타입 { }
위와 같이 매개변수 이름 앞 from / to라는 전달인자 레이블을 통해 함수를 생성한 뒤 함수 호출 시 전달인자 레이블을 통해 호출합니다.
매개변수 이름이 비슷하거나 헷갈리기 좋을때 좀더 구분되게 사용하기 좋습니다.
-.와일드카드 식별자(_)
전달인자 레이블을 사용하고 싶지 않을때 사용합니다.
위와 같이 더 편리하고 간단하게 함수를 호출 할 수 있습니다.
전달인자 레이블을 변경하면 함수의 이름 자체가 변경됩니다. 전달인자 레이블만 다르게 써주더라도 함수 중복 정의(오버로드)로 동작됨.
-. 매개변수 기본값
매개변수마다 기본값을 지정할 수 있습니다.
기본값이 없는 매개변수를 기본값이 있는 매개변수 앞에 사용하는것이 중요합니다.
-. print 함수 원형
public func print(_items: Swift.Any..., separator: String = default, terminator: String = defalut)
-. terminator : 줄바꿈 문자(\n)
-. separator : 공백 띄어쓰기
-.가변 매개변수와 입출력 매개변수
가변 매개변수는 매개변수로 몇개의 값이 들어올지 모를때 사용합니다.
0개 이상(0개 포함)의 값을 받아올 수 있으며 들어온 인자 값은 배열처럼 사용됩니다. 함수마다 가변 매개변수는 하나만 가질 수 있습니다.
입출력 매개변수의 전달순서
1) 함수를 호출 시, 전달인자의 값을 복사
2) 해당 전달인자의 값을 변경하면 1)에서 복사한 것을 함수 내부에서 변경
3) 함수를 반환하는 시점에 2에서 변경된 값을 원래의 매개변수에 할당
-. 참조는 inout 매개변수로 전달될 변수 또는 상수 앞에 앰퍼샌드(&)를 붙여서 사용합니다. (참조 표현)
3. 반환이 없는 함수
반환 값이 없는 함수도 생성 가능합니다. 반환 타입을 '없음'을 의미하는 Void를 붙여도 되고 아예 생략 할 수 있습니다.
4. 데이터 타입으로서의 함수
함수는 하나의 데이터 타입으로 사용할 수 있습니다.
(매개변수 타입의 나열) -> 반환 타입
[같은 표현식]
-. (Void) -> Void
-. () -> Void
-. () -> ()
5. 함수의 축약 표현
아래와 같이 함수를 축약하여 자주 사용합니다.
say(name: String, times: Int) -> String ---> say(name:times:)
6. 중첩함수
데이터 타입의 중첩이 자유롭습니다.
클래스 안에 또 다른 클래스가 들어올 수 있는 등 다양한 패턴을 자유롭게 만들어 사용할 수 있습니다.
7. 종료되지 않는 함수
정상적으로 끝나지 않는 함수라는 뜻으로 비반환 함수(Nonreturning function) 혹은 비반환 메서드(Nonreturning Method)라 합니다.
어디서든 호출이 가능하고 guard 구문의 else 블록에서도 호출 할 수 있습니다.
반환타입은 Never라 명시합니다.
오류를 던지거나 보고하는 일을 하고 프로세스를 종료할 때 사용됩니다.
-.fatalError 함수를 사용하여 구현해줍니다.
8. 반환 값을 무시할 수 있는 함수
함수의 반환 값이 꼭 필요하지 않는 경우 의도적으로 반환 값 사용하지 않을 시 컴파일 경고가 되지 않도록 함수의
반환값을 무시해도 된다는 @discardableResult 선언으로 사용됩니다.
이처럼 이번 포스팅에서는 다양한 함수의 종류와 특징들에 대해 알아보며 선언과 생성 그리고 호출하여 동작하는 결과까지 학습했습니다.
어떻게 보면 이전 포스팅까지는 기본 개념이기에 다소 쉽게 느껴졌지만 이번 포스팅 부터는 본격적인 코딩을 위한 학습이 이루어지며
다소 어렵게 느껴지실 수도 있습니다.
그렇지만 한걸음 한걸음 차근차근 학습하며 나아간다면 분명 좋은 코딩 실력으로 보상받을 겁니다.
참고로, 포스팅을 하며 학습에 참고하는 교재는 한빛미디어 출간의 스위프트 프로그래밍 3판 (야곰 지음)을 사용하였습니다.
보다 전문적인 코딩을 위해 기초가 잘 다져있는 교재인것 같아 선택하였습니다.
다음 포스팅에서는 스위프트 특징 중 중요한 안정성을 잘 표현해줄 수 있는 옵셔널(Optionals)에 대해 알아보겠습니다.
감사합니다!
'Swift' 카테고리의 다른 글
옵셔널 (0) 2020.11.03 특수 기호와 문자 읽는법 (0) 2020.11.02 흐름제어 (0) 2020.11.01 연산자 (0) 2020.11.01 데이터 타입 (고급) (0) 2020.10.30