반응형
박싱, 언박싱
- 박싱 : 기본 타입의 데이터를 해당 기본 타입의 래퍼 클래스(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; // 다운캐스팅 - 부모에서 자식으로
'공부 기록 > 개념정리' 카테고리의 다른 글
[객체 지향] JAVA _ interface , abstract (0) | 2024.04.19 |
---|---|
[객체 지향] JAVA _ 접근 제어자, static, 객체와 클래스 (0) | 2024.04.19 |
인코딩 vs 디코딩 , 직렬화(serialization) (0) | 2024.04.07 |
JVM (자바 가상 머신) (0) | 2024.03.30 |
런타임 vs 컴파일 타임 / 컴파일러 vs 인터프리터 (0) | 2024.03.28 |