여러 상수들을 보다 편리하게 선언할 수 있도록 만들어진 자바의 문법 요소이다.
상수명의 중복을 피하고 타입에 대한 안정성을 보장한다.
간결하고 가독성이 좋은 코드를 작성할 수 있으며 switch문에서 작동이 가능하다.
enum 열거형이름 {상수명1, 상수명2, 상수명3, ...}
// 열거형 사용 예시
enum Numbering {
FIRST,
SECOND,
THIRD
}
public class Main {
public static void main(String[] args) {
Numbering num = Numbering.THIRD;
switch(num) {
case FIRST:
System.out.println("First Number");
break;
case SECOND:
System.out.println("Second Number");
break;
case THIRD:
System.out.println("Third Number");
break;
}
}
}
// 출력 결과
// Third Number
| 리턴타입 | 메서드(매개변수) | 설명 |
|---|---|---|
| String | name() | 열거 객체가 가진 문자열을 리턴, 리턴되는 문자열은 열거 타입을 정의할 떄 사용한 상수명과 동일 |
| int | ordinal() | 열거 객체의 순번(0부터 시작)을 리턴 |
| int | compareTo(비교값) | 주어진 매개값과 비교하여 순번 차이를 리턴 |
| 열거타입 | valueOf(String name) | 주어진 문자열의 열거 객체를 리턴 |
| 열거배열 | values() | 모든 열거 객체들을 배열로 리턴 |
타입을 추후에 지정할 수 있도록 일반화해두는 것이다.
작성한 클래스 또는 메서드의 코드가 특정 데이터 타입에 얽매이지 않게 해둔 것이다.
class 클래스명<타입 매개변수> {}
// 타입 매개변수는 임의의 문자로 지정 가능
// T = Type, K = Key, V = Value, E = Element, N = Number, R = Result 를 주로 사용
Box<String> box1 = new Box<String>("Java");
Box<Integer> box2 = new Box<Integer>(5);
Box<Double> box3 = new Box<Double>(8.15);
// new Box<...> 는 구체적인 타입의 생략이 가능, 찹조변수의 타입으로 유추
class Toy {...}
class Doll extends Toy {...}
class Snack {...}
// 제네릭 클래스 정의
class Box<T extends Toy> {
private T item;
public T getItem() {
return item;
}
public T setItem(T item) {
this.item = item;
}
}
public static void main(String[] args) {
// 인스턴스화
Box<Toy> toyBox = new Box<>();
Box<Snack> snackBox = new Box<>(); // 에러
}
class Box<T> { //제네릭 클래스의 타입 매개변수
...
public <T> void sum(T item) { // 제네릭 매서드의 타입 매개변수
System.out.println(item.length()); // 사용 불가
System.out.println(item.equals("Mason Lee")); // 사용 가능
}
}
<? extends T> // 와일드카드에 상한 제한을 두는 것
// T와 T를 상속받는 하위 클래스 타입만 타입 파라미터로 받을 수 있도록 지정
<? super T> // 와일드카드에 하한 제한을 두는 것
// T와 T의 상위 클래스만 타입 파라미터로 받을 수 있도록 지정
<?> // <? extends Object>와 동일하며 모든 클래스 타입을 타입 파라미터로 받을 수 있음
프로그램의 비정상적인 종료를 방지하고 정상적인 실행 상태를 유지하기 위한 것이다.
자바에서는 발생 시점에 따라 에러를 컴파일 에러와 런타임 에러로 구분한다.
try {
// 예외가 발생할 가능성이 있는 코드 삽입
}
catch (ExceptionType1 except1) {
// ExceptionType1 유옇의 예외 발생 시 실행할 코드
}
catch (ExceptionType2 except2) {
// ExceptionType2 유옇의 예외 발생 시 실행할 코드
}
finally {
// 예외 발생 여부와 상관없이 항상 실행
// finally 블럭은 옵셔널
}
반환타입 메서드명(매개변수, ...) throws 예외클래스 1, 예외클래스2... {}
// 모든 종류의 예외가 발생할 가능성이 있는 경우
void ExamMethod() throws Exception {
}
public class ThrowExam {
public static void main(String[] args) {
try {
Exception intendedException = new Exception("의도적인 예외");
throw intendedExcepton;
} catch (Exception e) {
System.out.println("의도적인 예외 발생 성공");
}
}
}
// 출력 결과
// 의도적인 예외 발생 성공