미누에요
[Java] 컬렉션(Collection)과 제네릭(Generic), Wrapper 클래스 본문
컬렉션이란 ?
- 요소(element)라고 불리는 가변 개수의 객체들의 저장소
- 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합
- 요소로는 객체 타입만 가능!!!
컬렉션의 종류는 위 사진과 같다.
위 설명으로는 충분히 이해가 되지 않을 것이다.
예를 들어, 연결리스트를 사용한다고 할 때, 우리는 연결리스트를 직접 구현하여 사용하게 된다.
하지만 Java 에서는 LinkedList라는 컬렉션이 존재하기에 이것을 우리는 그냥 사용하면 된다.
이처럼 컬렉션은 자료구조와 이를 구현하는 클래스를 정의하는 인터페이스를 제공하게 된다.
제네릭이란 ?
- 클래스에서 사용할 데이터 타입을 미리 지정하지 않고 외부에서 지정하도록 하는 기법
위 사진에서는 Person이라는 클래스를 제네릭을 사용하여 작성하였다.
Person 클래스에서 사용할 자료형을 정하지 않고 싶은 경우에, 제네릭을 <T>와 같이 사용할 수 있다.
그러면 객체를 생성할 때 입력된 자료형으로 해당 객체는 변수 타입이 정해지게 된다.
이와 같이 클래스를 여러 개 작성하지 않고 다른 변수 타입의 객체를 생성해낼 수 있는 것이다.
보통 컬렉션을 사용할 때, 제네릭과 함께 사용하게 된다.
Stack을 제네릭을 사용하여 예시로 사용해 보겠다.
import java.util.Stack;
public class test {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<Integer>();
stack.push(1);
stack.push(4);
stack.push(2);
stack.push(7);
while (!stack.isEmpty()){
System.out.println(stack.pop());
}
}
}
Stack의 제네릭으로 Integer을 사용하였다.
왜 int 가 아닌 Integer를 사용한 것일까 ?
그 이유는 위의 컬렉션의 특징에서 언급했던 "컬렉션의 요소로는 객체 타입만 가능하다" 에 있다.
기본 타입인 int, char, double 등을 사용하는 것이 아닌 Wrapper 클래스를 사용해야 한다.
Wrapper 클래스
- 객체만 사용할 수 있는 컬렉션에 기본 타입의 값을 사용하기 위해 사용함
- 기본 데이터형과 관련된 다양한 연산을 지원
public class test {
public static void main(String[] args) {
Integer i = Integer.valueOf(10);
Character c = Character.valueOf('c');
Double d = Double.valueOf(3.14);
Boolean b = Boolean.valueOf(true);
}
}
위와 같이 사용하게 된다.
wrapper 클래스의 박싱과 언박싱에 대해서도 알아보자.
박싱(Boxing)
- 기본 타입의 값을 Wrapper 객체로 변환하는 것
언박싱(UnBoxing)
- Wrapper 객체에 들어있는 기본 타입의 값을 빼내는 것
- 박싱의 반대
JDK 1.5부터는 박싱과 언박싱을 자동으로 지원한다.
import java.util.Stack;
public class test {
public static void main(String[] args) {
Integer ten = 10;
int n = ten;
System.out.println(n);
}
}
위 코드에서 Wrapper 클래스를 선언해두고, 그 값을 int 변수에 넣었더니 정상적으로 값이 들어갔다.
import java.util.Stack;
public class test {
public static void main(String[] args) {
Integer ten = 10;
int n = Integer.valueOf(ten); // 형변환을 해서 하는 경우.
System.out.println(n);
}
}
명시적으로 위 코드처럼 Integer.valueOf를 사용할 수도 있다.
두 코드 모두 결과는 10이 나온다.
이렇게 Wrapper 클래스부터, 제네릭과 컬렉션까지 정리해 보았다.
'Java' 카테고리의 다른 글
[Java] 인터페이스(Interface)와 추상 클래스(abstract class) 의 차이 (0) | 2024.05.26 |
---|---|
[Java] 상속(inheritance) (0) | 2024.05.10 |
[Java] 메서드 오버라이딩(method overriding) (0) | 2024.05.10 |
[Java] final의 사용, final 변수, final 메서드, final 클래스, 인자로의 final (0) | 2024.05.10 |
[Java] static 메서드 (0) | 2024.05.10 |