연관된 상수들의 집합
static final
enum Season {
// 대문자로 선언하는 것이 관례
SPRING,
SUMMER,
FALL,
WINTER
}
기본 타입을 객체로 만들어야 할 때 참조 타입으로 만들기 위해 사용하는 클래스
Byte
Short
Integer
Long
Double
Float
Char
Boolean
박싱
기본 타입 값 ➡️ 포장 객체
언박싱
포장 객체 ➡️ 기본 타입
Integer num1 = new Integer(10); // 박싱
int num2 = num1.intValue(); // 언박싱
Integer num3 = 20; // 자동 박싱
int num4 = num3; // 자동 언박싱
같은 기능을 하는 메소드를 여러 타입 버전으로 작성하는 경우
➡️ 불필요한 코드가 길어짐
➡️ 제네릭으로 해결하자❗️
자료형을 구체적으로 명시하지 않고 일반화하여 작성
// T 자리에 자료형 치환
Class Basket<T> {
private T item;
public Basket(T item) {
this.item = item;
}
}
제네릭이 사용된 클래스
<T\>
➡️ T는 타입 매개 변수, Type의 T
타입 매개 변수 여러개 지정 가능
클래스 변수에 타입 매개 변수 ❌
➡️ 클래스 변수: 공유변수
➡️ 타입 매개 변수로 인해 클래스 변수의 타입이 인스턴스마다 바뀌게 됨
➡️ 같은 변수 공유 ❌
❗️타입 매개 변수는 참조 타입이어야 함
➡️ 기본 타입은 래퍼 클래스(wrapper class)로 변환 필요
➡️ 생성자 호출 시 래퍼 클래스 생략 가능 (참조 변수로부터 유추)
Basket<Integer> basket = new Basket<>(10)
다형성 가능 ➡️ 부모/자식 클래스로 객체 생성 및 접근 가능
모든 타입 가능, 특정 클래스/인터페이스만 받아오도록 지정 가능
➡️ Basket<T extends Flower>
클래스
➡️ Basket<T extends Plant>
인터페이스
➡️ Basket<T extends Flower&Plant>
동시 가능, 클래스 먼저 작성
제네릭이 사용된 메소드
static
가능
메소드가 호출 되는 시점에 제네릭 타입 결정 ➡️ 정의하는 시점에서 타입 알 수 없음
➡️ length()
불가
Object의 모든 메소드 가능 (최상위 클래스니까!)
equals()
toString()
등
<? extends T>
T와 T를 상속받는 하위 클래스 타입만 가능하도록 제어
<? super T>
T와 T의 상위 클래스 타입만 가능하도록 제어
<?> = <? extends T>
모든 클래스 타입 가능
컴파일 에러: 컴파일 시 발생하는 에러
✔️ 문법(syntax)와 관련
✔️ IDE에서 오류 찾아줌
런타임 에러: 런타임 시 발생하는 에러
에러와 예외
✔️ 에러: 복구하기 어려운 심각한 오류, 메모리 부족 / 스택 오버플로우 등
✔️ 예외: 잘못된 사용이나 코딩으로 인한 미약한 수준의 오류
try {
// 코드
} catch(ExceptionType1 e1) {
// ExceptionType1 에러 발생 시 실행
} catch(ExceptionType2 e2) {
// ExceptionType2 에러 발생 시 실행
} finally {
// 무조건 실행
}
컬렉션 프레임워크 = 컬렉션을 편리하게 다루기 위해 메소들을 미리 정의해 둔 것
컬렉션: 여러 데이터들의 집합
컬렉션에 저장된 요소들을 순차적으로 읽어옴
순서가 있는 저장 공간
집합적인 저장 공간
[key:value] 쌍(Entry)으로 구성