티스토리 뷰



스위프트의 함수는 오버라이드와 오버로드를 모두 지원합니다.


먼저 오버로딩이란

- 같은 이름의 함수를 여러 개 정의하고 매개변수를 다르게 해 다양한 유형에 호출에 응답 가능하게 합니다.

오버라이딩이란

- 상속 관계에 있는 클래스의 이미 정의된 메소드를 재정의 해 특정한 형태로 구현 가능합니다.



스위프트에서 매개변수의 타입이 다르면 같은 이름의 함수를 여러개 만들 수 있습니다.


또한 같은 이름의 함수여도 매개변수의 개수가 달라도 함수를 만들 수 있습니다.


위와 같은 방법은 매개변수 이름 (ex: naming , age) 지정해 함수를 선언했습니다. 


+ 스위프트에서는 매개변수 이름과 더불어 전달인자 레이블을 지정해줄 수 있습니다. 


보통의 경우는 위와 같이 매개변수의 이름을 전달인자 레이블과 같은 이름으로 사용합니다. hello(naming: ) -> hello(naming name: )


하지만 전달인자 레이블을 별도로 지정 가능하며 장점은 매개변수의 역할을 좀 더 명확히 할 수 있는 장점을 가집니다.





Q. 스위프트 오버로드를 하다가 전달인자 레이블을 사용하는 경우 매개변수 이름은 함수의 이름에 포함되는지 궁금했습니다.


A. 전달인자 레이블을 사용하는 경우 매개변수 이름은 함수의 이름에 포함되지 않기 때문에 매개변수 이름만 바꿔서 중복 정의 할 수 없습니다.



A결론의 과정


1)



위 두 함수는 hello(name: )인 함수를 사용하기 때문에 아래에서 선언한 함수에서 에러를 발생합니다. 


당연히 에러를 발생하겠죠.


똑같은 함수명을 사용하고 있기 때문에 에러 내용은 Invalid redeclaration of hello(name:)으로 hello(name:)의 잘못된 재선언 때문에 에러를 발생하게 됩니다.


2)



하나는 hello(name: )을 그대로 두고 hello(name hi: )로 전달인자 레이블을 name으로 주고 매개변수를 hi로 선언해보았는데 에러를 발생합니다.


똑같은 함수명을 사용하고 있기 때문에 에러 내용은 Invalid redeclaration of hello(name:)으로 hello(name:)의 잘못된 재선언 때문에 에러를 발생하게 됩니다.


두개 모두 hello(name:) 이라는 함수명을 사용하기 때문에 위와 똑같은 에러를 발생시킵니다.



3) 



하나는 hello(name bye: ) 하나는 hello(name hi: )로 전달인자 레이블은 같은 값으로 매개변수는 hi, bye다른 값으로 주었습니다.


하지만 이또한 위와 같은 에러를 발생시키고 있습니다.



* 즉 전달인자 레이블을 사용하는 경우 매개변수 이름은 함수의 이름에 포함되지 않기 때문에 매개변수 이름만 바꿔서 중복 정의 할 수 없습니다.



+ 전달인자 레이블이 없는 경우와  있는 경우

 


전달인자 레이블을 없는 경우를 살펴보면 위의 함수명은 hello(name:)이고 아래 함수명은 hello(hi:)입니다.


서로 다른 함수명이라고 판단해 에러를 발생시키지 않습니다.


* 전달인자 레이블을 변경하면 함수의 이름 자체가 변경되기 때문에 함수 중복 정의가 가능합니다.

'Tech > Swift' 카테고리의 다른 글

Swift functions abs,assert,assertionFailure  (0) 2019.03.07
Swift - Array shuffle()  (2) 2019.02.13
스위프트 removeAll과 filter비교  (0) 2019.01.10
스위프트 zip 사용하기  (0) 2019.01.02
스위프트 map , forEach  (0) 2018.12.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함