JAVA 예외처리, 제네릭

금송·2024년 9월 24일
0

이론

목록 보기
18/26
post-thumbnail

추상 클래스, 인터페이스의 다형성

상위 클래스 및 인터페이스로 타입을 선언하여 자식 요소들을 받을 수 있다. 배열도 가능.

타입 자체로는 생성자 호출이 불가능. 타입으로 선언하여 자식 클래스를 감쌀 순 있다.

Error

예외 (Exception)

  • CheckedException (컴파일러가 알려줌)
  • UncheckedException (런타임 오류)

예외 처리

  • (직접 처리) try-catch-finally
  • (호출측으로 예외처리를 넘김) throws

예외 트랜잭션 처리 방법

트랜잭션 : 하나의 작업 단위

예를 들어 ‘송금’ 트랙잭션을 가정

  • 송금 ‘처리중’ 상태로 변경
  • 송금인 계좌에 돈이 빠져 나감
  • 수금인 계좌에 돈이 채워짐
  • 송금 ‘완료’ 상태로 변경

만약 프로세스 중에 하나라도 실패하면 모두 취소해야 데이터의 정합성이 괜찮은데 이떄 모두 취소하는 행위를 롤백(rollback)이라고 한다. → 데이터의 일관성을 지켜야함.

트랜잭션의 특징 (ACID)

  1. 원자성 (Atomicity)
    • 완벽하게 성공하거나 완벽하게 실패하거나. 즉 부분적으로 실행되거나 중단되지 않는 것을 보장.
  2. 일관성(Constency)
    • 데이터 베이스의 특징이라고 생각하면 됨. 데이터에 일관성이 있어야 한다.
  3. 격리성, 고립성(Isolation)
  4. 지속성, 영속성(Durability)
돈_송금() {
	**try {**
		송금_상태변경(처리중);
		송금인_계좌_출금();
		수금인_계좌_입금();
		송금_상태변경(완료);
	**} catch (예외) {
		모두취소();                           // 롤백
	}**
}

송금_상태변경(status) **throws 예외** {                  // throws로 원자성을 보장
	...
}

송금인_계좌_출금() **throws 예외** {
	...
}

수금인_계좌_입금() **throws 예외** {
	...
}

자동 리소스 닫기(try-with-resource)

자바 7에 등장.

예외 발생 여부와 상관없이 사용했던 리소스 객체(입출력, 스트림, 서버소켓, …)의 close() 메소드를 호출하여 안전하게 리소스를 닫아준다.

try문에서 예외가 발생했다면 catch문에 도달하기 전에 try문에 호출된 자원은 close된다.

메소드 재정의

부모 메소드와 다른 예외(Exception)를 throws 할 수 없음.

  • 부모 메소드와 같은 예외, 혹은 그 하위 예외는 가능
    • ex) 부모: IOException / 자식 : FileNotFoundException
  • 단 런타임 예외는 해당 규칙 적용 안됨

부모 클래스 메소드에 들어갈 예외

  • IOException

자식 클래스 메소드에 들어갈 수 있는 예외

  • FileNotFoundException
  • NumberFormatException
  • ClassCastException
  • ArithmeticException

제네릭

데이터의 타입(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);

제네릭 타입

  • 타입을 parameter로 가지는 클래스와 인터페이스
  • 클래스 또는 인터페이스 뒤에 <> 부호가 붙고, 사이에 타입 parameter가 위치
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 클래스로 작성

제네릭 메소드

  • 매개 타입과 리턴 타입으로 타입 parameter을 갖는 메소드
  • 리턴 타입 앞에 <>기호를 추가하고 타입 parameter를 기술한 다음, 리턴 타입과 매개 타입으로 타입 parameter를 사용
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());
profile
goldsong

0개의 댓글

관련 채용 정보