본문 바로가기

Java

[Java] 래퍼 클래스(Wrapper Class)와 제네릭

728x90

자바에서는 기본 데이터 타입을 객체로 취급할 필요가 있을 때, **래퍼 클래스(Wrapper Class)**를 사용합니다. 또한, **제네릭(Generic)**을 활용하여 코드 재사용성을 높이고, Object 클래스를 통해 다양한 객체를 다룰 수 있습니다. 아래에서는 각 개념을 설명하겠습니다.


1. 래퍼 클래스 (Wrapper Class)

래퍼 클래스는 기본 데이터 타입을 객체로 포장해주는 클래스입니다. 자바에서는 기본 데이터 타입을 객체로 다룰 수 없지만, 래퍼 클래스를 통해 객체처럼 취급할 수 있습니다. 예를 들어, Integer, Double, Character 등 다양한 기본 타입에 대한 래퍼 클래스를 제공합니다.

기본 데이터 타입과 래퍼 클래스

기본 데이터 타입 래퍼클래스
byte Byte
short Short
int  Integer
long Long
float Float
double Double
char Character
boolean  Boolean

 

래퍼 클래스의 형변환 메소드

래퍼 클래스에서는 문자열을 숫자로 변환하거나 그 반대 작업을 할 수 있습니다.

  • 문자열을 숫자로 변환:
String num = "10";
int i = Integer.parseInt(num);  // 문자 "10"을 숫자 10으로 변환하여 i에 저장

 

  • 숫자를 문자열로 변환:
int num = 10;
String str = Integer.toString(num);  // 숫자 10을 문자열 "10"으로 변환

 

 

2. 박싱 (Boxing)과 언박싱 (Unboxing)

  • 박싱 (Boxing): 기본 데이터 타입을 래퍼 클래스로 변환하는 과정
int num = 10;
Integer i = new Integer(num);  // int 타입 num을 Integer 객체로 변환

 

  • 언박싱 (Unboxing): 래퍼 클래스를 기본 데이터 타입으로 변환하는 과정
Integer i = new Integer(10);
int num = i.intValue();  // Integer 객체 i를 int 기본형으로 변환

 

자바 5 이후로는 **자동 박싱(Auto-Boxing)**과 자동 언박싱(Auto-Unboxing) 기능이 도입되어, 위와 같은 변환이 자동으로 처리됩니다.

Integer i = 10;  // 자동 박싱
int num = i;     // 자동 언박싱

 


3. 제네릭 (Generic)

**제네릭(Generic)**은 클래스나 메소드에서 사용할 데이터의 타입을 컴파일 시에 미리 지정하는 방법입니다. 이를 통해 타입 안전성을 제공하고, 코드 재사용성을 높일 수 있습니다.

제네릭 사용 이유

  • 다양한 타입의 객체를 재사용 가능하게 합니다.
  • 강제적인 타입 변환을 방지하여 코드의 안정성을 높입니다.
  • 반복적인 코드나 불필요한 코드를 제거할 수 있습니다.
public class Box<T> {
    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
}

위 코드에서 Box 클래스는 타입 파라미터 T를 사용하여 어떤 타입의 객체라도 저장할 수 있습니다. 예를 들어, Integer, String, Apple 객체 등을 저장할 수 있습니다.

제네릭 사용방법

public class GenericTest {
    public static void main(String[] args) {
        // String 타입으로 Box 생성
        Box<String> box1 = new Box<>();
        box1.setT("안녕하세요");
        System.out.println(box1.getT());

        // Integer 타입으로 Box 생성
        Box<Integer> box2 = new Box<>();
        box2.setT(100);
        System.out.println(box2.getT());
    }
}

    - 클래스 또는 인터페이스에 <>를 붙이고 타입 파라미터를 지정
    - <>안에는 클래스 타입이 들어가야 함(기본타입x)

 

제네릭 타입 파라미터

제네릭 타입 파라미터는 보통 다음과 같은 형태로 사용됩니다:

  • <T>: Type을 의미, 일반적인 타입 파라미터
  • <E>: Element를 의미, 컬렉션의 요소를 나타낼 때 사용
  • <K>: Key를 의미, 맵에서 키를 나타낼 때 사용
  • <V>: Value를 의미, 맵에서 값을 나타낼 때 사용
  • <N>: Number를 의미, 숫자 관련 타입을 나타낼 때 사용

제네릭 클래스 사용 예시 (타입 지정 방법)

public class Box2<T> {
    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
}
public class GenericExample {
    public static void main(String[] args) {
        // String 타입의 Box 사용
        Box2<String> box1 = new Box2<>();
        box1.setT("Hello");
        System.out.println(box1.getT());

        // Integer 타입의 Box 사용
        Box2<Integer> box2 = new Box2<>();
        box2.setT(123);
        System.out.println(box2.getT());

        // Apple 객체 타입의 Box 사용
        Apple apple = new Apple("사과", 1000, "빨강", "청송", 7);
        Box2<Apple> box3 = new Box2<>();
        box3.setT(apple);
        System.out.println(box3.getT());
    }
}



✅ 제네릭을 사용할 수 없는 경우
- 제니릭으로 배열을 생성할 수 없음
- static 변수를 제네릭으로 사용할 수 없음


4. Object 클래스

자바에서 Object 클래스모든 클래스의 최상위 부모 클래스입니다. 모든 클래스는 Object 클래스를 상속받기 때문에, Object 타입으로 모든 객체를 다룰 수 있습니다.

object 클래스 예시

public class Box {
    private Object obj;  // 모든 타입을 저장할 수 있음

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }
}

public class Main {
    public static void main(String[] args) {
        Box box = new Box();
        
        // String 객체를 저장
        box.setObj("Hello");
        System.out.println(box.getObj());  // 출력: Hello

        // Integer 객체를 저장
        box.setObj(10);
        System.out.println(box.getObj());  // 출력: 10

        // Apple 객체를 저장
        Apple apple = new Apple("사과", 1000, "빨강", "청송", 7);
        box.setObj(apple);
        System.out.println(box.getObj());  // 출력: Apple 객체 정보

        // Object 타입의 객체는 형변환이 필요함
        Apple apple2 = (Apple) box.getObj();  // 형변환 후 사용
        System.out.println(apple2);
    }
}

 

 

정리

  1. 래퍼 클래스(Wrapper Class): 기본 데이터 타입을 객체로 다룰 수 있게 해주는 클래스. 예) Integer, Double, Character.
  2. 박싱(Boxing)과 언박싱(Unboxing): 기본 타입과 래퍼 클래스 간의 변환.
  3. 제네릭(Generic): 타입을 매개변수로 사용하여 클래스와 메소드를 보다 재사용 가능하게 만듦.
  4. Object 클래스: 모든 클래스의 최상위 클래스. 모든 객체는 Object 타입으로 다룰 수 있음.

이러한 개념들은 자바에서 코드의 유연성재사용성을 높이는 데 중요한 역할을 합니다.

 

 

 

 

 

728x90

'Java' 카테고리의 다른 글

[Java] 인터페이스(interface)  (0) 2022.04.14
[Java] 추상 클래스 (Abstract Class)  (0) 2022.04.14
[Java] 접근 제어자  (0) 2022.04.13
[Java] 상속 예제(과일 구매 프로그램)  (0) 2022.04.13
[Java] 상속  (0) 2022.04.13