본문 바로가기
iOS/Swift

[iOS/Swift] 클래스의 계층구조, 상속(Inheritance)의 개념과 활용

by iosdevlime 2023. 2. 13.

클래스의 생성, 선언, 그리고 구성요소에 대해 익숙하신지요?

 

그렇다면, 객체지향 프로그래밍 포스팅에서 다룬 클래스의

상속성(Inheritance)다형성(Polymorphism)에 대한 개념을 살펴볼 시점입니다.

 

객체지향 프로그래밍의 특징

 

[CS/Basic] 객체지향 프로그래밍의 특징과 설계원칙(SOLID)

자, 이번 포스팅은 지난번 객체지향 포스팅에서 미처 다루지 못했던 객체지향 프로그래밍의 4가지 특징 그리고 객체지향 설계 원칙(SOLID) 위 2가지 사항에 대하여 살펴볼 예정입니다. 이전에 다

iosdevlime.tistory.com

 

 

 


 

 

클래스의 상속(Inheritance)

클래스는 상속을 통해 계층구조를 만들며, 상위 클래스의 특성을 물려받을 수 있다

 

사실, 객체지향 프로그래밍의 4가지 특징 중

상속성(Inheritance)에 대한 이해만 있다면, 그다지 크게 어렵지 않은 개념입니다.

 

상속이란, 우리가 살고있는 현실의 관점을 프로그래밍으로 대입한 것이며,

부모 클래스의 특성(프로퍼티과 메서드) ➟ 자식 클래스에서 물려받는 지극히 단순한 구조입니다.

 

또한, 상속은 오로지 '클래스' 에서만 사용가능한 개념입니다.

 

그렇다면, 일단 클래스의 계층구조를 살펴볼까요?

 

 

 

기본 클래스(Base Class) 

  • 아무런 클래스도 상속받거나, 상속하지 않는 클래스입니다.
    • 말 그대로 '단 하나의 클래스'만 존재하며 상속과 같은 행위는 하지 않습니다.
// Animals(동물)이라는 단일한 기본클래스
class Animals {
    var name: String?
    var age: Int?
    
    func sound() {
        print("캉캉캉")
    }
}

 

 

서브 클래싱(SubClassing) 

  • 기본 클래스를 기반, 새로운 하위클래스의 기능을 확장하는 '상속'행위를 의미합니다.
    • 기본 클래스의 특징(프로퍼티와 메서드)를 상속받습니다.
  • 계층구조는 슈퍼클래스(SuperClass) ➟ 하위클래스(SubClass)로 구성됩니다.
    • 상속받는 하위 클래스의 이름 옆에 콜론(:)을 작성하고, 슈퍼 클래스의 이름을 작성합니다.
    • 위 기본클래스의 Animals 기본클래스를 상속받는 Cat 클래스를 선언합니다.
class Cat : Animals {
    var nickname: String?
}

// 인스턴스(myCat)생성 및 초기화
let myCat: Cat = .init()

// 상위 클래스(Animals)의 프로퍼티를 상속받아 값을 할당할 수 있음
myCat.name = "Miu"
myCat.name // Miu

// 물론, 본인 클래스(Cat) 내부에 있는 프로퍼티도 동일하게 값을 할당
myCat.nickname = "Pig"
myCat.nickname // Pig

 

상위 클래스의 프로퍼티/메서드는 하위 클래스에서 상속되며, 하위 클래스 또한 본인의 프로퍼티/메서드를 생성할 수 있음

 

 

 

 

상위 클래스의 특징을 재 정의할 수 있을까?

  • 상속의 주요 특징은 상위 클래스의 특징(프로퍼티/메서드)를 활용할 수 있다는 점입니다.
    • 그렇다면, 상속받은 하위클래스 내부에서 값을 임의로 변경해 줄 수 있다는 의미와 동일합니다.
    • 다음과 같이, 'Animals'을 상속받는 'Dog' 하위 클래스가 있고, 새로운 값을 할당하고자 합니다.
class Dog: Animals {
    func sound() {
         print("왈왈!") // 이렇게 소리를 내
    }
}

 

  • 하지만, 위와 같은 코드를 실행할 경우, 컴파일 에러가 발생합니다.
    • 그 이유는 즉, 상위 클래스에서 이미 정의하고 있는 동일한 인스턴스가 존재하기 때문입니다.

 

 

따라서, 위와 같은 문제를 해결하기 위해,

오버라이딩(Overriding) 과정이 필요합니다.

 

(관련된 내용은 다음 포스팅에서 이어 다루도록 하겠습니다)

 

 

 


 

클래스의 주요 기능인 상속,

서브클래싱에 대한 개념과 예시코드를 살펴보았습니다.

 

다음 포스팅에서는 앞서 언급한 오버라이딩에 대해 구체적으로 알아보도록 하겠습니다.

댓글