본문 바로가기
코틀린

코틀린(9) - 상속, 상속으로 속성과 기능을 확장

by 왈레 2022. 3. 21.

실무자 관점에서 상속이 필요한 경우는 가지가 있다.

  1. 이미 존재하는 클래스를 확장하여 새로운 속성이나 새로운 함수를 추가한 클래스를 만들어야
  2. 여러개의 클래스를 만들었는데 클래스들의 공통점들을 뽑아 코드관리를 편하게 해야 할때

속성과 함수를 물려주는 쪽을 '슈퍼 클래스' 물려 받는 쪽을 '서브 클래스'라고 한다.

 

*코틀린은 상속 금지가 기본값이다 *open 클래스가 상속해 있도록 클래스 선언시 붙여줄 있는 키워드이다.

 

상속에 대한 가지 규칙

  1. 서브 클래스는 슈퍼 클래스에 존재하는 속성과 '같은 이름' 속성을 가질 없다.
  2. 서브 클래스가 생성될 때는 반드시 수퍼클래스의 생성자까지 호출되어야 한다.

서브 클래스를 만들 때는 생성자에서 파라미터값을 받긴 하지만 클래스의 자체 속성으로 만들어주는 var 붙이지말고 "var, val" 등을 붙이면 속성으로 선언된다.

 

var val 제외한 일반 파라미터로 인자값(인자값이 없더라도) 받아 슈퍼 클래스의 생성자에 직접 넘겨주어야 한다. 방법은 클래스 선언 뒤에 콜론을 붙이고 수퍼 클래스의 생성자를 써주면 된다.

class dog(name:String, age:Int) : Animal(name,age, )

 

생성자에 var 이나 val 을 붙인 경우와 아닌 경우는 차이가 있다.

var 이나 val 을 붙이면 해당 클래스의 속성으로 동작하지만, 붙이지 않은 경우에는 생성자 자체의 패러미터로만 동작하여, 단순히 수퍼클래스에 값을 전달하거나 생성자 내부의 루틴인 init 안에서만 사용하는 변수가 된다.

 

따라서 말씀하신 코드에서 Dog 는 수퍼클래스와 같은 속성을 작성한 것이 아닌, 단지 name과 age를 받아 전달하기만 하는 역할을 하게 되는 것이다.

 

수퍼클래스와 같은 이름의 속성을 중복으로 선언할 수 없다는 것을 직접 눈으로 확인하려면 같은 코드에서 Dog에 있는 name과 age 앞에 var 을 붙여보시면 알 수 있다. (에러가 남)

 

그리고 Dog 에서만 사용하는 속성이라면, 당연히 var이나 val을 붙여 자체 속성으로 만들어 줘야 한다.

그렇게 하지 않으면 위에서 설명한 대로 init 안에서만 동작하는 파라미터가 된다.

댓글