[Study-NextStep] 2021-12-18
일시 : 2021-12-18
범위 : 자바 웹 프로그래밍 Next Step 7장 실습 설명(p243-p276)
Share
@SuppressWarnings
@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
- 직렬화(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
Author And Source
이 문제에 관하여([Study-NextStep] 2021-12-18), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jeonye/Study-NextStep-2021-12-18저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)