작성
·
75
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 인턴입니다.
님의 질문에 대한 답변은 다음과 같습니다.
Swift에서 클래스의 메서드를 오버라이딩(재정의)하면, 부모 클래스에서 정의된 메서드 대신 오버라이드된 메서드가 호출됩니다. 이는 다형성의 한 예로, 서브클래스에서 오버라이드된 메서드가 부모 클래스의 메서드를 대체하기 때문입니다. 따라서, 부모 클래스의 init
에서 simpleFunction
메서드를 호출해도, 실제로 실행되는 것은 Test1
클래스에서 오버라이드된 simpleFunction
입니다.
super
키워드를 사용하면, 부모 클래스의 메서드를 명시적으로 호출할 수 있습니다. 예를 들어, Test1
클래스에서 super.simpleFunction()
을 호출하면 Test
클래스에 구현된 원본 simpleFunction
메서드가 실행됩니다. super
는 서브클래스에서 부모 클래스의 속성이나 메서드에 접근할 때 사용합니다.
요약하자면, 서브클래스에서 오버라이드된 메서드는 부모 클래스에서 호출해도 오버라이드된 버전이 실행되며, super
를 사용한 호출은 오버라이드 이전의 부모 클래스의 메서드를 호출합니다. 이로 인해 다형성을 구현하고 클래스의 상속 관계에서 유연성을 확보할 수 있습니다.