Java 입문 | 클래스(Class) | 상속(Inheritance)


상속은 계층적인 분류를 생성해 주는 객체지향 프로그램에서 중요한 개념 중에 하나이다. 여러 클래스들이 가져야 할 공통된 항목들만 모와 일반적인 클래스를 생성할 수 있는 모듈의 재사용성(reusing)과 코드의 간결성을 제공해준다.

상속되는 상위 클래스를 슈퍼 클래스(Super Class) 또는 부모 클래스(Parent Class)라 하고, 상속을 받는 하위 클래스를 (서브 클래스, Sub Class), 또는 자식 클래스(child class)라고 한다.

기존 상위 클래스로 부터 모든 속성과 메소드를 상속 받고, 더 필요한 속성과 메소드를 추가하여 새로운 클래스를 생성 할수 있다.

자바에서의 모든 클래스는 상위 클래스를 가진다. 자바 프로그램에서 사용할 수 있는 클래스중에 최상위 클래스는 java.lang.Object 클래스이다. 즉 자바 프로그램에서 모든 클래스는 Object 클래스의 하위 클래스가 되는 것이다. 명시적으로 상위 클래스를 명시하지 않으면 묵시적으로 Object를 상속하는 것으로 간주한다.

자바에서 상속을 받게 하려면 새로운 클래스 이름 뒤에 extends와 상속받고자 하는 클래스를 입력해주시면 된다.

[public/final/abstract class 클래스 이름 extends 상위클래스 이름 {
    // 맴버변수 선언
    // 생성자
    // 메소드 선언
}

예제 1)

package com.devkuma.tutorial.inheritance;

public class Parent {

    int a;
    int b;

    public int sum() {
        return a + b;
    }
}
package com.devkuma.tutorial.inheritance;

public class Child extends Parent {

    public int multiply() {
        return a * b;
    }
}
package com.devkuma.tutorial.inheritance;

public class Inheritance {

    public static void main(String[] args) {

        Child child = new Child();

        System.out.println("sum=" + child.sum());
        System.out.println("multiply=" + child.multiply());
    }
}

실행 결과:

sum=5
multiply=6

예제를 살펴보면 Parent 클래스를 Child 클래스가 상속을 받았고, Inheritance에서 Child를 상속 받아서 sum 메소드와 multiply 메소드의 결과를 표시해주었다. 이는 Child 클래스가 Parent의 맴버 변수 a, b와 메소드 sum을 상속 받았기에 sum 메소드를 호출 할 수 있었고, multiply메소드에서 Parent 클래스의 맴버 변수 a, b를 사용할 수 있었다.

super 예약어

super는 상속 관계에서 하위 클래스가 상위 클래스의 맴버에 접근하기 위해서 사용하는 예약어(keyword)이다.

  • 하위 클래스의 의해 가려진 상위 클래스의 맴버변수나 메소드에 접근할 때 사용한다.
  • 상위 클래스의 생성자를 호출하기 위해 사용한다.
super.객체변수
super.메소드(매개변수)

메소드 오버라이딩(Overriding)

상속관계에서 하위 클래스의 메소드가 상위 클래스의 메소드와 같은 이름으로 선언될 때, 서브 클래스의 메소드는 상위 클래스의 메소드를 오버라이딩(Overriding)한다고 한다.

오버라이딩은 상위 클래스의 메소드와 하위 클래스의 메소드가 메소드 이름은 물론 매개변수의 타입과 개수, 리턴 타입까지도 같아야 한다. 만약 메소드의 이름은 일치하는데 메소드의 매개변수의 개수나 타입이 다르다면 상속 관계이기 때문에 메소드의 오버로딩(Overloading)이 되는 것이다.

상속 관계의 클래스에서 메소드가 오버라이딩 되었다면 상위 클래스의 메소드가 하위 클래스에 의해 숨겨지게 된다. 하위 클래스의 객체에서 상위 클래스에서 오버라이딩된 메소드를 사용하려면 예약어 super를 이용한다.