자바에서는 기본 데이터 타입을 객체로 취급할 필요가 있을 때, **래퍼 클래스(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);
}
}
정리
- 래퍼 클래스(Wrapper Class): 기본 데이터 타입을 객체로 다룰 수 있게 해주는 클래스. 예) Integer, Double, Character.
- 박싱(Boxing)과 언박싱(Unboxing): 기본 타입과 래퍼 클래스 간의 변환.
- 제네릭(Generic): 타입을 매개변수로 사용하여 클래스와 메소드를 보다 재사용 가능하게 만듦.
- Object 클래스: 모든 클래스의 최상위 클래스. 모든 객체는 Object 타입으로 다룰 수 있음.
이러한 개념들은 자바에서 코드의 유연성과 재사용성을 높이는 데 중요한 역할을 합니다.
'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 |