자바의 형 변환

kyw·2025년 9월 15일

Java

목록 보기
1/13

자바의 형변환: 기본형과 참조형

자바에서 형변환(Type Casting)이란, 변수나 값의 데이터 타입을 다른 타입으로 바꾸는 것. 형변환은 크게 두 가지로 나뉜다. 실제 값의 형태와 크기를 바꾸는 '기본형(Primitive Type) 변환'과 객체를 가리키는 참조 변수의 타입을 바꾸는 '참조형(Reference Type) 변환'이다.

  1. 기본 형변환

Int, double, char 등 8개 기본 데이터 타입 사이에서 일어나는 변환. 이것은 다시 두 가지로 구분된다.

  • 자동 형변환
    작은 크기의 데이터 타입을 큰 크기의 데이터 타입으로 변환할 때 자바 컴파일러가 자동으로 처리한다. 데이터가 손실될 염려가 없기 때문이다. 작은 컵의 물을 큰 컵으로 옮겨 담는 것과 같다.
  • 강제 형변환
    큰 크기의 데이터 타입을 작은 크기의 데이터 타입으로 변환할 때는 프로그래머가 직접 변환할 타입을 지정해야 한다. 이 과정에서 데이터의 일부가 잘려나가거나 전혀 다른 값으로 변하는 데이터 손실(Data Loss)이 발생할 수 있다. 큰 컵의 물을 작은 컵으로 옮길 때 물이 넘치는 것과 같다.
double doubleValue = 3.14;
int intValue = (int) doubleValue; // double(8) -> int(4), 강제 변환
System.out.println(intValue); // 출력: 3 (소수점 이하 데이터 손실 발생)

int intValue2 = 300;
byte byteValue = (byte) intValue2; // int(4) -> byte(1), 강제 변환
// byte의 표현 범위(-128 ~ 127)를 초과하여 데이터 손실(overflow) 발생
System.out.println(byteValue); // 출력: 44 (예상치 못한 값)
  1. 참조 형변환(업캐스팅)

String, Animal 등 클래스로 생성된 객체를 가리키는 참조 변수(리모컨)의 타입을 변환하는 것. 상속 관계에 있는 클래스 사이에서만 변환이 가능하다.

핵심: 참조형 변환은 힙(Heap) 메모리의 실제 객체를 바꾸는 것이 아니라, 그 객체를 가리키는 참조 변수(리모컨)가 사용할 수 있는 멤버의 범위를 조절하는 것이다.

  • 자동 형변환

자식 클래스 타입의 참조 변수를 부모 클래스 타입의 참조 변수로 변환하는 것.

특징
-업캐스팅된 참조 변수는 부모 클래스에 정의된 멤버에만 접근할 수 있다.

-자식 클래스에서 오버라이딩한 메서드가 있다면, 호출 시 재정의된 메서드가 실행된다. (다형성)

class Animal {
    void cry() {
        System.out.println("동물이 웁니다.");
    }
}

class Cat extends Animal {
    @Override
    void cry() {
        System.out.println("야옹!");
    }
    void grooming() {
        System.out.println("그루밍을 합니다.");
    }
}

// 업캐스팅
Animal animal = new Cat(); // Cat 타입이 Animal 타입으로 자동 형변환
animal.cry(); // 실행 결과: "야옹!" (오버라이딩된 메서드 실행)
// animal.grooming(); // 컴파일 에러! Animal 리모컨에는 grooming() 버튼이 없음
  • 강제 형변환(다운캐스팅)

부모 클래스 타입으로 업캐스팅되었던 참조 변수를 다시 원래의 자식 클래스 타입으로 변환하는 것. 부모 타입 리모컨을 자식 타입 리모컨으로 바꾸어 자식 클래스에만 있는 멤버에 접근하기 위해 사용된다.

특징
-반드시 명시적으로 (변환할 자식 타입)을 지정해야 한다.

-실제 가리키는 객체가 변환하려는 자식 타입이 아닐 경우, ClassCastException이라는 런타임 오류가 발생할 수 있다.

-따라서 변환 전 instanceof 연산자로 실제 객체의 타입을 확인하는 것이 안전하다.

Animal animal = new Cat(); // 업캐스팅된 상태

// 안전하지 않은 다운캐스팅 (오류 가능성 있음)
// Cat cat = (Cat) animal;

// 안전한 다운캐스팅 (instanceof 사용)
if (animal instanceof Cat) {
    Cat cat = (Cat) animal; // Cat 타입으로 강제 형변환
    cat.cry();      // 실행 결과: "야옹!"
    cat.grooming(); // 실행 결과: "그루밍을 합니다." (이제 grooming() 메서드 접근 가능)
}
  • instanceof 연산자
    자바의 연산자 중 하나로, 참조 변수가 가리키는 실제 객체(인스턴스)가 특정 클래스 타입이나 인터페이스 타입인지 확인하는 데 사용된다. 결과는 true 또는 false의 boolean 값으로 반환된다.
참조_변수 instanceof 확인할_타입(클래스 또는 인터페이스) 
profile
作心百日

0개의 댓글