상위 클래스 및 인터페이스로 타입을 선언하여 자식 요소들을 받을 수 있다. 배열도 가능.
타입 자체로는 생성자 호출이 불가능. 타입으로 선언하여 자식 클래스를 감쌀 순 있다.
트랜잭션 : 하나의 작업 단위
예를 들어 ‘송금’ 트랙잭션을 가정
만약 프로세스 중에 하나라도 실패하면 모두 취소해야 데이터의 정합성이 괜찮은데 이떄 모두 취소하는 행위를 롤백(rollback)이라고 한다. → 데이터의 일관성을 지켜야함.
돈_송금() {
**try {**
송금_상태변경(처리중);
송금인_계좌_출금();
수금인_계좌_입금();
송금_상태변경(완료);
**} catch (예외) {
모두취소(); // 롤백
}**
}
송금_상태변경(status) **throws 예외** { // throws로 원자성을 보장
...
}
송금인_계좌_출금() **throws 예외** {
...
}
수금인_계좌_입금() **throws 예외** {
...
}
자바 7에 등장.
예외 발생 여부와 상관없이 사용했던 리소스 객체(입출력, 스트림, 서버소켓, …)의 close() 메소드를 호출하여 안전하게 리소스를 닫아준다.
try문에서 예외가 발생했다면 catch문에 도달하기 전에 try문에 호출된 자원은 close된다.
부모 메소드와 다른 예외(Exception)를 throws 할 수 없음.
부모 클래스 메소드에 들어갈 예외
자식 클래스 메소드에 들어갈 수 있는 예외
데이터의 타입(data type)을 일반화(generalize) 한다는 것을 의미.
제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법.
ArrayList<String> list = new ArrayList<>();
list.add()
List<Youtube> youtubeList = new ArrayList<Youtube>();
youtubeList.add(new Youtube());
youtubeList.add(new DisneyPlus()); // 컴파일 에러 발생. Youtube 외에 다른 타입 저장불가
// 제네릭 X
List list = new ArrayList();
list.add("Hello");
String str = (String) list.get(0); // String 타입으로 강제 변환
// 제네릭 O
List<String> list = new ArrayList<String>();
list.add("Hello");
String str = list.get(0);
public class 클래스명<T> { ... }
public interface 인터페이스명<T> { ... }
public class Box<T> {
private T t;
public T get() {
return t;
}
public void set(T t) {
this.t = t;
}
}
// main 메소드
Box<String> box = new Box<String>(); // T -> String
box.set("문자열");
String str = box.get();
Box<Integer> intBox = new Box<Integer>(); // T -> Integer
intBox.set(10); // 자동 Boxing
int intVal = intBox.get(); // 자동 Unboxing
Box<int> box = new Box<int>(); // X : 오류
Box<Integer> box = new Box<Integer>(); // O : primitive 타입의 경우 wrapper 클래스로 작성
public <타입파라미터, …> 리턴타입 메소드명(매개변수, …) {}
// 제네릭 메소드
public static <T> Box<T> boxing(T t) {
Box<T> box = new Box<T>();
box.set(t);
return box;
}
// main 메소드
Box<String> val = Util.boxing("제네릭 메소드"); // T -> String
System.out.println(val.get());