공부 기록/개념정리

박싱 vs 언박싱 , 타입 캐스팅

코딩걈자 2024. 4. 7. 14:41
반응형

박싱,  언박싱

  • 박싱 : 기본 타입의 데이터를 해당 기본 타입의 래퍼 클래스(Wrapper class)으로 변환하는 과정
  • 언박싱 : 래퍼 클래스의 객체를 원시타입의 값으로 변환하는 과정
  • 오토박싱: 자동으로 변환이 일어나는 것
  • ex) int <->Integer
Integer boxInt=new Integer(9);
Integer autoBoxInt=8;

int unboxingInt=boxInt.intValue();
int autoUnboxing=boxInt;
  • 원시 타입과 참조 타입간의 전환이 필요한 상황에서 객체 지향적 프로그래밍 기능을 활용하기 위해서 사용
    • 원시타입(기본타입)의 경우 모두 메모리에 직접 값을 저장하므로 효율적이지만 모든 특징을 활용하기 어려움
    • 참조타입의 경우 메모리에 참조 주소를 저장하여 메모리가 비효율적이지만 다양한 기능 적용 가능
    • 박싱은 기본데이터 타입을 객체로 다룰 수 있게 해줌
    • 원시 타입을 담을 수 없는 컬렉션일 경우, 박싱 후에 다시 언박싱하여 사용
      • 제네릭을 사용하는 컬렉션 클래스들은 객체를 요구
    • 래퍼 클래스의 메서드 사용 가능, 다형성 및 객체 지향적 설계, 메서드 오버로딩
  • 단점
    • 기본 타입의 데이터가 힙 영역에 할당되는 객체로 변환되기 때문에 메모리 사용량 증가
    • 오버헤드 발생 (힙에 메모리 할당 -> 스택의 값을 복사 -> 힙 메모리 주소 값을 갖는 새로운 스택 메모리 할당)
    • 언박싱 과정에서 가비지 생성
    • 레퍼 클래스는 null값을 가질 수 없음 => nullPointerException
    • 비교연산자 주의, equals()
int num1 = 100;
Integer num2 = num1;
Boolean bt1 = true; 

Integer num3 = new Integer(10); 
int n = num3.intValue();

타입 캐스팅

  • 형변화나 , 타입을 변환하는것
  • 자동 타입 변환( char->short->int->long->float->double->long double) : 작은타입에서 큰 타입으로는 자동 변환
  • 명시적 타입 캐스팅(강제적) : 괄호로 강제 변환 ,  큰 타입의 변수를 작은 타입으로 변환, 데이터 손실 위험

자바의 캐스팅

  • 상속 관계에 있는 부모와 자식 클래스간의 형변환
  • 형제 클래스끼리는 불가능
  • 업캐스팅 : 자식 클래스가 부모 클래스 타입으로 캐스팅
    • 다형성을 위해 구현 => 업캐스팅 후 메소드를 실행할 때,  자식 클래스에서 오버라이딩한 메서드가 있을 경우,  오버라이딩 된 메서드가 실행됨 => 런타임 환경에서 동적으로 바인딩 되었기 때문
    • 기존의 자식클래스의 요소 접근 불가능
    • 상속받은 서브 클래스가 몇 개이든 하나의 인스턴스로 묶어서 관리할 수 있음
    • 유지보수 가능하고 확장 가능한 유연성을 제공
  • 다운 캐스팅
    • 부모 클래스 타입의 참조를 자식 클래스 타입의 참조로 변환
    • 자신의 고유한 특성을 잃은 서브 클래스의 객체를 복구하는 것
    • 업캐스팅이 선행, 명시적으로 타입을 지정
class Parent {
	String name;
    int age;
}

class Child extends Parent {
	int number;
}

Parent p = new Parent(); 
Child c = new Child();

Parent p2 = (Parent)c; // 업캐스팅 - 자식에서 부모로
Child c2 = (Child)p2; // 다운캐스팅 - 부모에서 자식으로