1. Wrapper 클래스 등
Wrapper 클래스
- 기본 자료형을 객체화 해주는 클래스
- 기본형을 참조형으로 표현하기 위한 클래스
- Byte, Short, Integer, Long, Float, Double의 추상 부모 클래스 Number가 있다.
- Wrapper 클래스가 필요한 이유
1) 기본 자료형이 제공하지 않는 추가 필드, 메서드를 제공하기 위해
2) 기본 자료형을 객체로 다뤄야 하는 경우가 있기 때문에(컬렉션)
Boxing과 Unboxing
- Boxing:
기본 자료형을 Wrapper 클래스의 객체로 변환하는 것
Double radius = new Double(2.59);
Double radius = Double.valueOf(10.4);
Double radius = 2.59;
- Unboxing:
Wrapper 클래스의 객체를 기본 자료형으로 변환하는 것
double r = radius.doubleValue();
double r = radius;
System 클래스
- 자바 플랫폼 및 시스템과 관련된 기능을 제공
- 유용한 클래스 필드와 메서드를 가짐
- 모든 멤버는 static, 사용 시 객체를 생성할 필요 없음
Date 클래스
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf2 = new SimpleDateFormat("G yyyy년 MM월 dd일 HH시 mm분 ss초");
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy년 MM월 dd일 E요일 a hh시 mm분 ss초");
2. 컬렉션(Collection)
컬렉션
- 자바에서 제공하는 자료구조를 담당하는 프레임워크
- 추가, 삭제, 정렬 등의 기능 처리가 간단하게 해결되어 자료구조 알고리즘을 구현할 필요가 없음
- java.util 패키지에 포함
- 인터페이스를 통해 정형화된 방법으로 다양한 컬렉션 클래스 이용 가능
- 배열의 문제점
1) 한번 크기를 지정하면 변경할 수 없다.
2) 배열에 기록된 데이터에 대한 중간 위치의 추가, 삭제가 불편하다.
3) 한 타입의 데이터만 저장 가능하다.
- 컬렉션의 장점
1) 저장하는 크기의 제약이 없다.
2) 추가, 삭제, 정렬 등의 기능 처리가 간단하게 해결된다.
3) 여러 타입의 데이터 저장이 가능하다.(Wrap 기능 이용)
- 컬렉션의 단점:
각 요소마다 타입이 다르기 때문에 원하는 코드가 있을 경우 타입 검사와 다운 캐스팅이 강제됨
if(list.get(i) instanceof String) {
char ch = ((String)list.get(i)).charAt(0);
System.out.println("ch: " + ch);
}else if(list.get(i) instanceof Integer) {
int max = ((Integer)list.get(i)).MAX_VALUE;
System.out.println("max: " + max);
}else if(list.get(i) instanceof Double) {
double min = ((Double)list.get(i)).MIN_VALUE;
System.out.println("min: " + min);
}
자료구조
- 데이터(자료)를 메모리에서 구조적으로 처리하는 방법론
컬렉션의 주요 인터페이스
- 1) 리스트(list):
자료들을 순차적으로 나열한 자료구조로 인덱스로 관리되며, 중복해서 객체 저장 가능
2) 집합(set):
저장 순서가 유지되지 않고, 중복 객체도 저장하지 못하게 하는 자료구조
3) 맵(map):
키(key)와 값(value)으로 구성되어 있으며, 키와 값은 모두 객체
키는 중복 저장을 허용하지 않고(set방식), 값은 중복 저장 가능(list방식)
- 엔트리(entry):
map에서 키+값의 묶음
- 컬렉션(collection):
list와 set의 추상화로 map은 코드가 달라서 같이 추상화하지 않았음
List계열 주요 메서드
- ArrayList:
List의 후손으로 초기 저장 용량은 10으로 자동 설정되며 따로 지정도 가능
저장 용량을 초과한 객체들이 들어오면 자동으로 늘어나며 고정도 가능
동기화(Synchronized)를 제공하지 않음
- Vector:
List의 후손
ArrayList와 동등하지만 동기화(Synchronized)를 제공한다는 점이 ArrayList와 차이점
- LinkedList:
List의 후손으로, 인접 참조를 링크해 체인처럼 관리
특정 인덱스에서 객체를 제거하거나 추가하게 되면 바로 앞/뒤 링크만 변경하면 되기 때문에
객체 삭제와 삽입이 빈번하게 일어나는 곳에서는 ArrayList보다 성능이 좋음
Set계열 주요 메서드
- HashSet:
Set에 객체를 저장할 때 hash함수를 사용하여 처리 속도가 빠름
동일 객체 뿐 아니라 동등 객체도 중복하여 저장하지 않음
- TreeSet:
HashSet과 거의 동일하고 조금 느리지만 이진트리 구조를 이용해 자동 정렬해서 출력
- LinkedHashSet:
HashSet과 거의 동일하지만 Set에 추가되는 순서를 유지한다는 점이 다름
Map계열 주요 메서드
- HashMap:
키 객체는 hashCode()와 equals()를 재정의해 동등 객체가 될 조건을 정해야 함
때문에 키 타입은 hashCode와 equals() 메서드가 재정의되어 있는 String타입을 주로 사용
Tree
- TreeSet:
이진 트리를 기반으로 한 Set컬렉션으로, 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성
- TreeMap:
이진 트리를 기반으로 한 Map 컬렉션으로,
키와 값이 저장된 Map.Entry를 저장하고 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성
3. 제네릭(Generic)
제네릭
- 클래스나 메서드 내부에서 다룰 데이터의 클래스 타입을 지정하거나
컬렉션이 다룰 클래스 타입을 제한하여 한 종류의 클래스만 저장할 수 있게 한 기능
- 제네릭을 사용하는 이유
- 컴파일 단계에서 잘못된 타입을 사용할 수 있는 문제 제거
- 컬렉션에 저장된 여러 종류의 객체를 꺼내서 사용할 때,
객체의 종류에 따라 매번 형변환을 해야하기 때문에 코드가 복잡해짐(컬렉션의 단점)
- 컬렉션, 람다식(함수적 인터페이스), 스트림, NIO에서 널리 사용
- API Document 해석에 어려움을 겪어 학습에 제한
- 제네릭의 장점
- 컴파일 시 강한 타입 체크 가능(실행 시, 컴파일 시 에러 방지)
- 타입 변환 제거 가능
List<String> list = new ArrayList<String>();
list.add("서울");
list.add("도쿄");
list.add("베이징");
for(int i=0; i<list.size(); i++) {
String str = list.get(i);
System.out.println(str.charAt(0));
}