Study/이펙티브 자바
-
[Java] Effective Java 3/E 정리 - 12장 직렬화Study/이펙티브 자바 2021. 8. 16. 20:54
객체 직렬화란 자바가 객체를 바이트 스트림으로 인코딩하고 (직렬화) 그 바이트 스트림으로부터 다시 객체를 재구성하는 (역직렬화) 메커니즘이다. 직렬화된 객체는 다른 VM에 전송하거나 디스크에 저장 후 나중에 역직렬화할 수 있다. 이번 장은 직렬화의 위험과 그 위험을 최소화하는 방법에 대해 알아보자. Item 85. 자바 직렬화의 대안을 찾으라 직렬화는 생각보다 장점보다 위험성이 크다. 특히 역직렬화 과정에서 호출되는 readObject(Serializable 인터페이스 구현시)는 클래스 패스안의 거의 모든 타입 객체를 만들어내고 모든 코드를 수행할 수 있기 때문에 모든 코드가 공격 대상이 될 수 있다. 가젯(gadget) 역직렬화 과정에서 호출되어 잠재적으로 위험한 동작을 하는 메서드를 가젯(gadget..
-
[Java] Effective Java 3/E 정리 - 11장 동시성Study/이펙티브 자바 2021. 8. 11. 19:35
스레드는 여러 활동을 동시에 수행할 수 있게 해준다. 그러나 동시성 프로그래밍은 여러 문제를 고려해야하기 때문에 다루기 힘들다. 이번 장에서는 이러한 동시성 프로그램을 잘 만들 수 있는 조언을 정리해보자. Item78. 공유 중인 가변 데이터는 동기화해 사용하라 동기화는 배타적 실행과 스레드 사이의 안정적인 통신에 사용된다. 언어 명세상 long, double 외의 변수를 읽고 쓰는 동작은 원자적(atomic)이다. 여러 스레드가 같은 변수를 동기화없이 수정하는 중이라도, 항상 어떤 스레드가 정상적으로 저장한 값을 읽어옴을 보장한다. 이를 보고 원자적 데이터를 읽고 쓸 때 동기화를 사용하지 않는다면 위험하다. '수정이 완전히 반영된'값을 얻는 다는 것은 보장하지만, 한 스레드가 저장한 값이 다른 스레드에..
-
[Java] Effective Java 3/E 정리 - 10장 예외Study/이펙티브 자바 2021. 7. 31. 20:29
예외를 제대로 활용하면 가독성, 신뢰성, 유지보수성을 높일 수 있다. 이번 장에서 예외를 효과적으로 활용하는 방법을 알아보자. Item69. 예외는 진짜 예외 상황에만 사용하라 이번 장은 제목 그대로 예외는 오직 예외 상황에서만 사용하라는 것이다. 일상적인 제어 흐름용으로 쓰인다면 가독성과 성능을 떨어뜨리는 뿐만 아니라 제대로 동작하지 않거나, 버그를 숨겨 디버깅을 어렵게 할 수 있다. 이 원칙은 API 설계에도 사용된다. 특정 상태에서만 호출할 수 있는 '상태 의존적' 메서드를 제공하는 클래스는 '상태 검사'메서드도 제공해야 한다. 예를 들면 Iterator 인터페이스의 next가 상태 의존적 메서드, hasNext가 상태 검사 메서드에 속한다. 상태 검사 메서드 대신 빈 옵셔널 혹은 null과 같은 ..
-
[Java] Effective Java 3/E 정리 - 9장 일반적인 프로그래밍 원칙Study/이펙티브 자바 2021. 7. 28. 19:09
이번 장에서는 지역변수, 제어구조, 라이브러리, 데이터 타입, 리플렉션과 네이티브 메서드에 대해서 다룬다. 그리고 추가로 최적화와 명명 규칙에 대해서도 알아보자. 참고로 이번 장은 아이템 제목만 봐도 알 수 있을 정도이기 때문에 핵심 방법과 그 이유에 대해서만 간단하게 설명한다. (절대 과제 기한이 촉박해서 그런게 아니다 😉....) Item57. 지역변수의 범위를 최소화하라 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 지역범수의 범위를 줄이면서 효과적으로 사용하는 방법은 아래와 같다. 가장 처음 쓰일 때 선언하기 모든 지역변수는 선언과 동시에 초기화한다. while문보다는 반복문을 사용하면 반복 변수의 범위를 제한하기 좋다. 메서드를 작게 유지하고 ..
-
[Java] Effective Java 3/E 정리 - 8장 메서드Study/이펙티브 자바 2021. 7. 18. 21:22
이번 장에서는 메서드를 설계할 떄 주의할 점을 살펴보자, 매개변수와 반환값 처리, 메서드 시그니처 설꼐, 문서화 방법에 대한 것을 다루고, 이번장은 메서드 뿐만 아니라 생성자에도 적용되는 부분이 많다. Item49. 매개변수가 유효한지 검사하라 메서드와 생성자 대부분은 입력 매개변수의 값이 특정조건을 만족하기를 바란다. 이런 제약은 반드시 문서화해야 하며 메서드가 시작되기 전 검사해야하한다. 메서드 로직이 실행되기 전에 매개변수를 확인한다면 즉각적이고 깔끔한 방식으로 예외를 던질 수 있다. public과 protected 메서드는 매개변수 값이 잘못됐을 때 던지는 예외를 문서화해야한다. (@throws 자바독 태그를 사용한다.) 보통은 IllegalArgumentException, IndexOutofBo..
-
[Java] Effective Java 3/E 정리 - 6장 열거 타입과 어노테이션Study/이펙티브 자바 2021. 7. 7. 16:21
자바에는 특수한 목적의 참조 타입이 두가지 있다. 클래스의 일종인 열거 타입(enum)과 인터페이스의 일종인 어노테이션(annotation)이다. 이번 장에서는 이 타입들을 올바르게 사용하는 방법을 알아보자. Item34. int 상수 대신 열거 타입을 사용하라 열거 타입은 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입이다. 자바에서 열거 타입을 지원하기 전에는 접두어를 붙이고 정수 상수 나열하여 선언하는 정수 열거 패턴을 사용했다. public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public ..
-
[Java] Effective Java 3/E 정리 - 4장 클래스와 인터페이스Study/이펙티브 자바 2021. 6. 23. 19:22
이번 장에서는 클래스와 인터페이스를 쓰기 편하고, 견고하며, 유연하게 만드는 방법을 알아본다. Item15. 클래스와 멤버의 접근 권한을 최소화하라 정보 은닉 (캡슐화) 잘 설계된 컴포넌트는 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼는냐가 중요하다. 이는 정보은닉, 혹은 캡슐화라고 하는 개념으로 소프트웨어 설계의 근간이 되는 원리다. 정보 은닉의 장점은 다음과 같이 정리할 수 있다. 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다. 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 부담도 적기 때문이다. 정보 은닉 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움을 준다. 완성된 시스템을 프로..
-
[Java] Effective Java 3/E 정리 - 3장 모든 객체의 공통 메서드Study/이펙티브 자바 2021. 6. 16. 18:55
3장은 Object에서 재정의가 가능한 메서드를 재정의할 때 지켜야할 규약에 대해 설명한다. * equals, hashCode, toString, clone, finalize 규약을 지키지 않고 잘못 구현할 경우 HashMap, HashSet 등과 같은 클래스에서 오동작할 위험이 있다. Item10. equals는 일반 규약을 지켜 재정의하라 equals를 재정의하지 않고 사용할 경우 오직 자기 자신과만 같게 된다. 아래 4가지의 상황에 해당된다면 재정의하지 않는 것이 좋다. 각 인스턴스가 본질적으로 고유하다. 값을 표현하는 것이 아니라 동작하는 객체를 표현하는 클래스가 해당한다. ex) Thread 인스턴스의 '논리적 동치성(logical equality)'을 검사할 일이 없다. 상위 클래스에서 재정의..