상속과 다형성
객체지향프로그래밍의 특징으로 크게 캡슐화, 은닉화, 추상화, 상속, 다형성이 있습니다. 그 중 상속과 다형성에 대해 알아볼까 합니다.
상속
기존 클래스를 재사용하여 새로운 클래스를 작성하는 것
상속을 통해 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이합니다.
장점
- 코드 재사용성
- 코드 중복 제거
- 프로그램 생산성과 유지보수 향상
오버라이딩
조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우에 사용한다.
오버라이딩 조건
자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 다음의 조건이 같아야 한다.
- 이름
- 매개변수
- 반환 타입
오버라이딩과 접근제어
- open
- 엔티티를 정의한 모듈의 모든 소스 파일 내에서 사용 가능
- 정의한 모듈을 가져오는 다른 모듈의 소스파일에서도 사용 가능
- 정의한 모듈과 다른 모듈 모듈 모두에서 오버라이딩 가능
- 일반적으로 Framework에 공용 인터페이스를 지정할 때 사용
- public
- 엔티티를 정의한 모듈의 모든 소스 파일 내에서 사용 가능
- 정의한 모듈을 가져오는 다른 모듈의 소스파일에서도 사용 가능
- 정의한 모듈에서만 상속 및 오버라이딩 가능
- 정의한 모듈을 가져오는 다른 모듈에서는 상속 및 오버라이딩 불가
- 일반적으로 Framework에 공용 인터페이스를 지정할 때 사용
- internal
- 따로 접근제어를 선언해주지 않으면 기본으로 할당되는 default 접근제어
- 엔티티를 정의한 모듈의 모든 소스 파일 내에서 사용 가능
- 정의한 모듈을 가져오는 다른 모듈의 소스파일에서 사용 불가
- 일반적으로 App이나 Framework의 내부 구조를 정의할 때 사용
- fileprivate
- 해당 파일 내에서만 사용 가능
- private
- 해당 요소가 선언된 블럭 내에서만 사용 가능
. | open | public | internal | fileprivate | private |
---|---|---|---|---|---|
사용 | 전체 | 전체 | 정의한 모듈 | 정의한 파일 | 정의한 블럭 |
상속 | 전체 | 정의한 모듈 | 정의한 모듈 | 정의한 파일 | 불가 |
특징 | 가장 개방적 | . | default 접근제어 | . | 완벽한 은닉화 |
다형성
여러 가지 형태를 가질 수 있는 능력
상속과 함께 객체지향개념의 중요한 특징 중 하나입니다. 다형성은 상속과 깊은 관계가 있으므로 상속에 대해 충분히 알고 있어야 합니다.
자손 타입은 조상 타입의 변수와 메소드를 포함하면서 그 밖에 다른 변수나 메소드를 가질 수 있습니다. 따라서 자손 타입을 조상 타입으로 형변환하는 Up-casting은 Casting을 생략하고도 가능하여도 조상 타입을 자손타입으로 변환하는 Down-casting은 생략이 불가능 합니다.
- Up-casting: 자손타입 -> 조상타입 (형변환 생략 가능)
- Down-casting: 조상타입 -> 자손타입 (형변환 생략 불가)
=> 조사 더 필요
매개변수의 다형성
- 참고: 민소네
Protocol
최소한으로 가져야 할 속성이나 메서드가 정의된 인터페이스
실제 구현은 하지 않고 정의만 합니다.
/// 전송가능한 인터페이스를 정의합니다.
protocol Sendable {
var from: String? { get }
var to: String { get }
func send()
}
클래스와 구조체에 프로토콜을 적용시킬 수 있습니다. 프로토콜을 적용하면, 프로토콜에서 정의한 속성와 메서드를 모두 구현해야 합니다.
- 참고: devxoul-gitbooks
this vs super
this
클래스 영역에서 정의한 변수와 동일한 이름의 변수가 사용되는 경우 this. 를 붙여 클래스 영역에 정의한 변수를 사용할 수 있습니다.
super
이미 클래스 내에 동일한 이름의 메소드, 변수가 있어도 super. 을 붙여 상속받은 클래스의 메소드, 변수를 사용할 수 있습니다.
'iOS > 학습정리' 카테고리의 다른 글
iOS) 오토 레이아웃과 오토 리사이징 (0) | 2021.01.15 |
---|---|
iOS) Core Data - 다른 저장소와의 비교 (0) | 2021.01.12 |
iOS) UIViewController (0) | 2020.12.19 |
프로그래밍 방법론) 객체지향프로그래밍(OOP) - (2) (0) | 2020.09.14 |
프로그래밍 방법론) 객체지향프로그래밍(OOP) - (1) (0) | 2020.09.14 |