You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
클래스는 메소드, 프로퍼티와 다른 특징(characteristics)을 다른 클래스로 부터 상속할 수 있습니다. 이것이 Swift에서 클래스가 다른 타입과 구분되는 근본적인 요소입니다. 클래스에서는 저장된 프로퍼티와 계산된 프로퍼티와 상관없이 상속받은 프로퍼티에 프로퍼티 옵저버를 설정해서 값 설정에 반응할 수 있습니다.
오로지 "클래스"만 상속이 가능하며, 상속은 단일 상속만 허용한다(다중 상속X)
클래스는 메서드, 프로퍼티 및 기타 특징들을 상속할 수 있다
상속은 쉽게 말하면, 본질적으로 성격이 비슷한 타입을 새로만들어
데이터(저장속성)를 추가하거나
기능(메서드)를 변형시키서 사용하려는 것
classPerson{varid=0varname="이름"varemail="[email protected]"}classStudent:Person{
// id
// name
// email
varstudentId=0}classUndergraduate:Student{
// id
// name
// email
// studentId
varmajor="전공"}
상속의 재정의
오버로딩(overloading) - (엉어 뜻: 과적) 함수에서 함수의 하나의 이름에 여러 함수를 대응시켜서 사용
오버라이딩(overriding) - (영어 뜻: 재정의) 클래스의 상속에서 상위클래스의 속성/메서드를 재정의(기능을 약간 변형하여 사용)하는 것
재정의
서브클래스에서 슈퍼클래스의 동일한 멤버를 변형하여 구현
상위 클래스에서 존재하는 멤버를 변형하는 것을 재정의라고 함
재정의를 하려는 멤버에는 override 키워드를 붙여야함
재정의 가능한 대상(멤버)
속성 (하지만, 저장 속성에 대한 재정의는 어떠한 경우에도 불가능)
메서드 (메서드, 서브스크립트, 생성자)
classSomeSuperclass{
// 저장속성
varaValue=0
// 메서드
func doSomething(){print("Do something")}}classSomeSubclass:SomeSuperclass{
// 저장속성의 재정의는 원칙적 불가
//override var aValue = 3
// 저장속성 ===> (재정의) 계산속성
// 그러나, 메서드 형태로 부수적 추가는 가능
overridevaraValue:Int{get{return1}set{ // self로 쓰면 안됨
super.aValue = newValue
}}
// 메서드는 (어떤 형태로든)재정의 가능 ===> 변형 / 대체
overridefunc doSomething(){
super.doSomething()print("Do something 2")
//super.doSomething()
}}
속성의 재정의 (엄격)
(타입/인스턴스 속성을 구분해서 생각해야 하지만, 실질적으로 타입 속성을 재정의 하는 것은 드문 일이므로 배제하고 생각하면 됨)
저장 속성의 재정의
원칙적으로 불가능(고유의 메모리 공간은 유지 해야함)
저장 속성은 고유의 메모리 공간이 있으므로 하위클래스에서 고유의 메모리 공간을 바꾸는 방식으로의 재정의는 불가능
에외경우
(메서드 형태로 추가하는 방식의 재정의는 가능)
읽기/쓰기 가능한 계산속성으로 재정의 가능(메서드) (읽기만 가능한 계산 속성으로 정의 불가능 - 기능 축소는 불가능 X)
속성 감시자를 추가는 가능(메서드) (실질적 단순 메서드를 추가해서 저장 속성이 변하는 시점을 관찰할뿐)
계산 속성(메서드)의 재정의
(실질적인 메서드이기 때문에 메서드 형태로의 재정의만 가능. 기능의 범위를 축소하는 형태로의 재정의는 불가능)
(상위)읽기전용 계산 속성을 ===> ( 하위)읽기/쓰기가 가능한 가능한 속성으로 재정의 가능(확장 O)
속성 감시자를 추가하는 재정의는 불가능 (읽기 전용 속성을 관찰 할 수 없음 - 논리에 안 맞음)
(상위)읽기/쓰기 계산 속성을 ===> (하위)읽기만 가능한 가능한 속성으로만 재정의 불가능(기능 제한 X)
속성 감시자를 추가하는 재정의 가능 (관찰은 가능)
읽기 메서드 ===> 읽기 메서드
쓰기 메서드 ===> x (불가능)
읽기 메서드 ===> 읽기 메서드
x ===> 쓰기 메서드 (가능) // 확장은 가능
⭐️ 인스턴스 속성의 대원칙
저장 속성 재정의는 원칙적으로 불가능(하위 속성에서 상위 속성의 고유의 메모리 공간을 변형 불가).
메서드 방식(계산 속성으로의 재정의 가능)으로 추가는 가능
계산 속성의 유지/확장은 가능, 축소는 불가능
속성 감시자(메서드)를 추가하는 재정의는 언제나 가능(실질적 단순 메서드 추가)
(다만, 읽기전용 계산 속성을 관찰하는 것은 의미 없으므로 불가능)
(실질적으로 드뭄)
타입 속성의 재정의 원칙
타입 저장 속성은 재정의 불가 - static키워드 (계산속성으로 재정의하거나, 속성 감시자를 추가하는 것도 불가능)
타입 계산 속성 - class 키워드인 경우 계산 속성 재정의 (확장방식) 가능.
재정의한 타입 저장/계산 속성에는 감시자 추가 원칙적으로 불가
오버라이드 방지 (Preventing Overrides)
final 로 선언되면 override 되는 것을 막을 수 있습니다. (final func, final class func, final subscript) 만일 final 로 선언된 메소드, 프로퍼티, 서브스크립트를 오버라이드 하려고 하면 컴파일 시간(compile-time)에 에러가 발생합니다. 클래스 전체를 final로 선언해서 클래스 안의 모든 메소드, 프로퍼티 등이 override가 되는 것을 막을 수 있습니다. (final class)
UIKit 상속
final은 보통 앱을 만들때 상속을 안하면 메인 뷰 컨트롤러에 final 을 선언을 해준다
속성에 비해, 메서드의 재정의는 자유로운 편(⭐️다만, 생성자의 재정의는 메모리 생성 규칙이 존재)
상위 클래스 인스턴스 메서드 또는 타입 메서드 상관없이 기능을 추가하는 것도 가능하고,
상위 기능을 무시하고 새롭게 구현 하는 것도 가능(제약 없음 - 메서드 이름만 동일하고 완전히 새롭게 구현 가능하다고 생각하면됨)
다만, 기능을 추가하는 구현을 선택할시에 상위구현의 기능을 먼저 실행할지의 여부는 개발자의 선택
메모리 구조를 통한 이해
재정의(overriding) - 현재의 클래스에 맞게 상위 멤버를 변형시키서, 사용 하려는 것
대원칙
저장 속성 재정의 불가
메서드는 자유롧게 재정의 가능(다만, 기능 확장만 가능 - 기능 축소 불가의 의미)
(재정의를 하지 않아도, 상속에서는 당연히 모든 멤버의 상속이 일어남)
저장 속성은 실제 인스턴스에 각각의 멤버별(속성별로) 저장공간이 있고,
변형하는 것이 불가 (상속의 기본 원칙)
메서드는 타입(데이터 영역)에만 배열형태로 주소값을 저장되어 존재하므로
각 상속단계에서 재정의 되고 대체 되는 것이 당연
초기화란?
초기화는 클래스, 구조체, 열거형의 인스턴스를 생성하는 과정임
각 "저장 속성"에 대한 초기값을 설정하여 인스턴스를 사용가능한 상태로 만드는 것
(열거형은 저장속성이 존재하지 않으므로, case중에 한가지를 선택 및 생성)
결국, 이니셜라이저의 실행이 완료되었을 때,
인스턴스의 모든 저장속성이 초기값을 가지는 것이 ==> 생성자(Initializer)의 역할
함수의 구현이 특별 키워드인 init으로 명명됨
인스턴스 생성과정 - > 저장속성에 대한 초기값을 설정하여 사용가능한 상태가 되는것
(즉 , 생성자 실행의 종료 시점에는 모든 저장 속성에 값이 저장되어 있어야 함)
// 클래스, 구조체, (열거형) 동일
class Color {
//let red, green, blue: Double // 동일한 타입일때, 한줄에 작성가능
let red: Double
let green: Double
let blue: Double
// 생성자도 오버로딩(Overloading)을 지원 (파리미터의 수, 아규먼트 레이블, 자료형으로 구분)
init() { // "init()" -> 기본 생성자. 저장 속성의 기본값을 설정하면 "자동" 구현이 제공됨
red = 0.0
green = 0.0
blue = 0.0
}
init(white: Double) {
red = white
green = white
blue = white
}
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
}
오버라이딩 지원
다양한 파라미터 조합으로 생성자를 여러개 구현 가능
(여러가지 방식으로 인스턴스를 생성하는 방법을 제공 하는 것)
초기화의 방법(저장속성이 초기값 가져야 함)
저장 속성의 선언과 동시에 값을 저장
저장 속성을 옵셔널로 선언 (초기값이 없어도 nil로 초기화됨)
생성자에서 값을 초기화
반드시 생성자를 정의해야만 하는 것은 아님 ⭐️
1-2번 방법으로 이니셜라이저를 구현하지 않아도,
컴파일러는 기본 생성자(Default Initializer)를 자동으로 생성함 ==> init()
==> 이니셜라이저 구현하면, 기본 생성자를 자동으로 생성하지 않음
소멸자
생성자와 반대개념의 소멸자(Deinitializer)도 있음
소멸자 ==> 인스턴스가 해제되기 전에 해야할 기능을 정의하는 부분
생성자 기본 원칙
컴파일러는 기본 생성자(Default Initializer)를 자동으로 생성함 ==> init()
==> 이니셜라이저 구현하면, 기본 생성자를 자동으로 생성하지 않음
구조체는 저장 속성들이 기본값을 가지고 있더라도,
추가적으로 Memberwise멤버와이즈(멤버에 관한) 이니셜라이저를 자동으로 제공함
개발자가 직접적으로 생성자를 구현하면, 멤버와이즈 이니셜라이저가 자동으로 제공되지 않음 ⭐️
(멤버와이즈 이니셜라이저는 편의적 기능일뿐)
생성자 직접 구현 하지 않으면?⭐️
모든 저장 속성에 기본값(또는 옵셔널 타입) 전체
클래스 : 기본 생성자 init () 제공 (초기화 방법 별도)
구조체 : 기본 생성자 init () 제공 + 멤버와이즈 이니셜라이즈도 제공
(편의를 위한 기본제공 / 새로운 값으로 설정 가능 )
(일부) 저장 속성에 기본값 (또는 옵셔널 타입) 전제
클래스 : 원칙적으로 일부 값만 가지고 . 셍성자 구현하지 않는 방법이 존재 하지 않음
구조체 : 멤버와이즈 이니셜라이즈도 제공
(편의를 위한 기본제공 / 새로운 값으로 설정 가능 )
Dog(name: "초코", weight: 15.0)
멤버와이즈 이니셜라이즈 : 직접 구현하지 않아도 , 자동으로 제공해주는 저장 속성 설정 가능한 생성자
구조체 vs 클래스 생성자(Initializer
구분
구조체(Struct)
클래스(Class)
지정 생성자 (Designated) | init () {} (모든 저장 속성에 기본값 (or 옵셔널 생섲자 구현 안할시 , 기본 생성자 기본제공) init(파라미터) { } (생성자 구현 안할시 Memberwise 생성자 기본제공) | init () {} (모든 저장 속성에 기본값 (or 옵셔널 생섲자 구현 안할시 , 기본 생성자 기본제공) init(파라미터) { }
편의 생성자 (Convenience) | x | Convenience init(파라 미터 ) { } (상속과 관련 )
필수 생성자 (Required) | x | required init(파라 미터 ) { } (상속과 관련 )
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
상속(Inheritance)이란?
상속의 재정의
재정의
재정의 가능한 대상(멤버)
속성의 재정의 (엄격)
저장 속성의 재정의
에외경우
(메서드 형태로 추가하는 방식의 재정의는 가능)
계산 속성(메서드)의 재정의
⭐️ 인스턴스 속성의 대원칙
메서드 방식(계산 속성으로의 재정의 가능)으로 추가는 가능
(다만, 읽기전용 계산 속성을 관찰하는 것은 의미 없으므로 불가능)
타입 속성의 재정의 원칙
오버라이드 방지 (Preventing Overrides)
UIKit 상속
final
을 선언을 해준다매서드의 재정의 (메서드, 스크립트, 생성자)
메모리 구조를 통한 이해
대원칙
초기화란?
(즉 , 생성자 실행의 종료 시점에는 모든 저장 속성에 값이 저장되어 있어야 함)
오버라이딩 지원
(여러가지 방식으로 인스턴스를 생성하는 방법을 제공 하는 것)
초기화의 방법(저장속성이 초기값 가져야 함)
소멸자
생성자 기본 원칙
(멤버와이즈 이니셜라이저는 편의적 기능일뿐)
생성자 직접 구현 하지 않으면?⭐️
모든 저장 속성에 기본값(또는 옵셔널 타입) 전체
(편의를 위한 기본제공 / 새로운 값으로 설정 가능 )
(일부) 저장 속성에 기본값 (또는 옵셔널 타입) 전제
(편의를 위한 기본제공 / 새로운 값으로 설정 가능 )
멤버와이즈 이니셜라이즈 : 직접 구현하지 않아도 , 자동으로 제공해주는 저장 속성 설정 가능한 생성자
구조체 vs 클래스 생성자(Initializer
1. 지정 생성자 (Designated)
(저장 속성의 선언과 동시에 값을 저장하거나 저장 속성을 옵셔널 타입으로 선언 하는것도 가능)
2. 편의 생성자 (Convenience)
생성자 위임 규칙(Initializer Delegation)
⭐️ 모든 저장속성 갑이 초기화 되어야지만 인스턴스가 사용이 가능함 !
3. 필수 생성자(Required Initializers)
소멸자 (Deinitialization)
소멸자(초기화 해제) 작동 방식
상속이 있는 경우
❗️소멸자는 클래스에만 존재
Beta Was this translation helpful? Give feedback.
All reactions