목록책 정리 (74)
초보개발자 긍.응.성
동작 파라미터화에는 메서드 내부적으로 다양한 동작을 수행할 수 있도록 코드를 메서드 인수로 전달한다. 이 동작 파라미터화를 이용하면 자주 바뀌는 요구사항에 효과적으로 대응할 수 있다. 동작 파라미터화 방법 코드 전달 기법을 이용하면 동작을 메서드의 인수로 전달할 수 있다. 하지만 자바 8 이전에는 코드를 지저분하게 구현해야 했다. 익명 클래스로도 어느 정도 코드를 깔끔하게 만들 수 있지만 자바 8에서는 인터페이스를 상속받아 여러 클래스를 구현해야 하는 수고를 없앨 수 있는 방법을 제공한다. 선택 조건을 결정하는 (전략) 인터페이스 선언(Predicate) public interface ApplePredicate { boolean test(Apple apple); } 클래스를 통한 동작 파라미터화 publ..
자바는 처음부터 많은 유용한 라이브러리를 포함하는 잘 설계된 객체지향 언어로 시작했다. 코드를 JVM 바이트 코드로 컴파일하는 특징 때문에 자바는 인터넷 애플릿 프로그램의 주요 언어가 되었다. JVM의 업데이트 덕에 JVM에서 실행되는 경쟁 언어는 더욱 부드럽게 실행될 수 있으며, 자바와 상호 동작할 수 있게 되었다. 또한 자바는 다양한 임베디드 컴퓨팅 분야도 장악하고 있었다. 하지만 프로그래밍 언어 생태계에 변화의 바람이 불었다. 프로그래머는 빅데이터라는 도전에 직면하면서 멀티코어 컴퓨터나 컴퓨팅 클러스터를 이용해서 빅 데이터를 효과적으로 처리할 필요성이 커졌다. 또한 병렬 프로세싱을 활용해야 하는데 이전의 자바로는 충분히 대응할 수 없었다. 그렇기에 자바는 변화하였다. 자바 8은 더 다양한 프로그래밍..
객체 직렬화란 자바가 객체를 바이트 스트림으로 인코딩하고(직렬화) 그 바이트 스트림으로부터 다시 객체를 재구성하는(역직렬화) 메커니즘이다. 직렬화된 객체는 다른 VM에 전송하거나 디스크에 저장한 후 나중에 역직렬화할 수 있다. 직렬화가 품고 있는 위험과 그 위험을 최소화하는 방법을 배워보자. 자바 직렬화의 대안을 찾으라 직렬화는 위험하니 피해야 한다. ObjectInputStream의 readObject는 객체 그래프가 역직렬화된다. 역직렬화를 통하면 클래스 패스 안의 모든 타입의 객체를 만들어 그 타입들 안의 모든 코드를 수행할 수 있다. 즉, 그 타입들의 코드 전체가 공격 범위에 들어간다는 뜻이다. 직렬화 위험을 회피하는 가장 좋은 방법은 아무것도 역질렬화 하지 않는 것이다. 새로운 시스템에서 자바 ..
스레드는 여러 활동을 동시에 수행할 수 있게 해준다. 하지만 동시성 프로그래밍은 단일 스레드 프로그래밍보다 어렵다. 이번 장에는 동시성 프로그램을 명확하고 정확하게 만들고 잘 문서화하는 방법을 배워보자. 공유 중인 가변 데이터는 동기화해 사용하라 synchronized 키워드는 해당 메서드나 블록을 한 번에 한 스레드씩 수행하도록 보장한다. 동기화는 배타적 실행뿐 아니라 스레드 사이의 안정적인 통신에 꼭 필요하다. long, double, boolean 필드를 읽고 쓰는 작업은 원자적이다. 하지만 공유 중인 가변 데이터가 비록 원자적으로 읽고 쓸 수 있을지라도 동기화하지 않으면 메인 스레드가 수정한 값을 백그라운드 스레드가 언제쯤에나 보게 될지 보증할 수 없다. public class StopThread..
예외를 제대로 활용한다면 프로그램의 가독성, 신뢰성, 유지보수성이 높아지지만, 잘못 사용하면 반대의 효과만 나타난다. 예외를 효과적으로 활용하는 지침들에 대해 배워보자. 예외는 진짜 예외 상황에만 사용하라 예외는 그 이름이 말해주듯 오직 예외 상황에서만 써야 한다. 절대로 일상적인 제어 흐름용으로 쓰여선 안 된다. 잘 설계된 API라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없게 해야 한다. 특정 상태에서만 호출할 수 있는 '상태 의존적' 메서드를 제공하는 클래스는 '상태 검사' 메서드도 함께 제공해야 한다. 예시로 Iterator 인터페이스의 hasNext와 next메서드가 각각 상태 검사와 상태 의존적 메서드이다. for-each도 내부적으로 hasNext를 사용한다) 상태 검사 메서..
지역변수의 범위를 최소화하라 지역변수는 가장 처음 쓰일 때 선언하고, 선언과 동시에 초기화하도록 하자. 변수를 초기화하는 표현식에서 검사 예외를 던질 가능성이 있다면 try 블록 안에서 초기화하라. 메서드를 작게 유지하고 한 가지 기능에 집중하게 하라. 전통적인 for 문 보다는 for-each 문을 사용하라 전통적인 for 문은 반복자와 인덱스 변수가 여러 번 등장된다. 향상된 for-each문을 반복자와 인덱스 변수를 사용하지 않기에 코드가 더 깔끔해지고 오류가 날 일도 없다. for-each문은 배열은 물론 Iterable 인터페이스를 구현한 객체라면 무엇이든 순회할 수 있다. 아래와 같은 상황이 아니면 for-each문을 사용하자. 파괴적인 필터링 (destructive filtering) - 컬..