본문 바로가기

iOS/Swift

Swift) 상속(Inheritance) 정복하기 (1/2) - 상속이란?

 

 

 

안녕하세요!!! 소들입니다 :))))

얼른 Swift 문법 포스팅을 모두 끝..ㄴㅐ고.... iOS와 Rxswift 포스팅으로

넘어가고 싶은...... 소들의... 바람은.. 언제쯤.. 이뤄질지.. 🐂🐂

 

쨌든 이번 포스팅은 "상속"에 관한 거예요!!!!

슈퍼 클래스, 서브 클래스, 오버라이딩.... 어쩌고 저쩌고...

개발 하면서 귀에 딱지 앉게 많이 들은 개념 같아요..!!!

 

이번 포스팅을 통해 제대로 짚고 넘어 가보려고 합니닷 :)

모든 포스팅은 편의 말투로 합니다~!!

 

 

 

 

1. 상속(Inheritance)이란? 

 

오로지 "클래스"만 상속이 가능하며, 상속은 단일 상속만 허용한다(다중 상속X)

클래스는 메서드, 프로퍼티 및 기타 특징들을 상속할 수 있다

 

네 일단 상속의 정말 교과서적인 정의임

이제 예제를 통해 좀 더 쉽게 알아보겠음

 

 

 

1-1. 기본 클래스 (Base Class)

 

아무 클래스도 상속받지 않는 클래스

 

말 그대로, 아무런 상속을 받지 않는 클래스를 "기본 클래스" 라고 함!

이해를 돕기 위해 Human이란 클래스 두둥 등장

 

 

class Human {
    var name: String?
    var age: Int?
}

 

 

자 name과 age란 프로퍼티를 갖는 Human이란 클래스가 있음

이 Human이란 클래스는 현재 Human 이란 이름 뒤에 아무런 클래스 이름도 오지 않았기 때문에,

아무런 클래스도 상속받지 않는 "기본 클래스"

 

그럼 다음과 같이 생긴 클래스도 기본 클래스일까!?!?

 

 

class Human: Hashable {
    var name: String?
    var age: Int?
}

 

 

맞음 기본 클래스임

호에에 클래스 이름 뒤에 : 하고 뭐가 붙어 있는데여??

하겠지만, Hashable은 클래스가 아닌 "프로토콜"임!!!


따라서, Human 클래스는 아무 클래스도 상속받지 않는 "기본 클래스"면서,

Hashable이란 프로토콜을 채택하는 클래스인 것임

 

클래스 이름 뒤에 : 하고 가장 먼저 오는 것이

프로토콜인 건 상관 없고, "클래스"가 아니여야만 기본 클래스구나!!

라는 것. 아니 그래서 도대체 상속이 ㅇ뭔데

 

 

 

1-2. 서브 클래싱(subclassing)

 

기본 클래스를 기반으로 새로운 클래스를 만드는 작업으로,

서브 클래스 이름 옆에 콜론(:)을 쓰고 가장 먼저 상속 받고자 하는 슈퍼 클래스의 이름을 쓴다

 

서브 클래스고 슈퍼클래스고 나발이고 일단

 우리가 만약 선생님이란 클래스를 만들고 싶음

근데 선생님은 선생님이기 전에 뭐다?? 사람이다!!!

 

따라서 Teacher 이란 클래스는

Human이란 클래스의 name, age란 프로퍼티를 모두 갖고 싶음

물론 Teacher이란 클래스에 해당 프로퍼티를 모두 선언해도 되지만, 

객체 지향 특성에 맞게 상속을 이용하여 구현할 수 있음 

 

 Human이란 클래스의 멤버를 모두 가지면서,

Teacher에 필요한 멤버들을 더 추가한 새로운 클래스

를 만들래!!! 할 때 사용할 수 있는 것이 바로바로 "상속"

 

 

class TeacherHuman {
    var subject: String?
}

 

 

이렇게 Teacher 클래스 선언 시 : 를 이용해 가장 첫 번째로 상속받을 클래스를 선언해주면 되는 것임

그러면 실제 Teacher이란 클래스엔 subject란 프로퍼티 하나만 있지만,

 

 

 

 

실제론 내가 상속받는 Human 인스턴스의 멤버들을 포함하고 있음!!!

따라서 Teacher 인스턴스로 Human 클래스의 프로퍼티인 name, age뿐 아니라,

자신의 프로퍼티인 subject까지 모두 접근할 수 있음

(이해를 돕기 위해 그림을 첨부 했지만, 실제 메모리에 저렇게 올라갈지 아닐지는 모름! 참고만)

 

 

let sodeulTeacher = .init()
sodeul.name             // Human(Super Class) 멤버
sodeul.subject          // Teacher(Sub Class) 멤버

 

 

이렇게!!!

 

Teacher이란 클래스가 Human이란 클래스를 "상속" 받는 것

Teacher이 Human이란 클래스를 상속받는 것을 "서브클래싱"한다고 함

 

이때,

상속 받고자 하는 Human 클래스를 "슈퍼 클래스(Super Class)"라 부르고,

Human 클래스를 상속받는 Teacher 클래스를 "서브 클래스(Sub Class)"라고 부름!!!

 

 

 

만약 Teacher이란 클래스를 상속받는 Sodeul이란 클래스가 있다면,

Sodeul이란 클래스의 상속 범위는

 

 

class Sodeul: Teacher {
    var sodeul: String = "🌸"
}

 

 

Sodeul의 슈퍼 클래스는 Teacher이고,

Teacher의 슈퍼 클래스는 Human이기 때문에

 

 

 

 

 

실제 Sodeul 클래스엔 sodeul 이란 프로퍼티 하나만 선언되어 있지만,

위처럼 상속 관계에 있는 모든 멤버를 포함하게 되고, 

 

 

let sodeulSodeul = .init()
sodeul.name             // Human   클래스  멤버
sodeul.subject          // Teacher 클래스  멤버
sodeul.sodeul           // Sodeul  클래스  멤버

 

 

당연히 접근도 가능함 :)

 

+

아 예제는 프로퍼티지만, 메서드 & 서브스크립트 & 생성자 또한 마찬가지임!!!

만약 Human 클래스에 description이란 메서드가 있으면,

 

 

class Human {
    var name: String?
 
    func description() {
        print("my name is \(name)")
    }
}
 

 

 

Human 클래스를 상속한 Teacher이란 클래스에서도

 

 

sodeul.description()        // 나는 사람입니다

 

 

description이란 슈퍼 클래스의 메서드를 사용 가능함!!

 

 

 

1-3. final :: 상속을 금지한다!! 

 

만약,  내 클래스는 아무도 상속 받을 수 없어!!!!!!

라고 하고 싶다면, 클래스 앞에 "final" 이란 키워드를 붙여주면 됨

 

 

final class Human {
    var name: String?
    var age: Int?
}

 

 

이렇게 class 앞에 final이란 클래스를 붙여주면 말 그대로,

최후의 클래스가 되는 것임 아무도 나를 상속 받을 수 없으셈

 

 

 

 

따라서 Human이란 클래스를 상속 받으려고 하면,

final class를 상속받으려고 한다며 에러가 뜸!!!!!

 

더이상 상속할 일 없는 클래스의 경우 final을 써주면

빌드 속도가 향상 된다고 들어서 나는 꼭 써주는 편임!!!!

(프로퍼티에 final을 붙이는 것은 다음 포스팅(오버라이딩) 때 쓰겠음!!!)

 

 

 

 

2. 상속은 정말 클래스밖에 안 될까?

 

 

 

 

안 된다는 건

 

 

 

 

안 되는 거다

 

 

 

 

3. 정말 단일 상속밖에 안 될까?

 

 

 

하지 말란 것은 하지 말아야 한다

 

 

 

 

 

.

.

.

 

이번 포스팅에선 정말 상속의 "기본"에 대해서 알아 봐ㅏㅆ어요..!!!!

오버라이딩까지 다룰라다가, 내용이 좀 길어질 거 같아서

다음 포스팅에 이어서 하겠습니다 :) 절대 귀찮은거 절대 아닐거임

피드백이나 궁금증은 언제든 댓글 주세요!!! 



Calendar
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
최근 댓글
Visits
Today
Yesterday