책/Effective Java
-
[이펙티브 자바 스터디] 직렬화 - 2책/Effective Java 2024. 6. 19. 00:14
readObject 메서드는 방어적으로 작성하라 public final class Period { private final Date start; private final Date end; /** * @param start 시작 시각 * @param end 종료 시각; 시작 시각보다 뒤여야 한다. * @throws IllegalArgumentException 시작 시각이 종료 시각보다 늦을 때 발생한다. * @throws NullPointerException start나 end가 null이면 발행한다. */ public Period(Date start, Date end) { this.start = new Date(start..
-
[이펙티브 자바 스터디] 직렬화책/Effective Java 2024. 6. 13. 03:09
자바 직렬화의 대안을 찾으라 워게임이라는 영화에서 조슈아라는 컴퓨터는 이렇게 말한다고 한다."승리하는 유일한 길은 전쟁하지 않는 것이다."자바 직렬화도 마찬가지 이다."직렬화의 위험을 피하는 가장 좋은 방법은 아무것도 역직렬화하지 않는 것이다." 먼저 직렬화란 자바가 객체를 바이트 스트림으로 인코딩하는 것이 직렬화이고그 바이트코드로 부터 객체로 재구성하는 것이 역직렬화이다. 자바의 역직렬화는 명백하고 현존하는 위험이라고 한다.신뢰할 수 없는 스트림을 역직렬화하면 Remote Code Execution , Denial of Service 등의 공격으로 이어질 수 있다. 2016년 샌츠란시스코 시영 교통국에서는 이런 직렬화의 보안 문제로 인해 랜섬웨어 공격을 받은 적이 있다고 한다. https://www.t..
-
[이펙티브 자바 스터디] 제네릭 - 2책/Effective Java 2024. 6. 7. 18:42
배열보다는 리스트를 사용하라 배열은 공변(함께 변함)이다.하지만 제네릭은 불공변이다. 배열의 공변성으로 인한 문제Object[] objectArray = new Long[1];objectArray[0] = "응 안돼"; // 런타임 에러 발생 제네릭의 이점List list = new ArrayList(); // 컴파일 에러... 배열은 실체화된다.그래서 런타임 시에도 그 타입 정보가 존재한다. 하지만 제네릭은 그렇지 않다.컴파일 시점까지만 존재하고 이후엔 Object 로 변환되거나 제거된다. 그래서 배열은 제네릭 타입, 매개변수화 타입 , 타입 매개변수로 사용할 수 없다. List[] stringLists = new List[1]; // (1)List intList = List.of(42); // ..
-
[이펙티브 자바 스터디] 제네릭책/Effective Java 2024. 5. 30. 19:18
제네릭(Generic)은 자바 5부터 도입된 기능으로, 클래스나 메서드를 선언할 때 타입을 파라미터로 받을 수 있게 해준다. 이는 코드의 재사용성을 높이고, 타입 안전성을 보장하며, 캐스팅(casting)을 줄여준다. 그니까 컬렉션이 담을 수 있는 타입을 컴파일러에게 알려줘서 엉뚱한 타입의 객체를 넣으려는 시도를 컴파일 과정에서차단하여 런타임 시의 오류를 피할 수 있게 하는 것이다.Raw 타입은 사용하지 말라먼저 Raw 타입이란 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않은 것을 말하고 List 의 Raw 타입은 List 인 것이다.이는 제네릭이 생기기 전 코드와 호환되도록 하기 위해 만들어둔 것으로 사용하지 않는 것이 좋다. 제네릭의 장점은 다음과 같다. 1. 클래스나 메소드 내부에서 사용되는 객..