[Study-NextStep] 2021-12-18

일시 : 2021-12-18
범위 : 자바 웹 프로그래밍 Next Step 7장 실습 설명(p243-p276)

Share

@SuppressWarnings

@SuppressWarnings 어노테이션은 컴파일 경고를 사용하지 않도록 설정해주는 것으로, 이클립스에서 노란색 표시줄이 나타내는 것(경고)을 제외시킬 때 사용한다.

옵션을 통해 제외할 경고를 지정할 수 있다.

@SuppressWarnings("옵션")

옵션 명제외 경고
all모든 경고
cast캐스트 연산자 관련 경고
dep-ann사용하지 말아야 할 주석 관련 경고
deprecation사용하지 말아야 할 메서드 관련 경고
fallthroughswitch문에서 break 누락 관련 경고
finally반환하지 않는 finally 블럭 관련 경고
nullnull 분석 관련 경고
rawtypes제너릭을 사용하는 클래스 매개 변수가 불특정일 때의 경고
unchecked검증되지 않은 연산자 관련 경고
unused사용하지 않는 코드 관련 경고

콜백 인터페이스

콜백을 간단하게 설명하면 아래와 같다.
1. 피호출자(Callee)가 호출자(Caller)를 다시 호출하는 것
2. 비동기적 처리를 하기 위한 디자인 패턴의 종류

일반 : 호출자(Caller) → 피호출자(Callee)
콜백 : 피호출자(Callee) → 호출자(Caller)

  • 호출자(Caller) : 인터페이스로 생성한 콜백함수를 Override
  • 피호출자(Callee) : 조건을 확인하고 콜백함수를 호출

예제는 타 블로그에서 확인 가능하다.

serialVersionUID

  • 직렬화(Serialization) : 자바의 객체를 바이트 배열로 변환해 파일, 메모리, DB 등에 저장하는 과정
  • 역직렬화(Deserialization) : 저장된 것을 다시 객체로 변환하는 과정

직렬화를 할 때는 serialVersionUID를 저장한다.
저장한 serialVersionUID는 객체로 다시 불러들일 때(역직렬화) 값을 체크하는 용도로 사용된다.

serialVersionUID를 작성하지 않으면 Java VM에서 자동으로 작성되게 되는데, 사용하는 Java VM에 따라 다른 값이 설정되어 Exception이 발생하는 경우가 있다.
따라서, serialVersionUID를 직접 관리하는 것을 권장한다.

자세한 내용은 아래 블로그에서 확인한다.
https://n1tjrgns.tistory.com/259

try-with-resources

자원을 반납하기 위해서 try-catch-finally 구분을 사용한다.
하지만, 자바 7버전부터 제공하는 java.io.AutoClosable 인터페이스의 try-with-resources 구문을 활용하면 finally에서 close() 메소드를 사용하지 않아도 자원을 자동으로 반납할 수 있다.

여러개의 리소스를 생성할 수 있으며, 여러개의 리소스가 선언되어 있을 경우에는 나중에 선언된 리소스부터 반납된다.

try (Connection con = ConnectionManager.getConnection();
	PreparedStatement pstmt = con.prepareStatement(sql);
	ResultSet rs = pstmt.executeQuery();
) {
	pss.setValues(pstmt);
	List<T> resultList = new ArrayList<T>();
	while(rs.next()) {
		resultList.add(rowMapper.mapRow(rs));
	}
	return resultList;
    
} catch (SQLException e) {
	throw new DataAccessException(e);
}

Checked Exception → Unchecked Exception

책을 보면 Checked Exception을 Runtime Exception으로 바꾸는 처리가 있다.
그 이유를 알아보자.

Checked Exception은 반드시 처리해야하는 Exception이기 때문에 try/catch로 감싸거나 throw로 던져서 처리해야한다. 반면에 Unchecked Exception은 명시적인 예외처리를 하지 않아도 된다.
또한, Checked Exception은 예외가 발생하면 트랜잭션을 roll-back하지 않고 예외를 던져준다.
하지만 Unchecked Exception은 예외 발생 시, 트랜잭션을 roll-back한다.

API를 사용할 때 매번 try/catch 구문을 사용하는 번거로움을 줄이고, 예외 발생 시 roll-back을 하기 위해 변경하지 않았을까 추측한다.

(참고 : https://www.nextree.co.kr/p3239/)

제너릭(Generic)

데이터 타입을 특정하지 않고 범용적으로 사용할 수 있게 사용하고 싶을 때 제네릭(Generic)을 사용한다.
즉, 제네릭은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다.

장점

  • 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
  • 클래스 외부에서 타입을 지정해주기 때문에, 따로 타입을 체크하고 변환해주지 않아도 된다. 관리가 편하다.
  • 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.

사용 방법

타입설명
<T>Type
<E>Element
<K>Key
<V>Value
<N>Number
  // 클래스 및 인터페이스 선언
  public class ClassName<T> {...}
  public Interface InterfaceName<T> {...}
  
  // HashMap
  public class HashMap<K, V> {...}
  
  // 메소드 선언
  // [접근 제어자] <제네릭타입> [반환타입] [메소드명] ([제네릭타입] [파라미터])
  public <T> T methodName(T o) {...}

특정 범위 내로 좁혀서 제한하고 싶을 경우에는 extends, super, ?(와일드카드)를 사용하면 된다.

  • extends T : 상한 경계
  • ? super T : 하한 경계
  • : 와일드 카드
  <K extends T>	// T와 T의 자손 타입만 가능 (K는 들어오는 타입으로 지정됨)
  <K super T>	// T와 T의 부모(조상) 타입만 가능 (K는 들어오는 타입으로 지정됨)
  
  <? extends T>	// T와 T의 자손 타입만 가능
  <? super T>	// T와 T의 부모(조상) 타입만 가능
  <?>		// 모든 타입 가능. <? extends Object>와 같은 의미

(참고 : https://st-lab.tistory.com/153)

Find More

NoSQL

디자인 패턴

Java 8

좋은 웹페이지 즐겨찾기