클래스 상속과 다형성의 메모리 구조

2020. 3. 20. 11:01Programming Language/Java

상속

class CellPhone {
    String model;
    String color;

    void method() {
    } //메소드
}

class DmbCellPhone extends CellPhone {
    int channel;

    DmbCellPhone(String model, String color, int channel) {
        this.model = model;
        this.color = color;
        this.channel = channel;
    }

    void method2() {
    }
}

 음 부모클래스 CellPhone이 자식클래스 DmbCellPhone를 상속하고 있는데 , 자식클래스의 객체를 생성하면 메모리영역에서의 힙영역에서는 부모객체와 자식객체가 같이 생성된 것을 볼 수 있다 . 모든 객체는 클래스의 생성자를 호출해야만 생성되는데, 여기서 부모클래스를 상속받은 자식클래스의 객체를 생성했을 때 부모객체와 자식객체가 같이 생성 되었다라는 것은 자식 생성자에서 부모생성자를 호출 했다는 말이다, 자식 생성자에서 부모 생성자를 명시적으로 선언하지 않았다면, 컴파일러는 super()키워드로 자동으로 생성한다. 여기서 super()키워드는 부모객체의 주소를 가지고 있다.

 

 

여기서 상속이 다형성의 개념으로 이어지는데 메모리구조를 보면

 

다형성

class Animal{
}
class Cat extends Animal {               // 간단하게 예시로 작성
    
}
Cat cat = new Cat();
Animal animal = cat;          // 이 두줄이 Animal animal = new Cat(); 이거임.

 여기에서 보면 cat이라는 자식클래스의 객체를 Animal animal 이라는 부모클래스타입과 참조변수에 = 연산으로 대입을 시키면 부모타입으로 자동타입변환이 일어난다. 이 것을 메모리측면에서 보면 cat이라는 객체는 힙 영역에 부모객체와 자식객체를 둘다 가지고 있는데, 스택영역에 저장된 cat참조변수는 자식객체의 주소를 가지고 있고, 이것을 Animal 타입의 animal참조변수에 대입을 시키는 것임으로 animal 은 cat의 객체의 주소를 그대로 사용할 수 있게 되지만, 선언시에 Animal 클래스타입으로 선언했기에 접근은 부모객체를 접근하는게 된다. (부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근 가능)

 1차원으로 주소를 넘겨줬다라고 이해해도 되는부분이고 , 다차원의 공간개념으로 공간에 넣었다고 이해해도 문제가 없다. 실제로 instanceof 연산자를 사용해서 객체참조를 확인해보면, 자식객체의 주소를 가지고 있다라는 것을 확인할 수 있다. 나는 하나하나 일일히 확인다해봄.

여기 부모타입으로 자동타입변환이 일어난 상태에서, 메소드가 자식 클래스에서 재정의되었다면 자식클래스의 메소드를 대신 호출하는 다형성과 관련된 성질을 이용하면 된다.