You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
이번 챕터에선 제네릭 타입, 함수, 이니셜라이저의 매개 변수와 인수를 설명한다
제네릭 타입, 함수, 서브 스크립트, 이니셜라이저를 선언할 땐,
제네릭 타입, 함수, 이니셜라이저와 작업할 수 있는 타입 매개 변수를 지정한다
이러한 타입 매개 변수는 플레이스 홀더처럼 행동하며
제네릭 타입 인스턴스를 생성하거나 제네릭 함수 또는 이니셜라이저를 호출할 때 실제 고정 타입 인수로 교체한다
‘고정 타입 (concrete type)’, 프로그래밍에서 자신이 직접 인스턴스를 만들 수 있는 타입
‘추상 타입 (abstract type)’, 자신이 직접 인스턴스를 만들 수 없는 타입
제네릭 매개 변수 절(generic parameter clause)은 제네릭 타입 및 함수의 타입 매개 변수를,
해당 매개 변수와 결합된 어떤 제약 조건 및 요구 사항과도 나란히 지정한다
제네릭 매개 변수 절의 테두리는 꺾쇠 괄호 (<>) 이며 형식은 다음과 같다
제네릭 매개 변수 목록(generic parameter list)은 쉼표로 구분한 제네릭 매개 변수 목록으로 각각의 형식은 다음과 같다
type parameter: constraint
제네릭 매개 변수는 타입 매개 변수(type parameter)와 옵션인 그 뒤의 제약 조건(constraint)으로 구성된다
타입 매개 변수(type parameter)는 단순히 자리 표시용 타입, 예를 들어, T, U, V, Key, Value, 등의 이름이다
타입 매개 변수 및 그와 결합된 어떤 타입은 함수 또는 이니셜라이저 서명을 포함한 타입이나,
함수, 또는 이니셜라이저 선언의 나머지 부분에서 접근한다
제약 조건 (constraint)은 타입 매개 변수가 지정한 클래스를 상속하도록 또는 프로토콜이나 프로토콜 합성을 준수하도록 지정한다
예를 들어, 아래 제네릭 함수의 제네릭 매개변수인 T: Comparable 은
타입 매개 변수 T를 대신할 어떤 타입 인수든 반드시 Comparable 프로토콜을 준수해야 한다고 나타낸다
함수나 이니셜라이저의 ‘서명(signature)’은, 중복 정의(overload)한 함수에서 호출할 걸 찾기 위해 사용하며,
보통 함수 이름과 매개 변수 등을 합쳐서 구성된다
함수 서명(function signature)과 함수 선언(function declaration)의 차이점은 함수 서명의 경우 반환 타입을 포함하지 않는다
func simpleMax<T:Comparable>(_ x:T, _ y:T)->T{if x < y {return y
}return x
}
Int와 Double 은 둘 다 Comparable 프로토콜을 준수하기 때문에, 이 함수는 어느 쪽 타입 인수든 받을 수 있다
제네릭 타입과 달리 제네릭 함수나 이니셜라이저를 사용하는 쪽에서는 제네릭 인수 절을 지정하지 않는다
대신 함수나 이니셜라이저로 전달한 인수 타입으로 타입 인자를 추론한다
simpleMax(17,42) // T is inferred to be Int
simpleMax(3.14159,2.71828) // T is inferred to be Double
1) 제네릭 where 절
타입 매개 변수와 그의 associatedTypes에 추가 요구 사항을 지정하려면
타입이나 함수 본문을 여는 중괄호 바로 앞에 제네릭 where 절을 포함하면 된다
제네릭 where 절은 where 키워드와 그 뒤의 쉼표로 구분한 하나 이상의 요구 사항(requirements) 목록으로 구성된다
where requirements
제네릭 where 절의 요구 사항(requirements)은
타입 매개 변수가 클래스를 상속하거나 프로토콜 또는 프로토콜 합성을 준수하도록 지정한다
제네릭 where 절이 타입 매개 변수에 대한 단순한 제약 조건 표현의 수월한 구문을 제공하긴 하지만
ex. <T: Comparable> 과 같은 where T: Comparable 등
이를 사용하여 타입 매개 변수와 그 associatedTypes에 더 복잡한 제약 조건을 제공할 수도 있다
ex. 타입 매개 변수의 associatedTypes이 프로토콜을 준수하도록 구속할 수 있다
<S: Sequence> where S.Iterator.Element: Equatable 은 S가 Sequence 프로토콜을 준수하면서
그 associatedTypes인 S.Iterator.Element 는 Equatable 프로토콜을 준수하도록 지정한다
해당 제약 조건은 시퀀스의 각 원소가 동등 비교 가능하도록 보장한다
== 연산자로, 두 타입의 정체가 같다(identical)는 요구 사항을 나타낼 수도 있다
프로그래밍에서 ‘정체가 같다(identical)’ 는 건 ‘값이 똑같다 (equal)’ 보다 더 강한 개념으로
단순한 값을 넘어서 타입의 동일성을 체크하여 확인하는 것을 나타낸다
예를 들어, <S1: Sequence, S2: Sequence> where S1.Iterator.Element == S2.Iterator.Element 는
S1 과 S2 가 Sequence 프로토콜을 준수하면서 반드시 두 시퀀스의 요소는 모두 똑같은 타입이어야 한다는 제약 조건을 나타낸다
타입 매개 변수를 대체할 어떤 타입 인자든 반드시 타입 매개 변수에 있는 모든 제약 조건 및 요구 사항을 만족해야 한다
제네릭 where 절은 타입 매개 변수를 포함한 선언 부분이나,
타입 매개변수를 포함한 선언 안의 중첩 선언 부분에 나타날 수 있다
중첩 선언의 제네릭 where 절은 자신을 둘러싼 선언의 타입 매개 변수를 여전히 참조할 수 있으며
하지만, 그 where 절의 요구 사항은 이를 작성한 선언에만 적용된다
자신을 둘러싼 선언에도 where 절이 있으면, 두 절의 요구 사항을 모두 조합한다
아래 예제에서, startsWithZero() 는 Element 가 SomeProtocol 과 Numeric 을 둘 다 준수해야만 사용 가능하다
extensionCollectionwhere Element:SomeProtocol{func startsWithZero()->Boolwhere Element:Numeric{return first ==.zero
}}
제네릭 함수나 이니셜라이저를 중복 정의하려면
타입 매개 변수에 서로 다른 제약 조건, 요구 사항, 또는 둘 다를 제공하면 된다
중복 정의한 제네릭 함수나 이니셜라이저를 호출할 때,
컴파일러가 이러한 제약 조건을 사용하여 어느 중복 정의 함수나 이니셜라이저를 불러낼 건지 해결한다
제네릭 where 절에 대한 더 많은 정보와 제네릭 함수 선언에서의 사용 예를 보려면, Generic Where Clauses 페이지 부분을 보도록하자
제네릭 인수 절
제네릭 인수 절(generic argument clause)은 제네릭 타입의 타입 인수를 지정한다
제네릭 인수 절의 테두리는 꺾쇠 괄호 (<>) 이며 형식은 다음과 같다
제네릭 인수 목록(generic argument list)은 쉼표로 구분한 타입 인수 목록이다
타입 인수(type argument)는 실제 고정 타입의 이름으로
제네릭 타입의 제네릭 매개 변수 절 안에 있는 해당 타입 매개 변수를 교체한다
결과는 그 제네릭 타입의 특수화 버전이다
아래 예제는 스위프트 표준 라이브러리의 제네릭 딕셔너리 타입을 단순화 한 버전이다
제네릭 Dictionary 타입의 특수화 버전인 Dictionary<String, Int>는
Key: Hashable 과 Value 라는 제네릭 매개 변수를 String 과 Int 라는 고정 타입 인수로 교체하여 형성한다
각각의 타입 인수는 반드시 자신이 대체할 제네릭 매개 변수의 모든 제약 조건을 만족해야 하는데,
이는 일반화 where 절에서 지정한 어떤 추가 요구 사항도 포함된다
위 예제의 Key 타입 매개 변수는 Hashable 프로토콜을 준수하도록 구속하며
따라서 String 도 반드시 Hashable 프로토콜을 준수해야 한다
타입 매개 변수의 교체를 그 자체가 제네릭 타입의 특수화 버전인 타입 인수(적절한 제약 조건과 요구 사항을 만족한)로 할 수도 있다
ex. Array 의 Element 타입 매개 변수를
Array 라는 행렬의 특수화 버전으로 교체하면,
원소 그 자체가 정수 배열인 배열을 형성할 수 있다
이번 챕터에선 제네릭 타입, 함수, 이니셜라이저의 매개 변수와 인수를 설명한다
제네릭 타입, 함수, 서브 스크립트, 이니셜라이저를 선언할 땐,
제네릭 타입, 함수, 이니셜라이저와 작업할 수 있는 타입 매개 변수를 지정한다
이러한 타입 매개 변수는 플레이스 홀더처럼 행동하며
제네릭 타입 인스턴스를 생성하거나 제네릭 함수 또는 이니셜라이저를 호출할 때 실제 고정 타입 인수로 교체한다
스위프트 제네릭의 전체 개요에 대해선, Generics 페이지를 보도록하자
제네릭 매개 변수 절(Generic Parameter Clause)
제네릭 매개 변수 절(generic parameter clause)은 제네릭 타입 및 함수의 타입 매개 변수를,
해당 매개 변수와 결합된 어떤 제약 조건 및 요구 사항과도 나란히 지정한다
제네릭 매개 변수 절의 테두리는 꺾쇠 괄호 (<>) 이며 형식은 다음과 같다
제네릭 매개 변수 목록(generic parameter list)은 쉼표로 구분한 제네릭 매개 변수 목록으로 각각의 형식은 다음과 같다
제네릭 매개 변수는 타입 매개 변수(type parameter)와 옵션인 그 뒤의 제약 조건(constraint)으로 구성된다
타입 매개 변수(type parameter)는 단순히 자리 표시용 타입, 예를 들어, T, U, V, Key, Value, 등의 이름이다
타입 매개 변수 및 그와 결합된 어떤 타입은 함수 또는 이니셜라이저 서명을 포함한 타입이나,
함수, 또는 이니셜라이저 선언의 나머지 부분에서 접근한다
제약 조건 (constraint)은 타입 매개 변수가 지정한 클래스를 상속하도록 또는 프로토콜이나 프로토콜 합성을 준수하도록 지정한다
예를 들어, 아래 제네릭 함수의 제네릭 매개변수인 T: Comparable 은
타입 매개 변수 T를 대신할 어떤 타입 인수든 반드시 Comparable 프로토콜을 준수해야 한다고 나타낸다
함수나 이니셜라이저의 ‘서명(signature)’은, 중복 정의(overload)한 함수에서 호출할 걸 찾기 위해 사용하며,
보통 함수 이름과 매개 변수 등을 합쳐서 구성된다
함수 서명(function signature)과 함수 선언(function declaration)의 차이점은 함수 서명의 경우 반환 타입을 포함하지 않는다
Int와 Double 은 둘 다 Comparable 프로토콜을 준수하기 때문에, 이 함수는 어느 쪽 타입 인수든 받을 수 있다
제네릭 타입과 달리 제네릭 함수나 이니셜라이저를 사용하는 쪽에서는 제네릭 인수 절을 지정하지 않는다
대신 함수나 이니셜라이저로 전달한 인수 타입으로 타입 인자를 추론한다
1) 제네릭 where 절
타입 매개 변수와 그의 associatedTypes에 추가 요구 사항을 지정하려면
타입이나 함수 본문을 여는 중괄호 바로 앞에 제네릭 where 절을 포함하면 된다
제네릭 where 절은 where 키워드와 그 뒤의 쉼표로 구분한 하나 이상의 요구 사항(requirements) 목록으로 구성된다
제네릭 where 절의 요구 사항(requirements)은
타입 매개 변수가 클래스를 상속하거나 프로토콜 또는 프로토콜 합성을 준수하도록 지정한다
제네릭 where 절이 타입 매개 변수에 대한 단순한 제약 조건 표현의 수월한 구문을 제공하긴 하지만
ex. <T: Comparable> 과 같은 where T: Comparable 등
이를 사용하여 타입 매개 변수와 그 associatedTypes에 더 복잡한 제약 조건을 제공할 수도 있다
ex. 타입 매개 변수의 associatedTypes이 프로토콜을 준수하도록 구속할 수 있다
<S: Sequence> where S.Iterator.Element: Equatable 은 S가 Sequence 프로토콜을 준수하면서
그 associatedTypes인 S.Iterator.Element 는 Equatable 프로토콜을 준수하도록 지정한다
해당 제약 조건은 시퀀스의 각 원소가 동등 비교 가능하도록 보장한다
== 연산자로, 두 타입의 정체가 같다(identical)는 요구 사항을 나타낼 수도 있다
프로그래밍에서 ‘정체가 같다(identical)’ 는 건 ‘값이 똑같다 (equal)’ 보다 더 강한 개념으로
단순한 값을 넘어서 타입의 동일성을 체크하여 확인하는 것을 나타낸다
예를 들어, <S1: Sequence, S2: Sequence> where S1.Iterator.Element == S2.Iterator.Element 는
S1 과 S2 가 Sequence 프로토콜을 준수하면서 반드시 두 시퀀스의 요소는 모두 똑같은 타입이어야 한다는 제약 조건을 나타낸다
타입 매개 변수를 대체할 어떤 타입 인자든 반드시 타입 매개 변수에 있는 모든 제약 조건 및 요구 사항을 만족해야 한다
제네릭 where 절은 타입 매개 변수를 포함한 선언 부분이나,
타입 매개변수를 포함한 선언 안의 중첩 선언 부분에 나타날 수 있다
중첩 선언의 제네릭 where 절은 자신을 둘러싼 선언의 타입 매개 변수를 여전히 참조할 수 있으며
하지만, 그 where 절의 요구 사항은 이를 작성한 선언에만 적용된다
자신을 둘러싼 선언에도 where 절이 있으면, 두 절의 요구 사항을 모두 조합한다
아래 예제에서, startsWithZero() 는 Element 가 SomeProtocol 과 Numeric 을 둘 다 준수해야만 사용 가능하다
제네릭 함수나 이니셜라이저를 중복 정의하려면
타입 매개 변수에 서로 다른 제약 조건, 요구 사항, 또는 둘 다를 제공하면 된다
중복 정의한 제네릭 함수나 이니셜라이저를 호출할 때,
컴파일러가 이러한 제약 조건을 사용하여 어느 중복 정의 함수나 이니셜라이저를 불러낼 건지 해결한다
제네릭 where 절에 대한 더 많은 정보와 제네릭 함수 선언에서의 사용 예를 보려면, Generic Where Clauses 페이지 부분을 보도록하자
제네릭 인수 절
제네릭 인수 절(generic argument clause)은 제네릭 타입의 타입 인수를 지정한다
제네릭 인수 절의 테두리는 꺾쇠 괄호 (<>) 이며 형식은 다음과 같다
제네릭 인수 목록(generic argument list)은 쉼표로 구분한 타입 인수 목록이다
타입 인수(type argument)는 실제 고정 타입의 이름으로
제네릭 타입의 제네릭 매개 변수 절 안에 있는 해당 타입 매개 변수를 교체한다
결과는 그 제네릭 타입의 특수화 버전이다
아래 예제는 스위프트 표준 라이브러리의 제네릭 딕셔너리 타입을 단순화 한 버전이다
제네릭 Dictionary 타입의 특수화 버전인 Dictionary<String, Int>는
Key: Hashable 과 Value 라는 제네릭 매개 변수를 String 과 Int 라는 고정 타입 인수로 교체하여 형성한다
각각의 타입 인수는 반드시 자신이 대체할 제네릭 매개 변수의 모든 제약 조건을 만족해야 하는데,
이는 일반화 where 절에서 지정한 어떤 추가 요구 사항도 포함된다
위 예제의 Key 타입 매개 변수는 Hashable 프로토콜을 준수하도록 구속하며
따라서 String 도 반드시 Hashable 프로토콜을 준수해야 한다
타입 매개 변수의 교체를 그 자체가 제네릭 타입의 특수화 버전인 타입 인수(적절한 제약 조건과 요구 사항을 만족한)로 할 수도 있다
ex. Array 의 Element 타입 매개 변수를
Array 라는 행렬의 특수화 버전으로 교체하면,
원소 그 자체가 정수 배열인 배열을 형성할 수 있다
Generic Parameter Clause에서 언급한 것처럼,
제네릭 인수 절로 제네릭 함수나 이니셜라이저의 타입 인수를 지정하진 않는다
The text was updated successfully, but these errors were encountered: