본문 바로가기

Etc../SWExpertAcademy

[Java Programming] 객체지향 핵심 원리(5)

자바의 상속

■ 상속(Inheritance)

상속의 개요

  • 부모 클래스의 모든 것을 자식 클래스가 물려받는 것
  • extends 예약어 사용 ( 상속은 부모의 기능에서 추가적인 것들을 확장한다는 의미 )
  • 상속을 통해 소스코드의 재사용성이 보장되며, 가독성이 높아짐
  • 부모 / 자식 간 is a~ 관계에 존재해야함
  • 부적절한 상속은 소스코드에 대한 분석과 개발을 어렵게 만듦
  • 자바에서는 단일 상속만 허용

상속과 생성자

  • 자식클래스는 부모 클래스들이 가지고 있는 모든 멤버와 자기 클래스가 갖는 모든 멤버를 가짐
  • 초기화를 위해 자식 클래스가 호출되면 부모 클래스의 생성자가 먼저 초기화하고 자식 클래스의 생성자를 통해 초기화됨.
class SuperClass{
    int n1;

    public SuperClass(){
        System.out.println("SuperClass 생성");
        n1 = 100;
    }
}

class SubClass extends SuperClass{
    int n2;

    public SubClass(){
        System.out.println("SubClass 생성");
        n2 = 10000;
    }
}

public class ConstructorTest{
    public static void main(String[] args){
        subClass sub = new SubClass();    // 부모 클래스의 생성자 호출 뒤 자식 클래스의 생성자 호출
        System.out.println(sub.n1);        // 100이 출력됨
        System.out.println(sub.n2);        // 10000이 출력됨.
    }
}



자식클래스를 생성할 때 부모클래스에 기본 생성자가 없다면 오류 발생

class SuperClass{
    int n1;

    public SuperClass(int n1){                    // 매개변수가 있는 생성자를 정의했기 떄문에
        System.out.println("SuperClass 생성");    // 기본 생성자가 자동으로 제공되지 않음 
        this.n1 = n1
    }
}

class SubClass extends SuperClass{
    int n2;

    public SubClass(){                            //부모 클래스의 기본생성자가 없기 때문에
        System.out.println("SubClass 생성");        // 컴파일이 되지 않음
        n2 = 10000;
    }
}

public class ConstructorTest{
    public static void main(String[] args){
        subClass sub = new SubClass();        
    }
}



this()
  • 클래스 안에서 Overloading된 또 다른 생성자를 호출하기 위해 사용

부모 생성자 super()
  • 부모 클래스의 생성자를 명시적으로 호출할 때 사용
  • 부모 클레스의 생성자가 Overloading되어 여러개 존재하는 경우 특정 생성자를 호출하기 위해 사용
  • super()는 반드시 생성자의 첫 번째 라인에 위치해야 함.


■ 상속과 멤버

변수의 상속

  • 상속 시 부모 클래스들이 가지고 있는 모든 멤버를 가져오지만 private로 정의된 변수는 상속되지 않음
  • 동일한 이름으로 자식 클래스에 정의된 변수는 상속에서 제외됨

this 예약어
  • 생성된 객체 자신에 대한 참조를 의미.
  • 멤버 변수와 메서드 매개변수의 이름이 같을 경우 이를 구분하기 위해 사용함.

super 예약어
  • 부모 객체에 접근할 수 있는 참조변수로 사용함
  • 부모 클래스와 자식 클래스에 자료형이 다르고 같은 이름을 가진 변수가 있을 때 this/super 예약어를 사용하여 호출할 수 있음

메서드의 상속

  • 부모 클래스가 가지고 있는 메서드가 자식 클래스로 상속되어 자식 클래스에서 사용 가능함
  • 재정의 하지 않으면 부모 클래스의 메서드와 동일한 기능의 메서드를 재사용함

메서드 Overriding

  • 부모 클래스의 메서드를 재사용하지 않고 새롭게 정의하여 사용하는 것
  • 부모 클래스의 메서드 이름, 매개변수의 유형과 개수가 동일해야 함
class SuperClass{
    void print(String str){
        System.out.println("SuperClass 의 print호출");
    }
}
class SubClass extends SuperClass{
    void print(){                // 매개변수가 다르므로 Overlodaing
        System.out.println("SubClass의 print()호출");
    }

    void print(String str){        //overriding
        System.out.println("SubClass의 print(String str)호출")
    }
}

SubClass 클래스에는 print(String str)과 print() 두개의 메서드가 Overloading 되어 있음

부모 클래스의 메서드를 그대로 사용하고 overriding하고 싶다면 super()예약어를 이용하면 됨.






[참고] : SWExpertAcademy