일시 : 2021-12-18
범위 : 자바 웹 프로그래밍 Next Step 7장 실습 설명(p243-p276)
@SuppressWarnings 어노테이션은 컴파일 경고를 사용하지 않도록 설정해주는 것으로, 이클립스에서 노란색 표시줄이 나타내는 것(경고)을 제외시킬 때 사용한다.
옵션을 통해 제외할 경고를 지정할 수 있다.
@SuppressWarnings("옵션")
옵션 명 | 제외 경고 |
---|---|
all | 모든 경고 |
cast | 캐스트 연산자 관련 경고 |
dep-ann | 사용하지 말아야 할 주석 관련 경고 |
deprecation | 사용하지 말아야 할 메서드 관련 경고 |
fallthrough | switch문에서 break 누락 관련 경고 |
finally | 반환하지 않는 finally 블럭 관련 경고 |
null | null 분석 관련 경고 |
rawtypes | 제너릭을 사용하는 클래스 매개 변수가 불특정일 때의 경고 |
unchecked | 검증되지 않은 연산자 관련 경고 |
unused | 사용하지 않는 코드 관련 경고 |
콜백을 간단하게 설명하면 아래와 같다.
1. 피호출자(Callee)가 호출자(Caller)를 다시 호출하는 것
2. 비동기적 처리를 하기 위한 디자인 패턴의 종류
일반 : 호출자(Caller) → 피호출자(Callee)
콜백 : 피호출자(Callee) → 호출자(Caller)
- 호출자(Caller) : 인터페이스로 생성한 콜백함수를 Override
- 피호출자(Callee) : 조건을 확인하고 콜백함수를 호출
예제는 타 블로그에서 확인 가능하다.
직렬화를 할 때는 serialVersionUID를 저장한다.
저장한 serialVersionUID는 객체로 다시 불러들일 때(역직렬화) 값을 체크하는 용도로 사용된다.
serialVersionUID를 작성하지 않으면 Java VM에서 자동으로 작성되게 되는데, 사용하는 Java VM에 따라 다른 값이 설정되어 Exception이 발생하는 경우가 있다.
따라서, serialVersionUID를 직접 관리하는 것을 권장한다.
자세한 내용은 아래 블로그에서 확인한다.
https://n1tjrgns.tistory.com/259
자원을 반납하기 위해서 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을 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)을 사용한다.
즉, 제네릭은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다.
타입 | 설명 |
---|---|
<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, ?(와일드카드)를 사용하면 된다.
<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)