Programming

; develop a program

Back-End/Java

[Java] 상속에서 클래스 생성과 형 변환

Clloud_ 2023. 2. 5. 13:39
반응형

하위 클래스가 생성될 때는 상위 클래스의 생성자가 먼저 호출된다.

상속 관계에서 클래스의 생성과정을 보면 하위 클래스가 상위 클래스의 변수와 메서드를 사용할 수 있는 이유와 하위 클래스가 상위 클래스의 자료형으로 형 변환을 할 수 있는 이유를 이해할 수 있다.

 

이번 포스팅에서는 자바(Java)에서 상속의 클래스 생성과 형 변환에 대하여 공부를 해보고자 한다.

 


상속에서의 클래스 생성

상속을 받은 하위 클래스는 상위 클래스의 변수와 메서드를 사용할 수 있다.

변수를 사용할 수 있다는 것은 그 변수를 저장하고 있는 메모리가 존재한다는 뜻이다.

 

상위 클래스를 상속받은 하위 클래스가 생성될 때는 반드시 상위 클래스의 생성자가 먼저 호출된다.

그리고 상위 클래스 상성자가 호출될 때 상위 클래스의 멤버 변수가 메모리에 생성된다.

상위 클래스의 생성자가 먼저 호출되어 상위 클래스의 변수와 메서드가 메모리에 올라가야 하위 클래스들이 이를 메모리에서 가져와 사용할 수 있다.

 


super 예약어

super 예약어는 하위 클래스에서 상위 클래스로 접근할 때 사용한다.

하위 클래스는 상위 클래스의 주소, 즉 참조 값을 알고 있다.

이 참조 값을 가지고 있는 예약어가 super이다.

또한, super는 상위 클래스의 생성자를 호출하는 데도 사용한다.

this 예약어가 자기 자신의 참조 값을 가지고 있는 것과 같다고 생각하면 된다.

 

 

상위 클래스를 호출하는 코드가 없는데 하위 클래스의 생성자가 상위 클래스를 호출하는 이유

  • 하위 클래스 생성자에서 super( )를 자동으로 호출한다.
  • super( )를 호출하면 상위 클래스의 디폴트 생성자가 호출된다.

 

예제

class Dog extends Animal {
    public Dog () {
    	super();			//자동으로 추가한 코드
        System.out.println("I'm dog");	//원래 생성자에 있던 코드
    }

class Animal {
    protected String name = "animal";
    public Animal () {			//디폴트 생성자
        System.out.println("I'm animal);
    }
}

public static void main(String[] args) {
    Dog dog = new Dog();
}
  • Dog dog = new Dog( );로 Dog객체의 생성자를 부르면 컴파일러가 자동으로 super( )를 호출하여 상위 클래스의 디폴트 생성자가 호출된다.
  • 위와 같은 디폴트 생성자가 아닌 매개변수를 받는 생성자는 자동으로 자동으로 호출되지 않는다.
  • 따라서 명시적으로 호출을 해줘야 한다.

 

Dog 클래스에서 Animal클래스의 name이라는 변수를 바꾸는 changeName함수를 작성한다고 하면 다음과 같이 작성할 수 있다.

class Dog extends Animal {
    public Dog () {
        super();				//컴파일러가 자동으로 추가한 코드
        System.out.println("I'm dog");	//원래 생성자에 있던 코드
    }

public void changeName() {
    super.name = "dog";
    }
}

 


상속에서의 형 변환(업캐스팅)

상위 클래스 형으로 변수를 선언하고 하위 클래스 인스턴스를 생성할 수 있다.

하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로 묵시적 형 변환이 가능하다.

 

형 변환된 vc가 가리키는 것

 

  • VIPCustomer( ) 생성자의 호출로 인스턴스는 모두 생성되었지만 타입이 Customer이므로 접근할 수 있는 변수나 메서드는 Customer의 변수와 메서드이다.

 


반응형

'Back-End > Java' 카테고리의 다른 글

[Java] 다형성(polymorphism)  (0) 2023.02.06
[Java] 메서드 오버라이딩(method overriding)  (0) 2023.02.06
[Java] 상속(inheritance)  (0) 2023.02.05
[Java] 배열 응용 프로그램  (0) 2023.02.05
[Java] ArrayList 클래스  (0) 2023.02.04