[TIL] 클래스 상속

박주하·2025년 5월 28일

1. 상속


클래스 상속은 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나다. 하위 클래스(서브클래스)가 상위 클래스(슈퍼클래스)의 속성과 메서드를 물려받고, 추가하거나 재정의(override) 할 수 있다. class만 상속이 가능하며, 한개의 클래스에서만 받을 수 있다. override, super, final 등 키워드로 상속 구조를 제어할 수 있다.


🔁 override 키워드

상위 클래스의 메서드나 속성을 변경(재정의)하려면 override 키워드를 사용하면 된다. override 없이 재정의하려고 하면 컴파일 에러가 발생한다.

class Animal {
    var name: String

    init(name: String) {
        self.name = name
    }

    func makeSound() {
        print("sound")
    }
}

class Dog: Animal {		// Dog는 Animal을 상속받음
    func fetch() {		// Animal의 name 속성과 init()을 그대로 사용
        print("\(name)가 공을 가져온다")
    }
    
    override func makeSound() { // makeSound() 메서드 재정의(override)
        print("멍멍!")
    }
}

🔐 상속 제한하기: final

final 키워드를 사용하면 상속을 막을 수 있다. 메서드에 final을 붙이면, 해당 메서드만 재정의 방지된다.

final class Bird {
    func fly() {
        print("날아간다")
    }
}

// 아래 코드는 에러 발생
// class Parrot: Bird {}  ❌ 상속 불가능

생성자 상속 (init 관련)

Swift는 상위 클래스의 init()을 자동으로 상속하지 않지만, 하위 클래스에서 init()을 정의하지 않으면 상위 클래스의 지정 이니셜라이저를 사용할 수 있다.

// 지정 이니셜라이저 사용
class Cat: Animal {
    // 자동으로 Animal의 init(name:) 사용 가능
}

// 새로 정의하려면 override init
class Cat: Animal {
    override init(name: String) {
        super.init(name: name)
    }
}

📌 상속 vs 프로토콜

구분상속 (Inheritance)프로토콜 (Protocol)
목적재사용과 확장을 위해 부모 클래스를 기반으로 함특정 기능 구현을 강제하기 위해 사용함
구조클래스 간 계층 구조 (class)클래스, 구조체, 열거형 모두 채택 가능
다중 채택❌ 단일 상속만 가능 (하나의 부모 클래스만)✅ 여러 프로토콜을 동시에 채택 가능
강제성기능을 재정의할 수 있음 (override)필수 메서드/프로퍼티 구현 필요

2. 메소드 오버라이딩 vs 메서드 오버로딩


메소드 오버라이딩(Method Overriding)

상속받은 클래스에서 부모 클래스의 메서드를 재정의해서 자신만의 동작을 구현하는 것이다. override 키워드를 사용하며, final로 선언된 메서드는 오버라이딩 불가능하다. 부모 클래스의 기능을 확장하거나 수정할 때 사용한다.

override func makeSound() {
    super.makeSound()	// 부모 클래스의 메서드를 호출하려면 super를 사용
    print("멍멍!")
}

메서드 오버로딩(Method Overloading)

같은 이름의 메서드를 매개변수의 타입, 개수, 순서를 달리해서 여러 개 정의하는 것이다. 상속과는 무관하며, 같은 클래스 내에서 가능하다.

class Calculator {
    func add(a: Int, b: Int) -> Int {
        return a + b
    }

    func add(a: Double, b: Double) -> Double {
        return a + b
    }

    func add(a: Int, b: Int, c: Int) -> Int {
        return a + b + c
    }
}

📌 정리

항목오버라이딩 (Overriding)오버로딩 (Overloading)
적용 대상상속받은 메서드같은 클래스 내 메서드
키워드 필요 여부override 필요필요 없음
메서드 이름같음같음
매개변수 시그니처같아야 함달라야 함(개수, 타입, 순서 등)
사용 목적부모 클래스의 메서드를 재정의동일한 의미의 기능을 다양한 방식으로 사용

0개의 댓글