상속과 생성자
상속: 클래스를 선언할 때 다른 클래스를 참조해서 선언하는 것
코틀린에서 어떤 클래스를 상속받으려면 선언부에서 콜론(:)과 함께 상속받을 클래스 이름을 입력한다.
// 클래스 상속 형식
open class Super { // 상속할 수 있게 open 키워드 이용
}
class Sub: Super() { // Super를 상속받아 Sub 클래스 선언
}
- 상위 클래스: 상속 관계에서 상속 대상이 되는 클래스
- 하위 클래스: 상속받는 클래스
- 코틀린의 클래스는 기본적으로 다른 클래스가 상속할 수 없기 떄문에 다른 클래스에서 상속할 수 있게 선언하려면 open 키워드를 사용해야 한다.
//매개변수가 있는 상위 클래스의 생성자 호출
open class Super(name: String) {
}
class Sub(name: String): Super(name) {
}
- 매개변수가 있는 상위 클래스의 생성자를 호출할 때는 매개변수 구성에 맞게 인자를 전달해야 한다.
// 하위 클래스에 보조 생성자만 있는 경우 상위 클래스의 생성자 호출
open class SuperClass (name: String) {
}
class Sub: SuperClass {
constructor(name: String): super(name) {
}
}
- 상위 클래스의 생성자 호출을 꼭 클래스 선언부에 작성할 필요는 없다.
자바와 차이점
- 자바의 상속에는 크게 extends, implements 로 나뉜다.
// extends 상속
class Person {
String name;
String getName() {
return name;
}
}
class User extends Person {
public User(String name) {
this.name = name;
}
}
void main() {
User user = new User("Jang");
System.out.println(user.getName());
}
[실행 결과]
Jang
- 상위 클래스의 메서드를 오버라이딩 없이 사용할 수 있다.
- 일반적인 클래스와 abstract 클래스에서 자주 사용된다.
- 클래스 한 개만 상속 받을 수 있다.
// implements 상속
interface TestInterface{
public static int num = 8;
public void fun1();
public void fun2();
}
class InterfaceExam implements TestInterface{
@Override
public void fun1(){
System.out.println(num);
}
@Override
public void fun2() {
}
}
void main() {
InterfaceExam exam = new InterfaceExam();
exam.fun1();
}
[실행 결과]
8
- 상위 클래스의 메서드를 오버라이딩 해야한다.
- interface class만 implements 상속을 할 수 있다.
- 다중 상속이 가능하다.
오버라이딩 - 재정의
오버라이딩: 상위 클래스에 선언된 변수나 함수를 같은 이름으로 하위 클래스에서 다시 선언하는 것
open class SuperClass {
open var someData = 10
open fun someFun() {
println("i am superClass function: $someData")
}
}
class Sub: SuperClass() {
override var someData: Int = 20
override fun someFun() {
println("i am sub function: $someData")
}
}
fun main() {
val obj = Sub()
obj.someFun()
}
[실행 결과]
i am sub class Function : 20
- 오버라이딩 규칙은 먼저 상위 클래스에서 오버라이딩을 허용할 변수나 함수 선언 앞에 open 키워드를 추가해야 한다.
- 하위 클래스에서 재정의할 때는 반드시 선언문 앞에 override라는 키워드를 추가해야 한다.
자바와 차이점
interface TestInterface{
public static int num = 8;
public void fun1();
}
class InterfaceExam implements TestInterface{
@Override
public void fun1(){
System.out.println(num);
}
}
- 자바에서 오버라이딩 할 때 하위 클래스의 함수의 선언부에 '@Override' 키워드를 사용하여 오버라이드 사용을 명시하면 된다.
접근 제한자
접근 제한자 | 최상위에서 이용 | 클래스 멤버에서 이용 |
public | 모든 파일에서 가능 | 모든 클래스에서 가능 |
internal | 같은 모듈 내에서 가능 | 같은 모듈 내에서 가능 |
protected | 사용 불가 | 상속 관계의 하위 클래스에서만 가능 |
private | 파일 내부에서만 가능 | 클래스 내부에서만 이용 |
자바와 차이점
접근 제한자 | 적용 대상 | 접근 가능 대상 |
public | 클래스, 필드, 생성자, 메서드 | 모든 대상 |
protected | 필드, 생성자, 메서드 | 같은 패키지 또는 자식 클래스 |
default | 클래스, 필드, 생성자, 메서드 | 같은 패키지에 소속된 클래스 |
private | 필드, 생성자, 메서드 | 클래스 내부 |
- public과 private은 같다.
- 자바의 protected가 코틀린의 protected보다 적용 범위가 넓다.
'언어 > Kotlin' 카테고리의 다른 글
Java와 비교하는 Kotlin - 람다 함수와 고차 함수 (0) | 2022.11.05 |
---|---|
Java와 비교하는 Kotlin - 코틀린의 클래스 종류 (0) | 2022.11.05 |
Java와 비교하는 Kotiln - 클래스와 생성자 (0) | 2022.11.05 |
Java와 비교하는 Kotlin - 조건문과 반복문 (0) | 2022.11.05 |
Java와 비교하는 Kotlin - 변수와 함수 (0) | 2022.11.05 |
댓글