[Swift] 객체지향 프로그래밍 - 기본개념 정리 (프로토콜, 익스텐션 포함)
객체지향 프로그래밍
클래스, 객체, 인스턴스
- 클래스 class
- 객체가 공유하는 본질적 속성을 정의
- 타입(=개념)을 구현하는 가장 보편적인 방법
- 객체 object
- 개별적인 실체로 식별 가능한 물리적/개념적 사물.
- 상태(state), 행동(behavior), 식별자(identity)를 가진 실체
- 인스턴스 instance
- 객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때, 객체를 그 개념의 인스턴스라고 한다.
- 인스턴스화(=예시) : 타입에 해당하는 객체를 생성하는 것. 분류의 역.
- 프로그래밍에서 타입은 클래스로 구현되므로, 인스턴스는 클래스의 예시라고 할 수 있다.
- 추상화 abstraction
- 실제 사물에서 원하는 특성만 취하고 필요 없는 부분을 추려 핵심만 표현하는 것
- 분류 classification
- 어떤 객체를 특정 개념의 객체 집합에 포함시키거나 포함시키지 않는 작업
- 개념을 이용해 객체를 여러 그룹으로 분류할 수 있다.
객체지향 프로그래밍 개념
- 프로퍼티 property
- 객체의 상태를 구성하는 모든 특징 (정적)
- 프로퍼티 값 property valye : 프로퍼티의 값. (동적)
- 메소드 method
- 캡슐화 encapsulation
- 객체는 상태를 캡슐 안에 감춰 둔 채 외부로 노출하지 않는다. 객체가 외부에 노출하는 것은 행동뿐이다.
- 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동뿐이다.
- 객체의 자율성을 높이는 효과가 있다.
- 상속 inheritance
- 기존 클래스를 재사용해 새로운 클래스를 작성하는 것.
- 서브 클래스 subclass : (= 자식 클래스) 어떤 클래스를 상속받은 클래스.
- 슈퍼 클래스 superclass : (= 부모 클래스) 자식 클래스에게 자신의 특성을 상속해준 클래스
- 일반화와 특수화 관계를 구현하는 가장 일반적인 방법이다.
- 단, 모든 상속 관계가 일반화 관계는 아니다. 코드 재사용을 위해 사용되기도 한다.
- 서브타이핑 subtyping : 인터페이스 상속 interface inheritance. 서브클래스가 슈퍼클래스를 대체할 수 있는 경우.
- 서브클래싱 subclassing : 구현 상속 inplementation inheritance. 서브클래스가 슈퍼클래스를 대체할 수 없는 경우.
- 다형성 polymorphism
- 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력.
- 다형성을 지닌 객체들은 동일한 메시지를 수신할 수 있으므로, 동일한 타입(동일한 타입 계층)에 속하게 된다.
업캐스팅, 다운캐스팅
- 업캐스팅 upcasting
- 하위 클래스 타입을 상위 클래스 타입으로 변환
- 다운캐스팅 downcasting
- 상위 클래스 타입을 하위 클래스 타입으로 변환
상속과 인터페이스, [Swift] 프로토콜 protocol
- 상속은 물려받는 것, 인터페이스는 장착하는 것.
- [Swift] 인터페이스는 프로토콜 Protocol로 구현되어 있다.
- 프로토콜은 요구사항을 정의할 뿐 기능을 구현하지는 않는다.
- 프로토콜 요구사항에는 프로퍼티, 메서드, 이니셜라이저 등이 있다.
- 상속
- 예) 새는 조류를 상속받고, 날치는 어류를 상속받는다
- 인터페이스
- 예) 새와 날치 모두 "날다"라는 공통 특성을 가져 '날짐승' 카테고리로 묶일 수 있다.
[Swift] 익스텐션 extension
- 익스텐션은 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가하는 것이다.
- 타입의 기능을 확장(extension) 하기 때문에 익스텐션이다.
- 외부에서 가져온 타입에 내가 원하는 기능을 추가하고자 할 때 익스텐션을 사용.
- 익스텐션은 타입에 새로운 기능을 추가할 수 있지만, 기존에 존재하는 기능을 재정의할 수는 없다
[Swift] 상속과 익스텐션 비교
- 상속
- 클래스 타입에서만 사용 가능
- 수직 확장 : 특정 타입을 물려받은 새로운 타입을 정의하고 추가 기능 구현
- 기능을 재정의할 수 있음 (오버라이딩 가능)
- 익스텐션
- 모든 타입에 적용 가능 - 구조체, 열거형, 클래스, 프로토콜, 제네릭..
- 수평 확장 : 기존 타입에 기능을 추가
- 기능을 재정의할 수 없음 (오버라이딩 불가)