CS Study 3~4주차: [Java] 기본형, 참조형, 오토 박싱, 언박싱

hjern·2024년 3월 5일
0

CS Study

목록 보기
3/10

기본형(Primitive Type)

  • JAVA에서는 총 8가지의 Primitive type을 미리 정의하고 제공한다.

  • 자바에서 기본 자료형은 반드시 사용하기 전에 선언(Declared)되어야 한다. 계산을 위해 실제 값을 저장해야 하기 때문이다.

  • OS에 따라 자료형의 길이가 변하지 않는다.

  • 비객체 타입이므로 null 값을 가질 수 없으며 기본형에 Null 값을 넣고 싶다면 Wrapper Class를 활용할 수 있다.

  • 스택(Stack) 메모리에 저장됩니다.

  • 8가지 종류

  1. 논리형
    1) boolean
    논리형인 boolean의 기본값은 false이며 참과 거짓을 저장하는 타입으로 주로 yes/no, on/off 등의 논리 구현에 주로 사용되며 두가지 값만 표현하므로 가장 크기가 작다.
  2. 문자형
    2) char
    문자를 저장하는데 사용되며, 변수 당 하나의 문자만을 저장할 수 있다.
  3. 정수형
    1) byte
    주로 이진데이터를 다루는데 사용되는 타입.
    2) short
    C언어와의 호환을 위해 사용되는 타입
    3) int
    자바에서 정수 연산을 하기 위한 기본 타입으로 byte 혹은 short 의 변수가 연산을 하면 연산의 결과는 int형이 된다.
    4) long
    변수를 초기화 할 땐 정수값 뒤에 알파벳 L을 붙여서 long 타입(즉, 8byte)의 정수 데이터임을 알려주어야 함. 만일 정수값이 int의 값의 저장 범위를 넘는 정수에서 L을 붙이지 않는다면 컴파일 에러가 발생함.
    long l = 2147483648; // 컴파일 에러 발생
     long l = 2147483648L;
  4. 실수형
    1) float & double
    실수를 가수와 지수 형식으로 저장하는 부동소수점 방식으로 저장됨. 가수를 표현하는데 있어 double형이 float형보다 표현 가능 범위가 더 크므로 double형이 보다 정밀하게 표현할 수 있음(기본 타입). float형에는 알파벳 F를 붙여서 float 형임을 명시해서 선언해야 함.
    float f = 1234.567; // 컴파일 에러 발생
     float f = 1234.567F;

참조형(Reference Type)

  • JAVA에서 Primitive type을 제외한 타입들이 모두 Reference type.

  • 객체의 주소를 저장한다. null 또는 객체의 주소를 갖는다. 즉, 실제 값은 다른 곳에 있으며 값이 있는 주소를 가지고 있어서 나중에 그 주소를 참조해서 값을 가져온다.

  • Reference type은 JAVA에서 최상인 java.lang.Object클래스를 상속하는 모든 클래스들을 말하며 new로 인하여 생성하는 것들은 메모리 영역인 Heap 영역에 생성을 하게되고, 그 참조값(주소값)을 갖는 변수는 스택에 저장하며 Garbage Collector가 돌면서 메모리를 해제함.

  • 클래스 타입(class type) , 인터페이스 타입(interface type) , 배열 타입(array type) , 열거 타입(enum type)

  • 빈 객체를 의미하는 Null이 존재.

  • 문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생하기 때문에 객체나 배열을 Null 값으로 받아 NullPointException이 발생할 수 있으므로 변수 값을 넣어야 함.

  • Heap 메모리에 생성된 인스턴스는 메소드나 각종 인터페이스에서 접근하기 위해 JVM의 Stack 영역에 존재하는 Frame에 일종의 포인터(C의 포인터와는 다름)인 참조값을 가지고 있어 이를 통해 인스턴스를 핸들링

AUTO BOXING & UNBOXING

0. 박싱과 언박싱

// 박싱
int i = 10;
Integer num = new Integer(i);

// 언박싱
Integer num = new Integer(10);
int i = num.intValue();

// int i = 5;
Integer iObj = new Integer(7);

// 기본형과 참조형 간의 덧셈 불가
int sum = i + iObj

JDK1.5 전까진 기본형과 참조형의 계산이 불가능했으나, 이후 버전부터 한 쪽을 오토/언박싱하는 방법으로 계산할 수 있도록 컴파일러가 수정됨.

1. 오토박싱(AutoBoxing)

  • 기본 타입 데이터에 대응하는 Wrapper 클래스로 만드는 동작

2. 오토언박싱(AutoUnBoxing)

  • Wrapper Class 에 감싸진 값을 기본형으로 바꾸어주는 것
ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(new Integer(150)); // 원래는 객체만 넣을 수 있었다.
		list.add(100); // 하지만 오토/언박싱 기능이 추가된 이후론 기본값을 넣어도 가능하다.
		list.add(200);

		Integer i = list.get(0); // list에 저장된 첫번째 객체를 꺼낸다.
		int j = list.get(1).intValue(); // intValue()로 Integer를 int로 변환하여 꺼낸다(정석).
		int k = list.get(2);

		System.out.println("i = " + i);
		System.out.println("j = " + j);
		System.out.println("k = " + k);

3. 성능

편의성을 위해 오토 박싱과 언박싱이 제공되고 있지만, 내부적으로 추가 연산 작업이 거치게 됨. 따라서, 오토 박싱&언박싱이 일어나지 않도록 동일한 타입 연산이 이루어지도록 구현하며 불필요한 오토 캐스팅이 일어나지 않도록 유의해야 함.

4. 예상 질문

Q: What is boxing and unboxing in Java?
✅ 자바에서 박싱과 언박싱이란 기본형 데이터 타입과 이에 상응하는 래퍼 클래스 간의 변환을 말한다. 박싱은 기본 타입에 해당하는 래퍼클래스로 변환하는 것이며, 언박싱은 래퍼 클래스에서 기본 값을 값으로 추출하는 개념이다.

Q: Before which version of JDK was it impossible to perform calculations between primitive and reference types?
✅ JDK1.5 이전엔 기본형과 참조형 타입간의 계산을 수행하는 것이 불가능했다.

Q: What is AutoBoxing?
✅ 오토 박싱은 기본형 데이터 타입과 이에 상응하는 래퍼 클래스로 자동으로 변환 하는 것을 말한다. 이는 기본형 데이터 값이 직접적으로 래퍼 클래스의 데이터 값으로 변환되는 것을 의미하는데, 객체를 생성하는 수고로움을 덜 수 있다.

Q: What is AutoUnboxing?
✅ 오토 언박싱은 자동으로 래퍼 클래스에서 그에 상응하는 기본형 데이터 타입으로 변환하는 것을 의미한다. 이것은 intValue() 와 같이 기존에 언박싱을 하기 위해 사용하던 메소드 따위를 사용하지 않고도 래퍼 클래스 객체에서 기본 값을 추출할 수 있도록 한다.

Q: Can you provide an example of auto boxing and auto unboxing in Java?
✅ 예를 들어, Integer를 지네릭스로 하는 배열이 있다고 하자. 이때, 해당 배열에 new 객체를 생성해서 Integer를 넣어야 실제 값을 배분할 수 있었지만, 현재는 기본형 데이터 값만 넣더라도 배열에 정상적으로 값이 저장될 수 있다. 이것이 오토박싱이다.

Is there any performance concern related to AutoBoxing and AutoUnboxing?
✅ 오토 박싱과 오토 언박싱은 상당히 편리하지만, 내부적으로 추가적인 연산을 요구하기 때문에 성능에 영향을 미친다. 불필요한 오토 캐스팅은 지양하는 편이 성능 면에서 도움이 된다.

참고자료

[Tech Interview] Primitive type & Reference type
JAVA 변수의 기본형 & 참조형 타입 차이 이해하기
[자바의 정석 - 기초편] ch9-28~31 오토박싱 & 언박싱, 문자열과 숫자변환

profile
주니어의 굴레는 언제 벗어날 것인가

0개의 댓글