2 minute read

목표

자바의 상속에 대해 학습하세요.

학습할 것 (필수)

자바 상속의 특징

클래스를 가져다가 확장해서 새로운 클래스를 만드는 기술을 객체지향 프로그래밍에서는 상속이라고 부른다.

  • 슈퍼클래스(superclas): 상속을 해주는 클래스 , 상위클래스, 부모클래스
  • 서브클래스(subclass): 상속을 받는 클래스, 하위클래스, 자식클래스
[public/final/abstract] class subclass명 extends superclass명{
...
}

상속은 객체지향 언어의 장점인 모듈의 재사용(reusing)과 코드의 간결성을 제공하는 하며, 자바에서는 단일 상속만을 허용한다.

super 키워드

  • 서브클래스 생성자 안에서 슈퍼클래스의 생성자를 호출 할 때
super(parameters, ...);

슈퍼클래스 생성자 호출문은 반드시 생성자의 첫 번째 명령문이여야 한다.

  • 슈퍼클래스의 멤버 변수나 메소드 호출 할 때
super.멤버변수명
super.메소드명(parameters, ...);
  ’.’을 이용해서 사용할 때 생성자에서 사용할 때
this 현재 코드를 싱행하는 객체의 데이터나 메소드를 호출할 때 사용 ex) this.doSometing(); 현재 클래스의 또 다른 생성자를 호출하고자 할 때 사용하는 방식. 즉 같은 클래스의 또 다른 생성자를 호출할 때 사용한다
super 현재 코드에서 명시적으로 부모 클래스의 속성이나 메소드를 호출할 때 사용 ex) super.doSomethig(); 상속 관계에서 부모 클래스에 정의된 생성자를 사용하는 방식. 실제 호출되는 생성자는 부모 클래스 안에 정의해 둔 생성자가 호출된다.

메소드 오버라이딩

메소드 오버라이딩: 슈퍼클래스의 메소드와 똑같은 시그니처의 메소드를 선언해서 슈퍼클래스의 메소드를 무시하도록 만드는 것 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것이다. 메소드 오버라이딩은 같은 시그니처를 갖는 메소드에 대해서만 일어난다.

메소드 시그니처(Method signature): 메소드 이름과 파라미터 리스트의 조합

슈퍼클래스의 시그니처를 갖는 메소드를 서브클래스에 선언한다. 그렇게 하면 슈퍼클래스의 메소드는 무시된다.

다이나믹 메소드 디스패치 (Dynamic Method Dispatch)

메소드 디스패치(Method Dispatch): 어떤 메소드를 호출할지 결정하여 실제로 실행시키는 과정을 말한다.

  • Static Dispatch

컴파일 시점에 컴파일러가 특정 메소드를 호출할 것이라는 걸 명확하게 알고있는 경우로 컴파일 시 생성된 바이트 코드에도 이 정보가 그대로 남아있으며, 어떤 메소드가 호출될지 정해져 있는 것을 말한다.

  • Dynamic Dispatch

오버라이딩된 메소드의 바인딩을 컴파일 타임이 아닌 런타임에 동적으로 정해지는 것을 말한다.

class A {
    void function(){
        System.out.println("A class function");
    }
}

class B extends A {
    void function() {
        System.out.println("B class function");
    }
}

class C extends A {
    void function() {
        System.out.println("C class function");
    }
}

public class DynamicMethodDispatch {
    public static void main(String[] args) {
        A obj = new A();
        obj.function();
        obj = new B();
        obj.function();
        obj = new C();
        obj.function();
    }
}
A class function
B class function
C class function

추상 클래스

추상 클래스(abstract class): 서브 클래스에서 구현되는 추상되는 기능만을 정의하는 클래스, 객체가 아니라 타입으로만 존재하고 추상 메소드를 가지는 클래스

추상 클래스에서 정의된 추상적인 기능은 하위 클래스에서 구현되며, abstract 키워드를 붙이고, 추상 클래스는 객체로 만들 수 없다.

abstract 키워드: 인스턴스화를 금지하는 키워드

인스턴스화(instanciation): 클래스를 가지고 객체를 만드는 일

abstract class 클래스명{
	...
	abstract 리턴데이터타입 추상메소드이름();	// 하위 클래스에서 오버라이딩해야 함
	...
}
  • 추상 메소드
    추상 클래스 내에 정의되어 있는 메소드로써 선언만 있고 구현 부분이 없는 메소드이다. 하위 클래스에서는 상위 클래스에서 추상 메소드로 정의된 메소드를 오버라이딩하여 사용한다.

추상 클래스는 최소한 하나 이상의 추상 메소드를 가져야 하며, 추상 클래스로부터는 직접 객체가 생성될 수 없다.

abstract 리턴데이터타입 추상메소드명(parameters, ...);

추상 메소드를 선언하는 첫번째 목적은 서브클래스에서 이 메소드를 반드시 구현하도록 만들기 위해서이다.

final 키워드

final 키워드를 쓰이는 곳에서는 그 대상이 더 이상은 변경될 수 없다는 의미이다.

  • 변수에 사용

변수의 값이 변경될 수 없게 할 때 사용한다.

private static final long serialVersionUID = -6849794470754667710L;
  • 클래스에 사용

final 클래스로 상속을 허용하지 않는다. 그러므로 final로 지정된 클래스는 하위 클래스를 가지지 못한다.

final class A{
...
}
  • 메소드에 사용

final 메소드, 하위 클래스에서 메소드 오버라이딩하여 사용할 수 없다는 의미이다.

class A{
	final void doSomethig(){
		...
	}
}

Object 클래스

java.lang.Object 클래스는 모든 클래스의 최상위 부모 클래스
모든 객체는 자동적으로 java.lang.Object 클래스를 상속해 별도로 extends를 사용하지 않는다. 자바에서 사용하는 모든 클래스들은 Object 클래스의 서브클래스이다. 클래스에서 명시적으로 상속되는 상위 클래스를 지정하지 않으면 묵시적으로 Object 클래스로부터 상속된 것으로 간주한다.

클래스 객체를 toString() 시 “클래스 이름@16진수 출력” 은 java.lang.Object 클래스의 toString()이 호출 된 것이다.


참고 서적

뇌를 자극하는 Java 프로그래밍
알기 쉽게 해설한 Java
열형강의 객체 중심 Java


live-study with whiteship