업캐스팅 & 다운캐스팅

조용근·2024년 2월 6일

자바 정리

목록 보기
5/21

캐스팅

변수나 반환값의 데이터 타입을 다른 타입으로 변환하는 과정

  • 자동(묵시적) 캐스팅 , 강제(명시적) 캐스팅으로 나뉜다.

자동(묵시적) 캐스팅

프로그램에서 명시적으로 캐스팅 연산자를 사용하지 않아도 자바 컴파일러가 자동으로 타입을 변환해주는 경우를 말한다. 보통은 작은 크기의 데이터 타입에서 큰 크기의 데이터 타입으로 변환할 때 사용한다.
// 예를 들어, 'int'에서 'long'으로, 'float'에서 'double'로 변환할 때 사용한다.

int I = 100;
long L = I; //int에서 long으로 자동캐스팅
double D = L; // long에서 double로 자동캐스팅

강제(명시적) 캐스팅

사용자가 직접 캐스팅 연산자를 사용해서 명시적으로 타입을 변환하는 경우를 말한다. 보통 큰 크기의 데이터 타입에서 작은 크기의 데이터 타입으로 변환할 때 사용한다.

double D = 9.0;
int I = (int)D; //double에서 int로 강제 캐스팅

업캐스팅(Upcasting)

자식 클래스 타입의 객체를 부모 클래스 타입으로 참조 변환하는 것을 말한다.

  • 업캐스팅은 자동으로 변환된다.

다운캐스팅(Downcasting)

부모 클래스 타입의 객체를 자식 클래스 타입으로 참조 변환하는 것을 말한다.

  • 다운캐스팅은 명시적으로 변환한다. 프로그래머가 캐스팅 연산자를 이용해서 명시적으로 타입 변환을 해야 한다.
  • instanceof : 안전하게 다운캐스팅을 수행하기 위해, 'instanceof' 연산자를 사용해서 참조가 실제로 변환하려는 자식 클래스 타입의 인스턴스를 참조하는지 확인해야 한다.
package javaplus.casting;

public class CastingEx {
    public static void main(String[] args) {
        Animal animal = new Dog(); // 업캐스팅: Dog 객체를 Animal 타입으로 참조
        animal.eat();

        //다운캐스팅 전에 instanceof를 사용하여 안전하게 확인
        if(animal instanceof Dog){
            Dog dog = (Dog) animal; //다운캐스팅: Animal 타입을 Dog 타입으로 명시적 변환
            dog.bark();
        }
    }
}
class Animal{
    public void eat(){
        System.out.println("이 동물이 음식을 먹습니다.");
    }
}
class Dog extends Animal{
    public void bark(){
        System.out.println("개가 짖습니다.");
    }
}

instanceof

자바에서 객체의 타입을 검사하는 데 사용되는 연산자이다. 이 연산자는 주어진 객체가 특정 클래스나 인터페이스의 인스턴스인지, 자식 클래스의 인스턴스인지 확인할 때 사용한다.
'instanceof'연산자의 사용은 객체 지향 프로그래밍에서 타입 안전성을 보장하고, 클래스 캐스팅 예외를 방지하는 데 사용한다.

사용방법

object instanceof Name

이 코드에서 'object'는 검사하고자 하는 객체를 말하고, 'Name'은 해당 객체가 속할 수 있는 클래스 or 인터페이스의 이름을 나타낸다. 연산의 결과는 'boolean'값으로 나타낸다.

  • 객체가 지정된 클래스/인터페이스의 인스턴스이거나 해당 클래스의 서브 클래스/인터페이스 구현체의 인스턴스인 경우
    --> TRUE
    그렇지 않은 경우 --> FALSE
package javaplus.casting;

public class InstanceofEx {
    public static void main(String[] args) {
        People p = new People();
        Me m = new Me();
        People p2 = new Me();

        System.out.println(p instanceof People);//true
        System.out.println(m instanceof Me);//true
        System.out.println(m instanceof People);//true, Me는 People의 자식 클래스이다.
        System.out.println(p instanceof Me);//false, People 인스턴스는 Me의 인스턴스가 아니다.
        System.out.println(p2 instanceof Me);//true, p2는 Me의 인스턴스롤 참조한다.
    }
}
class People{}
class Me extends People{}

주의점

  • 'null'값에 대해 'instanceof'를 사용하면 항상 'false'를 반환한다.
  • 'instanceof' 연산자는 클래스의 상속 관계 또는 인터페이스 구현관계에서만 의미가 있다.
    상속 관계가 아닌 무관한 클래스 타입을 검사하면 컴파일 에러가 난다.

인스턴스

인스턴스가 나온김에 다시 한번 짚고 넘어가자.
인스턴스(instance)는 객체 지향 프로그래밍에서 클래스(class)로부터 생성된 객체(object)를 의미한다.
여기서 클래스는 붕어빵(객체)을 만들기 위한 붕어빵 기계라고 볼 수 있고, 인스턴스는 이 붕아빵 기계를 바탕으로 실제로 생성된 것이다.

더 나은 이해를 위해 집 설계를 예로 들어보면, 집을 설계하기 위해서는 설계도가 필요하다. 이 설계도에는 집을 구성하는 방의 개수, 문, 창문의 개수, 위치 등 집을 지을 때 필요한 구체적인 정보가 들어가 있다.
여기서 설계도는 '집'이라는 클래스에 해당하고, 이 설계도를 사용하여 실제로 지어진 각각의 집들이 인스턴스에 해당된다.

package javaplus.casting;

public class InstanceEx {
    public static void main(String[] args) {
        //Game 인스턴스 생성
        Game mygame = new Game("fifa","lol");
        Game yourgame = new Game("overwatch","suddenattack");

        //생성된 인스턴스를 사용해서 정보 출력
        mygame.displayInfo();
        yourgame.displayInfo();

    }
}

class Game{
    //Game 클래스의 속성(필드)
    String game1;
    String game2;
    //Game 클래스의 생성자
    Game(String game1, String game2){
        this.game1 = game1;
        this.game2 = game2;
    }
    //자동차 정보를 출력하는 메서드
    void displayInfo(){
        System.out.println("게임 1: " + game1 +  " 게임 2: " + game2);
    }
}

즉, 인스턴스는 클래스에 정의된 속성과 기능을 실제로 가지고 있는 구체적인 객체를 말한다.

profile
Today I Learn

0개의 댓글