→ 특정 조건일 때만 메서드를 사용할 수 있도록 하는 방법!
1) 제네릭 타입 정의
struct SortableBox<T> {
var items: [T]
}
2) 확장 시 조건 부여
extension SortableBox where T: Comparable {
mutating func sortItems() {
items.sort(by: <)
}
}
→ 타입 T가 Comparable을 준수하지 않으면 sortItems() 메소드는 보이지 않음
➡︎ 매우 다양하게 쓰일 수 있는 패턴으로 숙지하기!
튜터님이 보내주신 참고 블로그 읽어보기 - ValueTypes and Reference Types in Swift
값 타입 - 구조체, 열거형
: 연산이 실행되는 곳에 바로 저장
: 각 변수는 자체적인 데이터 복사본을 가지고 있어 변수가 연산될 때 다른 변수에 영향을 끼치지 않음
참조 타입 - 참조 타입
: 메모리 어딘가에 저장되며 저장된 주소를 참조
: 참조 타입의 변수는 같은 데이터를 가리킴
→ 한 변수의 연산은 같은 데이터를 가리키고 있는 다른 변수에 영향
참조 타입 : '정체성'을 대표함
→ 예) 손님, 학교 등등
⇒ 어떠한 객체를 의미하는 단어의 정의(분류 혹은 범주?) 같은 것으로 이해하였음
값 타입 : 값 그자체로 의미를 가지는 것으로 이해
→ 예) 위치
이해를 토대로 참조타입과 값 타입을 비교해보자면
일반적으로 클래스(참조 타입)는 heap에, 구조체(값 타입)는 stack에 저장
⇒ 컴파일 단계에서 stack에 할당됨
Int, Float, Double과 같은 원시타입
: 복사 시간은 O(1)으로 매우 빠름
→ CPU 레지스터에 저장되어 복사 시 램에 접근할 필요가 없기 때문
String, Array, Set, Dictionary와 같은 실존 타입(existential Type)
: copy-on-write 방식으로 복사
💡 지연 메소드
.lazy
지연 프로퍼티처럼 메소드도 사용 가능!let a = [1, 2, 3].lazy // a는 ~~Sequence 타입 .filter { $0 % 2 == 0 } .map { "\($0)" } for num in a { // 접근할 떄 .filter, .map을 계산 print(num) }접근을 많이 하지 않아도 되거나 필요한 경우라면 활용해도 좋을 듯
데이터를 직접 저장하지 않으므로 참조 카운트만 늘어남