본문 바로가기
컴퓨터 공부/JAVA

2022-09-06 상속

by 구깨비 2022. 9. 6.

상속


일반적으로 상속은 부모가 자식에게 재산을 물려주는 것을 뜻한다. 이와 유사하게 자바의 프로그래밍에서도 상속이 쓰이는데 부모클래스의 필드,메소드를 자식 클래스에게 물려주는 것이다.

 

public class A{
    String str="안녕하세요";
    String str2="안녕못합니다";

    void hello(){
        System.out.println("부모 A의 인사");
    }
}

//이를 class B가 물려 받을 경우, extend를 사용하면 된다.

public class B extends A{
	
}

public class Main {
    public static void main(String[] args) {

       B b = new B();
       b.hello();
       System.out.println(b.str2)
    }
}

결과는 부모A의 메소드를 그대로 사용해서 오는 것을 볼 수 있다.

super과 super()


 

public class Main {
    public static void main(String[] args) {

       B b = new B();
    }
}

이 코드에서 B 클래스의 인스턴스만 생성될 것으로 보이지만 실제로는 내부에 부모클래스인 A객체가 먼저 생성되고 B객체가 생성된다.

B클래스를 만들어 줄 때 아무런 생성자를 써주지 않았지만, B의 생성자안에는 super()이라는 부모의 기본 생성자 호출 코드가 B의 기본 생성자 맨 윗줄에 들어가 있다.

public class B extends A{
    B() {
        super();
    }
}

즉, 이런 형태인 것이다.

 

 

여기서 super과 super()의 차이는 무엇일까?

super : 부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수

super() : 부모의 기본생성자 호출

 

 

public class B extends A{
    B() {
        super();
        System.out.println(super.str);
    }
}

public class Main {
    public static void main(String[] args) {

       B b = new B();
    }
}

super는 부모인 A클래스의 필드인 str에 접근하여 그 값을 가져오는 것을 볼 수 있다.

오버라이딩


오버라이딩이란 부모클래스로부터 상속받은 메소드를 재정의 하는 것을 말한다.

public class A{
    String str="안녕하세요";
    String str2="안녕못합니다";

    void hello(){
        System.out.println("부모 A의 인사");
    }
}

//이를 class B가 물려 받을 경우, extend를 사용하면 된다.

public class B extends A{
	B() {
        super();
        System.out.println(super.str);
    }
    
    //*********오버라이딩 해준 모습이다. @Override어노테이션을 달아주면 컴파일과정에서 문제가 있는지 확인할 수 있다.**************
    @Override   
    void hello(){
        System.out.println("자식 B의 인사");
    }
    
}

public class Main {
    public static void main(String[] args) {

       B b = new B();
       b.hello();
    }
}

부모의 hello 메소드가 자식이 재정의한 hello로 출력되는 것을 볼 수 있다.


추가적인 궁금증이 있다.

자식 클래스에서 super()을 통해 내부적으로 객체를 생성해준다면 상속시에는 매번 부모의 인스턴스를 생성한다는 뜻일까? 그럼 부모A와 자식B의 객체 총 2개가 생성되는 것일까?

이를 알아보기 위해 테스트를 해보았다.

여기서는 hashcode()가 사용되었는데 자바에서는 주소값이 동일하면 hashcode()또한 동일하게 나온다.

class A{
    void showAHashCode(){
        System.out.println("클래스A의 해시코드는:: "+ this.hashCode());
    }
}
class B extends A{
	String str="나는 비!";
    void showBHashCode(){
        System.out.println("클래스B의 해시코드는:: "+ this.hashCode());
    }
}

class C extends B{
    void showCHashCode(){
        System.out.println("클래스C의 해시코드는:: "+ this.hashCode());
    }
    
}

public class Main {
    public static void main(String[] args) {
        C c= new C();
        c.showAHashCode();
        c.showBHashCode();
        c.showCHashCode();
    }
}

 

즉, 하나의 객체로 이루어져 있다. 

또한, 메모리 메소드 영역내에서 부모와 자식클래스가 구분되어 올라가기 때문에 

형변환이 가능하다.

이를 메모리 그림으로 정리하여 마무리 하겠다.

 

 

 

 

출처:

(블로그)https://blog.naver.com/honnynoop/22805940

'컴퓨터 공부 > JAVA' 카테고리의 다른 글

2022-09-07 추상클래스와 인터페이스  (0) 2022.09.07
2022-09-05 객체 기초  (0) 2022.09.05
multi-thread 동기화(synchronization)  (0) 2021.09.13
자바 Thread  (0) 2021.09.13
제네릭 프로그래밍  (0) 2021.08.26

댓글