이전 내용에 class 특징 상속에 대하여 좀 더 자세한 정리를 해보려고 합니다.
class Cutter {
var shape : String = "circle";
func baking(){
print(shape,"cookie = ...🍪");
}
}
class Cookie1 : Cutter {
var dough : String = "flour";
}
var cookie1 = Cookie1();
cookie1.baking();//circle cookie = ...🍪
위에 코드는 간단한 상속의 모습을 보이고 있습니다.
cookie1은 Cutter를 상속받아 부모 클래스(Cutter)에 접근하여 선언된 변수와 메소드를 불러오는 것을 확인할 수 있습니다.
위와 같은 경우에는 부모 클래스안에 변수의 값이 선언 될 때 지정이 되어있어서 init을 사용하지 않았지만, 만약 부모 클래스안에서 init의 파라미터를 이용해서 부모 클래스의 변수를 초기화 해야 하는 경우가 있습니다.
이러한 경우는 자식 클래스가 부모 클래스에 접근 할 수 있도록 해주는 super메소드를 사용해줘야 합니다.
class Cutter {
var shape : String;
init(s : String){
shape = s;
}
func baking(){
print(shape,"cookie = ...🍪");
}
}
class Cookie1 : Cutter {
var dough : String;
init(dough d : String,shape ss : String){
dough = d;
super.init(s: ss);
}
}
var cookie1 = Cookie1(dough : "flour",shape :"circle");
cookie1.baking();//circle cookie = ...🍪
super.init을 사용하여 자식 클래스 초기화에서 부모의 클래스의 init을 접근할 수 있습니다.
위와 같은 방식으로 부모 클래스의 메소드에 호출 할 때에도 super를 이용하여 호출합니다.
class Cutter {
var shape : String;
init(s : String){
shape = s;
}
func baking(){
print(shape,"cookie = ...🍪");
}
}
class Cookie1 : Cutter {
var dough : String;
init(dough d : String,shape ss : String){
dough = d;
super.init(s: ss);
}
func bakingClass() {
super.baking();
print(shape, "+" , dough, "= ...🍪")
}
}
var cookie1 = Cookie1(dough : "flour",shape :"circle");
cookie1.bakingClass();
//circle cookie = ...🍪
//circle + flour = ...🍪
super을 이용하여 부모 클래스를 호출하는 것 말고도 부모 클래스에서 선언된 메소드의 기능을 바식 클래스에서 재정의 할 수 있는 기능도 있습니다.
class Cutter {
var shape : String;
init(s : String){
shape = s;
}
func baking(){
print(shape,"cookie = ...🍪");
}
}
class Cookie1 : Cutter {
var dough : String;
init(dough d : String,shape ss : String){
dough = d;
super.init(s: ss);
}
override func baking() {
print(shape, "+" , dough, "= ...🍪")
}
}
var cookie1 = Cookie1(dough : "flour",shape :"circle");
cookie1.baking();//circle + flour = ...🍪
이와 같이 상속을 할 때 사용할 수있는 기능들에 대해서 알아봤습니다.
다음에는 프로토콜에 대해 알아볼까 하면서 오늘은 이만...