본문으로 바로가기

[Swift] 구조체/클래스 정리

category Read & Write/Swift 2016. 8. 1. 20:28

클로저 (Closure)

- 일회용 함수를 작성할 수 있는 구문. 

  일회용 함수란 한 번만 사용할 구문들의 집합이면서, 형식은 함수로 작성되어야 하는 제약조건이 있을 때 만들어 사용할 수 있는 함수를 말함.


  굳이 함수 이름을 작성할 필요가 없기 때문에 익명(Anonymous)함수라고 부르기도 함.



일급 객체 (First-Class Object)

  1. 객체가 런타임에도 생성이 가능해야 한다.
  2. 인자값으로 객체를 전달할 수 있어야 한다.
  3. 반환값으로 객체를 사용할 수 있어야 한다.
  4. 변수나 데이터 구조 안에 저장할 수 있어야 한다.
  5. 할당에 사용된 이름과 관계없이 고유한 구별이 가능해야 한다.
* 함수를 인자값으로 사용하면 컴파일 시점에서 알 수 없기 때문에 디버깅이 어려움.



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