본문 바로가기
Java

[Java] 묵시적 형변환, 명시적 형변환

by ete-llorona 2023. 1. 8.

자바에서 클래스의 상속 관계에서 중요하게 다뤄지는 부분 중 하나는 묵시적 형변환, 명시적 형변환이라는 개념이다.

교재에 따라 묵시적 형변환은 자동 타입 변환(Promotion), 명시적 형변환은 강제 타입 변환(Casting) 이라고도 부른다.

오늘은 클래스의 상속 관계를 공부하면서 이 부분에 대한 내용을 정리해보려고 한다.

 

 

1. 묵시적 형변환

 

묵시적 형변환, 자동 타입 변환(Promotion)은 자식 클래스로 생성된 객체가 부모 클래스로 형변환하는 것을 의미한다.

 

// Animal.java
public class Animal {

    String field1;

    void method1() {
        System.out.println("Animal method1()");
    }

    void method2() {
        System.out.println("Animal method2()");
    }

}

// Cat.java
public class Cat extends Animal {

    String field2;

    @Override
    void method2() {
        System.out.println("Cat method2()");
    }

    void method3() {
        System.out.println("Cat method3()");
    }

}


// CatExample.java
public class CatExample {
    public static void main(String[] args) {

        Animal animal = new Cat(); // 묵시적 형변환, 자동 타입 변환(Promotion)
        animal.field1 = "필드1";
        animal.method1(); // Animal method1() 출력
        animal.method2(); // Cat method2() 출력

        //animal.field2 = "필드2"; // 불가
        //animal.method3(); // 불가

    }
}

 

이 경우에는 Cat 클래스는 Animal 클래스에 선언된 필드와 메소드만 접근할 수 있지만,

메소드가 Cat 클래스에서 오버라이딩된 경우, Cat 클래스에서 재정의한 메소드의 호출이 가능해진다.

 

 

 

2. 명시적 형변환

 

명시적 형변환, 강제 타입 변환(Casting)은 부모 클래스의 타입을 갖는 객체가

자식 클래스 타입으로 형변환 하는 것을 의미한다.

 

이는 자식 클래스로 생성된 객체가 부모 클래스로 형변환 된 상태,

즉, 묵시적 형변환이 발생한 경우에 한해서 원래 자식 타입으로 강제 타입 변환을 할 수 있는 것을 의미한다.

 

앞에서 animal 객체는 자식 클래스인 Cat 으로 인스턴스가 생성되었지만,

부모인 Animal 타입으로 묵시적 형변환이 발생했다.

 

묵시적 형변환이 발생하면, 부모 클래스에서 선언된 필드와 메소드 또는,

Cat 클래스에서 오버라이딩 된 메소드만 호출할 수 있기 때문에,

Cat 클래스에서 선언된 필드, 메소드를 이용하려면 명시적 형변환, 강제 타입 변환을 해주어야 한다.

 

// CatExample.java
public class CatExample {
	public static void main(String[] args) {
    
    	Animal animal = new Cat(); // 묵시적 형변환, 자동 타입 변환(Promotion)
        animal.field1 = "필드1";
        animal.method1(); // Animal method1() 출력
       	animal.method2(); // Cat method2() 출력
        
        //animal.field2 = "필드2"; // 불가
        //animal.method3(); // 불가
        
        Cat cat = (Cat) animal; // 명시적 형변환, 강제 타입 변환(Casting)
        cat.field2 = "필드2";
        cat.method3(); // Cat method3() 출력
        
    }
}

 

이렇게 명시적 형변환을 하면 Cat 클래스에서 선언된 필드와 메소드를 이용할 수 있게 된다.

추가적으로, 어떤 객체가 어떤 클래스의 인스턴스인지 확인하려면 instanceof 연산자를 활용하면 된다.

 

boolean result = animal instanceof Cat; // animal 객체가 Cat 클래스의 인스턴스인지 확인

 

 

 

참고 서적: '이것이 자바다', 신용권, 한빛미디어

'Java' 카테고리의 다른 글

[Java] 입력 - Scanner, BufferedReader  (0) 2023.01.07

댓글