강좌 Course 2. Part 2. ch1 1~3강 요약
Collection Framework API는 여러 개의 데이터를 핸들링하는 인터페이스와 API들을 모아둔 것이다. Collection은 자바가 제공하는 데이터구조이며, 저번에 써보았던 ArrayList 등이 이에 속한다. 이 API들은 데이터 추가, 수정, 검색 등의 공통적인 동작들을 가지고 있다.
Collection API가 가지고 있는 Wrapper 클래스는 기본 데이터타입을 객체로 다룰 수 있도록 만들어진 클래스이다. 실제 Wrapper 라는 이름의 클래스가 존재하는 건 아니다. Collection 에는 객체를 넣어야하기 때문에 기본자료형을 객체로 다룰 수 있게 하는 클래스들을 통칭하는 것이다.
기본 데이터타입들의 첫글자를 대문자로 쓰고, 줄여쓴 것은 줄이지 않은 상태로 적으면 wrapper 클래스가 된다.
byte -> Byte
short -> Short
int -> Integer
long -> Long
float -> Float
double -> Double
char -> Character
boolean -> Boolean
wrapper 클래스를 사용하면 자동으로 박싱과 언박싱이 이루어진다. 박싱은 기본 데이터타입을 wrapper 클래스 객체로 변환하는 것이고, 언박싱은 객체를 기본 데이터타입으로 변환하는 것이다.
public class WrapperTest {
public static void main(String[] args) {
// 정수형 변수에 10을 저장
int a = 10; // 기본자료형
// Integer aa = new Integer(10); // 사용자정의 자료형
Integer aa = 10; // auto-boxing
System.out.println(aa.intValue());
Integer bb = 20; // auto-boxing
int b = bb; // auto-unboxing
}
}
박싱을 할 때 Integer 객체 intObj에 바로 10을 넣는다고 하면, 인스턴스를 받을 수 있지 기본 자료형을 받을 수 있는 게 아니라서 new Integer(10);으로 자동으로 변환해서 받는다. 이것이 auto-boxing이다.
이렇게 기본 자료형과 wrapper 클래스는 자동으로 박싱, 언박싱이 되기 때문에 혼용하여 사용해도 문제없다.
문자열 숫자를 정수로 변환하거나, 정수를 문자열 숫자로 변환해야 할 때가 있다. 이러한 동작들은 int의 wrapper 클래스와 String이 가지고 있다.
문자열 -> 정수
Integer.parseInt(문자열)
정수 -> 문자열
String.valueOf() 또는 ""+(정수)
public class IntegerStringTest {
public static void main(String[] args) {
// String to integer
String str1 = "123";
String str2 = "456";
System.out.println(str1+str2); // Concatenation
int num = Integer.parseInt(str1)+Integer.parseInt(str2);
System.out.println(num);
// interger to String
int num1 = 123;
int num2 = 456;
System.out.println(num1+num2); // Addition
// #1 valueOf
String str = String.valueOf(num1)+String.valueOf(num2);
System.out.println(str);
// #2 using quotation marks
str = ""+num1+num2;
System.out.println(str);
}
}
wrapper 클래스를 사용하면 객체를 받는 ArrayList에도 편리하게 기본자료형 데이터를 저장하고 받아올 수 있다.
public class CollectionBasic {
public static void main(String[] args) {
// ArrayList에 10, 20, 30, 40, 50 의 5개 정수를 저장 및 출력
// ArrayList는 Object[]기 때문에 int를 넣을 수 x
// Integer(Wrapper class)로 넣어야 함 --> auto-boxing으로 그냥 입력해도 알아서 변환되어 들어감
ArrayList<Integer> list = new ArrayList<>();
list.add(10); // 내부에서 new Integer(10);
list.add(20);
list.add(30);
list.add(40);
list.add(50);
// auto-unboxing으로 int로 Integer를 받을 수 있음
for (int num:list){
System.out.println(num);
}
}
}