목록전체 글 (115)
도당탕탕
Collections.sort(words, new Comparator() { @Override public int compare(String s1, String s2) { return Integer.compare(s1.length(),s2.length()) } }); 위와 같이 anonymous class를 사용해서 sort함수를 호출할 수 있다. 하지만 코드의 길이가 길어진다는 단점이 있다. Java8부터는 하나의 추상 메서드를 가진 인터페이스를 특별하게 취급하기 시작했다. 이러한 인터페이스를 functional interface 라고 부른다. 언어적 차원에서 이러한 인터페이스를 lamda expression으로 부를 수 있도록 허락하게 되었다. 람다는 anonymous class와 유사하지만 더 간결..
마커 인터페이스란 아무 메서드도 담지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스를 말한다. 대표적인 예로 Serializable 인터페이스가 있다. Serializable은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 쓸 수 있다는, 즉 직렬화할 수 있다고 알려준다. 마커 인터페이스의 장점 마커 애너테이션이 신식이라 말하고 마커 인터페이스보다 좋다고 말하는데 이는 사실이 아니다. 오히려 다음과 같이 두 가지 측면에서 마커 애너테이션보다 마커 인터페이스가 낫다고 한다. 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나, 마커 애너테이션은 그렇지 않다. 즉 인터페이스가 어엿한 타입이므로 런타임에야 발견될 오류..
@Override를 사용하지 않았을 때, 발생할 수 있는 문제 상황 package item40; import java.util.HashSet; import java.util.Set; 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 equals(Bigram b) { return b.first == first && b.second == second; } public int hashCode() { return 31 * first + second; }..
전통적으로 도구나 프레임워크가 특별히 다뤄야 할 프로그램 요소에는 딱 구분되는 명명 패턴을 적용해 왔다. 예컨대 테스트 프레임워크인 JUnit은 버전 3까지 테스트 메서드 이름을 test로 시작하게끔 했다. 하지만 이 방법은 다음과 같이 단점이 많다. 오타가 나면 안 된다. ( 실수로 tset~~ 하면 Junit3에서는 해당 테스트 클래스를 무시하게 된다. ) 명명 패턴은 올바른 프로그램 요소에서만 사용되리라 보증할 방법이 없다. ( 메서드가 아닌 클래스로 Test~~ 이라 지었을 때, Junit에 던지면 수행하지 않는다. ) 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없다. ( 특정 예외를 던져야만 성공하는 테스트를 해야 할 경우 방법이 없다. ) 어노테이션 위 문제들은 JUnit4의 어노테이션을..
개요 Enum을 확장하고 싶을 때, enum을 상속하면 된다고 생각할 수 있는데 문제가 있다. 왜냐하면 상속된 enum type은 부모 enum type이라고 볼 수 있지만, 부모 enum type은 자식 enum type이라고 볼 수 없기 때문에, 서로 확장 관계로 보기에는 헷갈리기 때문이다. 인터페이스를 사용해서 확장성있는 Enum 구현하기 public interface Operation { double apply(double x, double y); } // BasicOperation.java public enum BasicOperation implements Operation { PLUS("+"){ @Override public double apply(double x, double y) { ret..
배열이나 리스트에서 원소를 꺼낼 때 ordinal 메서드로 인덱스를 얻는 코드가 있다. 다음 예를 보자 Plant 코드 class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL // 한해살이, 여러해살이, 두해살이 } final String name; final LifeCycle lifeCycle; public Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeCycle = lifeCycle; } @Override public String toString() { return name; } } 이 코드는 정원에 심는 식물들을 배열 하나로 관리하고, 이들의 생명주기를 나타내주고 있다. (..
다음은 비트 필드는 enum 타입에 집합연산을 사용할 때 주로 사용한다. public class Text{ public static final int STYLE_BOLD = 1
모든 열거 타입은 해당 상수가 몇 번째 위치인지를 반환하는 ordinal() 이라는 메서드를 제공한다. java.lang.Enum 추상 클래스의 ordinal 정수형 필드 ordinal 메서드 출처: https://javabom.tistory.com/49 하지만 이 메서드는 여러 문제점을 야기한다. 다음 예를 보자. ordinal 메서드를 잘못 사용한 예 public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECET; public int numberOfMusicians() { return ordinal() + 1; } } 이 코드를 보면 동작은 하지만 유지보수하기가 끔찍한 코드다. 이유는 다음과 같..