hong's android

[Java] 제네릭, 래퍼 클래스 본문

Develop/Java

[Java] 제네릭, 래퍼 클래스

_hong 2023. 2. 11. 14:42

제네릭 이란? 

 

내부에서 타입을 정하지않고, 외부에서 지정,  클래스나 메소드에서 다양한 타입을 사용할 수 있도록 데이터 타입을 일반화한다.

(자바 5부터 새롭게 추가)

 

제네릭이 없이 다양한 타입을 클래스 또는 메소드에서 사용할때 

 객체들의 최상위 클래스인 object로 타입 파라미터를 받는다. 클래스 외부에서 타입을 지정한 다음, 해당 객체의 값을 가져와서 사용한다. 이때 클래스 외부에서 객체의 값을 사용하기 위해 형 변환을 해야하는데 그대로 사용하거나 잘못된 형변환을 하게되면 런타임에 오류가 생길 수 있다.
제네릭으로 다양한 타입을 클래스 또는 메소드에서 사용할때 

클래스 외부에서 동적으로 타입을 지정한다. 객체의 값을 사용해야할때 강제로 형변환을 할 필요없이 제네릭 타입으로 지정한 값을 사용할 수 있다. 

 

장점

  1. 컴파일 단계에서 타입을 지정하기때문에 타입 에러를 방지 할 수 있다. 런타임에 오류로 정지 되는것을 막는다.
  2. 동적으로 타입을 지정한 후에 다양한 타입을 클래스에서 사용할 수 있다.
  3. 사용할 수 있는 타입을 국한하기 때문에 타입 형변환이 필요가 없다.
  4. 다양한 타입을 받을 수 있는 만큼 코드 재사용성이 증가한다.

 

단점

  1. 코드를 확인할때 어떤 타입이 지정되는지 확인하기 어렵다. (가독성 저하)

 

래퍼 클래스란?

원시 타입을 객체로 바꾸어 사용한다.

 

사용하는 이유

  1. 메소스에 원시타입의 값을 전달하는 경우 객체와 같이 object의 참조값을 전달하는게 아니여서 원본 데이터 값을 변경 할 수 없다. 그렇기 때문에 이 같은 경우는 객체가 필요하다.
  2. Java.util 패키지의 클래스들은 래퍼클래스만 사용한다. (원시 타입과 달리 Null 할당 가능하다.)
  1. 컬렉션 프레임워크는 객체만 받는다.

 

특징 

최상위 object 클래스를 상속받는다. 

 

박싱 : 원시 타입 -> 래퍼 클래스

Int value = 123;
Integer wrappervalue = Integer.valueof(value);

 

언박싱 : 래퍼 클래스 -> 원시 타입

Int value = wrappervalue.intvalue();

 

오토 박싱 : 자동으로 박싱을 해준다.

Integer wrappervalue = 123;

 

Collection 프레임 워크는 래퍼 클래스만 사용한다. 그렇기 때문에 원래는 아래와 같은 로직으로 list에 래퍼 클래스 객체를 추가해야한다.

예) list.add(new Integer(20)); 

하지만 오토박싱을 통해서 리스트에 값을 추가 할 수 있다.

예)  list.add(20); 

 

반대로 값을 가져오는경우도 오토 언박싱을 하게되기때문에 간편하게 collection 프레임워크를 사용 할 수 있다.

 

왜 collection 프레임 워크는 래퍼클래스를 사용할까?

 

Why can Java Collections not directly store Primitives types?

Java collections only store Objects, not primitive types; however we can store the wrapper classes. Why this constraint?

stackoverflow.com

 

래퍼클래스 사용이유

 

1. 매개변수로 참조 자료형을 받은 메소드 처리(컬렉션으로 구현한 클래스들)

2. 제네릭과 같이 기본 자료형을 사용하지 않는 기능 사용

3. 클래스에 선언된 상수값 사용, 최소값, 최대값 상수값

4. 메소드를 사용해서 문자열을 숫자,숫자를 문자열로 쉽게 변경 있다.

 

 

원시 타입과 래퍼 클래스 모두 필요한 이유

원시 타입은 stack, 래퍼 클래스는 객체이기 때문에 heap 에 저장된다. 

래퍼 클래스는 객체이기 때문에 다양한 메소드들을 활용할 수 있고 컬렉션 프레임워크에서도 사용이 된다.

하지만 heap에 접근하기에 성능이 비교적 느려진다.

 

원시 타입은 heap 메모리를 할당 받고 사용하지 않아도된다. 

값을 계산하고 비교할때 굳이 래퍼 클래스를 사용할 이유가 없다.

 

https://gyoogle.dev/blog/computer-language/Java/Auto%20Boxing%20&%20Unboxing.html

 

[Java] 오토 박싱 & 오토 언박싱 | 👨🏻‍💻 Tech Interview

[Java] 오토 박싱 & 오토 언박싱 자바에는 기본 타입과 Wrapper 클래스가 존재한다. 기본 타입 : int, long, float, double, boolean 등 Wrapper 클래스 : Integer, Long, Float, Double, Boolean 등 박싱과 언박싱에 대한 개

gyoogle.dev

 

'Develop > Java' 카테고리의 다른 글

[Java] Collection Framework  (0) 2023.02.11
[Java] 동시성 문제와 synchronized의 성능  (0) 2023.02.11
[Java] Synchronized  (1) 2023.02.11
[Java] 리플렉션  (0) 2023.01.16
[Java] Garbage Collector  (0) 2023.01.02