본문 바로가기
언어/Kotlin

Java와 비교하는 Kotlin - 클래스를 재사용하는 상속

by 개발짜 2022. 11. 5.

상속과 생성자

상속: 클래스를 선언할 때 다른 클래스를 참조해서 선언하는 것
코틀린에서 어떤 클래스를 상속받으려면 선언부에서 콜론(:)과 함께 상속받을 클래스 이름을 입력한다.

 

// 클래스 상속 형식
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보다 적용 범위가 넓다.

댓글