클로저 (Closure)
- 일회용 함수를 작성할 수 있는 구문.
일회용 함수란 한 번만 사용할 구문들의 집합이면서, 형식은 함수로 작성되어야 하는 제약조건이 있을 때 만들어 사용할 수 있는 함수를 말함.
굳이 함수 이름을 작성할 필요가 없기 때문에 익명(Anonymous)함수라고 부르기도 함.
일급 객체 (First-Class Object)
- 객체가 런타임에도 생성이 가능해야 한다.
- 인자값으로 객체를 전달할 수 있어야 한다.
- 반환값으로 객체를 사용할 수 있어야 한다.
- 변수나 데이터 구조 안에 저장할 수 있어야 한다.
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능해야 한다.
* 함수를 인자값으로 사용하면 컴파일 시점에서 알 수 없기 때문에 디버깅이 어려움.
Swift에서의 클래스
- Obj-C에서 사용하기 어려웠던 구조체나 열거형을 자유롭게 정의하고, 사용가능 함.
- 구조체와 열거형, 클래스는 속성(Property)와 메소드를 가질 수 있는 공통점이 있음.
구조체와 클래스 비교 (공통점)
- 값을 저장하는 속성을 변수나 상수의 정의할 수 있다.
- 함수적인 기능을 제공하는 메소드를 정의할 수 있다.
- 속성값에 접근할 수 있는 방법을 제공하는 서브스크립트(Subscript)를 정의할 수 있다.
- 객체를 원하는 초기 상태로 설정하게 하는 초기화 블록을 정의할 수 있다.
- 기본 형태로 구현된 객체를 기반으로 함수적 기능을 확장할 수 있는 확장 기능을 제공한다.
- 특정 형식의 함수적 표준을 제공하기 위한 프로토콜을 구현할 수 있다.
구조체와 다르게 클래스가 할 수 있는 기능
- 클래스의 특성을 다른 클래스가 물려받아 그대로 사용할 수 있는 상속이 가능.
- 실행 시 컴파일러가 클래스 인스턴스의 타입을 미리 파악하고 검사할 수 있도록 타입 캐스팅을 제공.
- 클래스 인스턴스에 할당된 리소스를 인스턴스가 소멸할 때 직접 해제할 수 있도록 소멸화 구문을 제공.
- 클래스 인스턴스는 다른 객체로 전달될 때 레퍼런스 참조 형식으로 제공되며, 이때 레퍼런스 참조가 가능한 개수는 제약이 없음.
클래스보다 구조체를 사용하는 것이 좋을 때
- 서로 연관된 몇 개의 기본 데이터 타입들을 캡슐화하여 묶는 것이 목적일 때
- 캡슐화된 데이터에 상속이 필요하지 않을 때
- 캡슐화된 데이터를 전달하거나 할당하는 과정에서 참조 방식보다는 값이 복사되는 것이 합리적일 때
- 캡슐화된 원본 데이터를 보존해야 할 때
구조체와 클래스의 변수 선언 차이
- 구조체는 값에 의한 전달 방식으로 인스턴스가 변수나 상수에 할당 됨.
- 클래스는 참조에 의한 전달 방식으로 인스턴스의 레퍼런스가 변수나 상수에 할당 됨.
mutating 키워드
- 일반적으로 구조체는 메소드 네에서 멤버 변수를 수정할 수 없는 제약이 있는데,
이 제약을 풀고 메소드 내에서 멤버 변수를 수정하기 위해서 사용함.
이 제약을 풀고 메소드 내에서 멤버 변수를 수정하기 위해서 사용함.
프로퍼티 오버라이딩 시 가능한 것
- 저장 프로퍼티를 get, set 구문이 모두 있는 연산 프로퍼티로 오버라이딩
- get, set 구문이 모두 제공되는 연산 프로퍼티를 get, set 구문이 모두 제공되는 연산 프로퍼티로 오버라이딩
- get 구문만 제공되는 연산 프로퍼티를 get, set 구문이 모두 제공되는 연산 프로퍼티로 오버라이딩
- get 구문만 제공되는 연산 프로퍼티를 get 구문만 제공되는 연산 프로퍼티로 오버라이딩
프로퍼티 오버라이딩 시 불가능 한 것
- 저장 프로퍼티를 저장 프로버티로 오버라이딩
- get, set 구문과 관계없이 연산 프로퍼티를 저장 프로퍼티로 오버라이딩
- 저장 프로퍼티를 get 구문만 제공되는 연산 프로퍼티(=읽기 전용)로 오버라이딩
- get, set 구문을 모두 제공하는 연산 프로퍼티를 get 구문만 제공되는 연산 프로퍼티로 오버라이딩
final 키워드
- 해당 클래스에 대하여 더는 수정하거나 기능을 변경하기를 원하지 않을 때 사용
- 프로퍼티나 메소드, 또는 클래스에 서브클래싱(상속)을 방지하고 싶을 때 사용
업 캐스팅
- 하위 클래스 타입을 상위 클래스 타입으로 캐스팅할 때 (캐스팅하기 전 타입이 하위 클래스, 캐스팅 한 후 타입이 상위 클래스)
- 캐스팅한 결과, 캐스팅하기 전 타입보다 추상화될 때
- 일반적으로 캐스팅 과정에서 오류가 발생한 가능성이 없음
다운 캐스팅
- 상위 클래스 타입을 하위 클래스 타입으로 캐스팅할 때 (캐스팅하기 전 타입이 상위 클래스, 캐스팅 한 후 타입이 하위 클래스)
- 캐스팅한 결과, 캐스팅하기 전 타입보다 구체화될 때
- 캐스팅 과정에서 오류가 발생한 가능성이 있음
- 오류에 대한 처리 방식에 따라 옵셔녈 캐스팅과 강제 캐스팅으로 나뉘어짐
'Read & Write > Swift' 카테고리의 다른 글
[Swift] for문 역방향 사용하기 (0) | 2016.04.28 |
---|