인프런 커뮤니티 질문&답변

(알 수 없음)님의 프로필 이미지

작성한 질문수

Swift 언어로 배우는 iOS 벽돌깨기 게임

class 문법 질문입니다

24.07.17 17:04 작성

·

62

0

class Test{
    var age = 100
    var name = "배트맨"

    func simpleFunction(){
        print("안녕하세요 저는 \(name)입니다. 저는 \(age)살임")
    }
    init(){
        simpleFunction()
        print("부모 클래스 init")
    }
}

class Test1: Test{
    override func simpleFunction(){
        print("자식 클래스")
    }
}

let test1 = Test1()
test1.simpleFunction()
자식 클래스
부모 클래스 init
자식 클래스

 

위와 같은 상황입니다 일단 Test1에 init 메서드가 없으니 컴파일러가 자동으로

init(){
    super.init()
}

을 생성하겠죠 그럼 부모 클래스의 init을 호출할 거고 부모 클래스의 init에는 simpleFunction 메서드 호출 구문이 있으니 호출하겠죠 근데 분명 부모 클래스 내에서 호출했는데 왜 재정의된 simpleFunction 메서드의 내용이 호출됐는지 이해가 되질 않습니다

 

구글링이랑 gpt 이용해서 알아 보니 재정이된 메서드는 부모 클래스에서 호출하더라도 재정의된 내용이 호출된다는데 이 말대로라면super.simpleFunction를 이용해서 메서드를 호출한다고 하더라도 재정의 됐으니 재정의된 내용이 출력되어야 할텐데 super를 이용한 호출은 또 재정의 되기 전 내용이 출력됩니다. 호출 기준이 너무 헷갈리는데 이 부분에 대해서 알려주시면 감사하겠습니다!

답변 1

0

인프런 AI 인턴님의 프로필 이미지

2024. 07. 19. 17:06

안녕하세요, 인프런 AI 인턴입니다.

님의 질문에 대한 답변은 다음과 같습니다.

Swift에서 클래스의 메서드를 오버라이딩(재정의)하면, 부모 클래스에서 정의된 메서드 대신 오버라이드된 메서드가 호출됩니다. 이는 다형성의 한 예로, 서브클래스에서 오버라이드된 메서드가 부모 클래스의 메서드를 대체하기 때문입니다. 따라서, 부모 클래스의 init에서 simpleFunction 메서드를 호출해도, 실제로 실행되는 것은 Test1 클래스에서 오버라이드된 simpleFunction입니다.

super 키워드를 사용하면, 부모 클래스의 메서드를 명시적으로 호출할 수 있습니다. 예를 들어, Test1 클래스에서 super.simpleFunction()을 호출하면 Test 클래스에 구현된 원본 simpleFunction 메서드가 실행됩니다. super는 서브클래스에서 부모 클래스의 속성이나 메서드에 접근할 때 사용합니다.

요약하자면, 서브클래스에서 오버라이드된 메서드는 부모 클래스에서 호출해도 오버라이드된 버전이 실행되며, super를 사용한 호출은 오버라이드 이전의 부모 클래스의 메서드를 호출합니다. 이로 인해 다형성을 구현하고 클래스의 상속 관계에서 유연성을 확보할 수 있습니다.