자바공부

· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 45. 스트림은 주의해서 사용하라 스트림 다량의 데이터 처리 작업(순차 or 병렬)을 돕고자 자바 8에 추가되었다. 스트림(stream)은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻한다. 스트림 파이프라인(stream pipeline)은 이 원소들로 수행하는 연산 단계를 표현하는 개념이다. 스트림의 원소들은 어디서로부터 올 수 있다. ex) 컬렉션, 배열, 파일, 정규표현식 패턴 matcher, 난수생성기 등 스트림 안의 데이터 원소들은 객체 참조나 기본 타입 값이다. 기본 타입 값으로는 int, long, double 세 가지를 지원한다. 스트림 파이프라인 소스 스트림에서 시작해 종단 연산으로 끝나며, ..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 44. 표준 함수형 인터페이스를 사용하라 자바가 람다를 지원하면서 API를 작성하는 모범 사례가 바뀌었다. 상위 클래스의 기본 메서드를 재정의해 원하는 동작을 구현하는 템플릿 메서드 패턴의 매력이 크게 줄었다. 이를 대체하는 현대적인 해법은 같은 효과의 함수 객체를 받는 정적 팩터리나 생성자를 제공하는 것이다. 이 내용을 일반화해서 말하면 함수 객체를 매개 변수로 받는 생성자와 메서드를 더 많이 만들어야 하는데, 이 때 함수형 매개변수 타입을 올바르게 선택해야 한다. ex 1) LinkedHashMap의 removeEldestEntry protected boolean removeEldestEntry(Map..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 43. 람다보다는 메서드 참조를 사용하라 메서드 참조(method Reference) ex 1) 임의의 키와 Integer 값의 매핑을 관리하는 프로그램의 일부 map.merge(key, 1, (count, incr) -> count + incr); 이 코드는 키가 맵 안에 없다면 키와 숫자 1을 매핑하고, 있다면 기존 매핑값을 증가시킨다. 값이 키의 인스턴스 개수로 해석된다면, 이 프로그램은 멀티셋을 구현한게 된다. merge : 키, 값, 함수를 인수로 받으며 주어진 키가 맵 안에 없다면 주어진 {키, 값} 쌍을 그대로 저장한다. 반대로, 키가 있다면 인자로 받은 함수를 현재 값과 주어진 값에 적용한 ..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 42. 익명 클래스보다는 람다를 사용하라 익명 클래스 ex 1) 익명 클래스의 인스턴스를 함수 객체로 사용(예전 기법) Collection.sort(words, new Comparator() { public int compare(String s1, String s2){ return Integer.compare(s1.length(), s2.length()); } }); 전략 패턴처럼 함수 객체를 사용하는 과거 객체 지향 디자인 패턴에는 익명 클래스면 충분했다. 이 코드에서 Comparator 인터페이스가 정렬을 담당하는 추상 전략을 뜻하며, 문자열을 정렬하는 구체적인 전략을 익명 클래스로 구현한 것이다. 익..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 마커 인터페이스 아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가졌다는 것을 표시해주는 인터페이스를 마커 인터페이스라고 한다. 예로 Serializable 인터페이스 를 들면, Serializable은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 사용(직렬화)할 수 있다고 알려준다. 마커 인터페이스가 마커 애너테이션보다 좋은 이유 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나, 마커 애너테이션은 그렇지 않다. 마커 애너테이션을 사용했다면 런타임에 발견..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 40. @Override 애너테이션을 일관되게 사용하라 @Override 메서드 선언에만 달 수 있으며, 상위 타입의 메서드를 재정의할 때 사용하는 애너테이션이다. 이 애너테이션을 잘 사용해야 안정적인 프로그래밍이 가능하다. ex 1) Bigram 프로그램(영어 알파벳 2개로 구성된 문자열) public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second = second; } public boolean equ..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 타입 안전 열거 패턴 열거 타입은 거의 모든 상황에서 타입 안전 열거 패턴보다 우수하다. 단, 하나의 예외는 타입 안전 열거 패턴은 확장할 수 있다는 것이다. 타입 안전 열거 패턴은 열거한 값들을 그대로 가져온 다음 값을 더 추가하여 다른 목적으로 쓸 수 있는 반면, 열거 타입은 그렇게할 수 없다는 것이다. 사실, 대부분 상황에서 열거 타입을 확장하는 것은 좋지 않다. 확장한 타입의 원소는 기반 타입의 원소로 취급받지만 그 반대는 성립하지 않기 때문이다. 확장성을 높이려면 고려할 요소가 늘어나 설계와 구현이 복잡해진다. 확장할 수 있는 열거..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 37. ordinal 인덱싱 대신 EnumMap을 사용하라 ordinal 메서드 ex 1) Plant 클래스 public class Plant { enum LifeCycle { ANNUAL, PERNNIAL, BIENNIAL} final String name; final LifeCycle lifeCycle; Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return name; } } 정원에 심은 식물들을 배열 하나로 관리하고 이..
멍목
'자바공부' 태그의 글 목록 (2 Page)