Inheritance (상속)
- 한 클래스가 가지고 있는 프로퍼티와 메소드를 다른 클래스에게 그대로 사용할수있게 해주는것
- 클래스에서만 사용 가능하고, 구조체에서는 사용할 수 없다.
- 단일 상속만 가능하다.
상속 받은 클래스 : 자식 클래스 (Subclass, Child class)
물려준 클래스 : 부모 클래스 (Superclass, Parents class)
다른 클래스로부터 상속받지 않은 클래스 : 기반클래스(Base class)
클래스 계층
- 제일 위에 있는 클래스 - 루트 클래스, 베이스 클래스
- 바로 아래 있는 클래스들은 베이스클래스를 상속한다.
상속관계에서 위에 있는 클래스를 슈퍼클래스, 페어런트 클래스
아래쪽에 있는 클래스는 서브클래스, 차일드 클래스라고 부른다.
슈퍼클래스는 여러개의 서브클래스들에 연결 가능하지만 서브클래스는 여러개의 슈퍼클래스를 연결하지 못한다. (여러개의 슈퍼클래스를 상속하는것을 다중상속이라고 하지만 스위프트에서는 지원하지 않는다.)
다중상속과 유사한 패턴은 프로토콜로 구현한다.
다른 클래스를 상속하는것을 서브클래싱이라고 한다.
서브클래스는 슈퍼클래스에서 선언된 멤버들을 상속한다. 서브클래스에서 직접 선언된것처럼 자유롭게 사용 가능
오버라이딩 - 슈퍼클래스로부터 상속받은 멤버가 사용하기 적합하지 않다면 구현을 수정할 수 있다. 재정의 할 수 있는데 이것을 오버라이딩이라고 한다.
반대로 슈퍼클래스에서 상속받지만 재정의는 불가능하게 할수도있다.
class 앞에 final 키워드를 붙여주면 된다.
final이 붙은 클래스이름을 파이널 클래스라고 하는데 파이널클래스는 상속이 금지된 클래스이다.
다른 클래스를 상속받는건 가능하지만 다른클래스에서 상속받으려고 하는것은 불가능하다.
기본 문법 📝
class ClassName: SuperClassName {
}
Overriding
부모클래스의 메서드, 프로퍼티, 서브스크립트 등을 그대로 사용하지 않고 변경하여 사용하는 것
오버라이딩이 가능한 대상은 메소드, 프로퍼티, 서브스크립트, 생성자가 있다.
오버라이딩 방법에는 2가지 경우가 있다.
슈퍼클래스 기반으로 새로운 코드를 추가하거나
슈퍼클래스 기반을 무시하고 완전히 새롭게 구현하거나
메소드 오버라이딩
- 메소드 앞에 overrid 키워드를 사용한다.
메소드를 오버라이딩 조건
- 메서드 이름 같아야함
- 매개변수의 이름, 타입 같아야함
- 리턴타입 같아야함
프로퍼티 재정의
겟터, 셋터, 프로퍼티 옵저버로 재정의하는것을 말한다. 저장 프로퍼티로 재정의는 불가능
연산 프로퍼티 - 겟 셋
부모 클래스에서 읽기 전용 -> 자식 클래스에서 읽기,쓰기 전용으로 변경 가능
부모 클래스에서 읽기,쓰기 가능한 프로퍼티를 -> 자식 클래스에서 읽기 전용으로 변경 불가능
읽기, 쓰기 가능한 프로퍼티는 오버라이딩하면 똑같이 읽기,쓰기를 오버라이딩 해줘야함
프로퍼티 옵저버 - 윌셋 디드셋
변수 저장속성에서만 오버라이딩 지원
오버라이딩 금지 - final 키워드
파이널 키워드를 사용했다고 해서 접근하지 못하는것은 아니다.
Upcasting and Downcasting
upcasting
자식클래스에서 부모클래스로 형변환하는것
부모클래스의 프로퍼티와 메소드를 사용하기 위해서
as : 타입변환이 확실하게 가능한 경우 사용,그 외에는 컴파일 에러
동일한 클래스 계층에서 수행되는 업케스팅은 안전하고 항상 성공함
안전하다는것은 에러가 발생하지 않는다는 뜻
downcasting
부모클래스에서 자식클래스로 형변환하는것
부모클래스에서 자식클래스의 프로퍼티와 메소드를 사용하기 위해서
다운캐스팅은 실패할 수 있기 때문에 타입캐스트 연산자 두개가 제공됨
as? : 성공하면 옵셔널값을 가지고 실패하면 nil 리턴
as! : 성공하면 논옵셔널값을 가지고 실패하면 크래시 발생
Type Casting
인스턴스의 타입을 확인하거나, 인스턴스의 타입을 슈퍼클래스, 서브클래스 타입처럼 사용하기위함.
타입 캐스팅 연산자가 중요한데 2가지가 있음 is, as
is - Instance의 타입을 확인하는데 사용
as - Instance의 형변환 작업에 사용
is << is 연산자, 2항 연산자 expression is Type -> Bool 타입 리턴
두 피연산자가 동일하다면 트루
왼쪽 피연산자의 형식이 오른쪽 형식과 동일한 상속계층에 있고 오른쪽이 슈퍼클래스라면 트루
타입체크는 런타임에서 실행된다.
class Test {
var name: String
init(name: String) {
self.name = name
}
}
var test = Test(name: "Kiwoo")
// test가 Test의 인스턴스인지 확인
if test is Test {
print("OK")
}
// Test의 프로퍼티가 String인지 확인
if test.name is String {
print("OKOK")
}
타입캐스팅 연산자
as? : 성공하면 옵셔널값을 가지고 실패하면 nil 리턴
as! : 성공하면 논옵셔널값을 가지고 실패하면 크래시 발생
as는 컴파일타임에
as?와 as!는 런타임에 실행
as는 업캐스팅과 패턴매칭에서만 사용 가능 Switch
Any AnyObject
Any
Any는 함수타입을 포함하여 모든 타입의 인스턴스를 나타낼 수 있다.
여러 타입을 사용하고 싶을때 사용
AnyObject = 프로토콜
AnyObject는 모든 클래스 타입의 인스턴스를 나타낼 수 있다.
즉 클래스 인스턴스에만 할당이 가능하다.
이 두 타입은 매번 타입 체크 및 형변환을 해주어야하기때문에 처음부터 타입을 지정해주는것이 좋다.
Overloading
같은 함수의 이름을 가지고 있지만 파라미터를 다르게 하여 다양한 유형의 호출에 응답이 가능한 것.
매개변수의 개수와 자료형이 다른 같은 이름의 함수를 여러개 정의할수있다.
'Swift > Swift문법' 카테고리의 다른 글
| Swift문법 - Class Initializer (0) | 2023.05.07 |
|---|---|
| Swift문법 - Memberwise Initialer (0) | 2023.04.30 |
| Swift문법 - Method (0) | 2023.04.16 |
| Swift문법 - self & super (0) | 2023.04.02 |
| Swift문법 - Subscript (0) | 2023.03.26 |