목록JAVA (92)
도당탕탕
for (Element e : elements) { ...// Do something with e } 위는 for each element e in elements 라고 읽힌다. foreach 문은 전통적인 for loop와 비교했을 때 성능차이가 없다. FOR EACH의 장점 // Can you spot the bug? enum Suit { CLUB, DIAMOND, HEART, SPADE } enum Rank { ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING } ... static Collection suits = Arrays.asList(Suit.values()); static Collection ranks..
지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 지역변수 초기화 자바에서는 문장을 선언할 수 있는 곳이면 어디서든 변수를 선언할 수 있다. 이렇기에 지역변수의 범위를 줄이는 가장 강력한 기법은 역시 가장 처음 쓰일 때 선언하기이다. 만약 사용하려면 멀었는데, 미리 선언부터 해두면 코드가 어수선해져 가독성이 떨어진다. 변수를 실제로 사용하는 시점엔 타입과 초깃값이 기억나지 않을 수도 있다. 그리고 지역변수를 생각 없이 선언하다 보면 변수가 쓰이는 범위보다 너무 앞서 선언하거나, 다 쓴 뒤에도 여전히 살아 있게 되기 쉽다. 또한 거의 모든 지역변수는 선언과 동시에 초기화해야 한다. 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다. ..
만약 API가 사용가능하면, 반드시 문서화해야 한다. Java 환경에서는 Javadoc utility 로 이 작업을 쉽게 할 수 있다. Javadoc 은 소스코드로 부터 API 문서를 자동으로 생성한다. 모든 공개된 리소스에 주석을 달 것 API를 올바로 문서화하려면 공개된 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달아야 한다. 메서드용 문서화 주석에는 규약을 명료하게 기술할 것 메서드용 문서화 주석에는 해당 메서드와 클라이언트 사이의 규약을 명료하게 기술해야 한다. 메서드가 어떻게 동작하는지를 적는 게 아니라 무엇을 하는지 기술해야 한다. 클라이언트가 해당 메서드를 호출하기 위한 전제조건을 모두 나열해야 한다. 메서드가 성공적으로 수행된 후에 만족해야 하는 사후조건도 나열해야 한다. 전..
자바 8 이전에는 메서드가 특정 조건에서 값을 반환할 수 없을 때 취할 수 있는 선택지가 다음과 같이 두 가지 있었는데 각각 문제가 있었다. 예외를 던진다. -> 진짜 예외에서만 사용해야 한다. null을 반환한다. -> null이 절대 반환되지 않는다고 확신하지 않는 한 별도의 null 처리 코드를 추가해야 한다. 하지만 자바 8에 Optional이 생기고 나서 위의 문제들을 어느 정도 해결해 줄 수 있었다. Optional Optional 는 null이 아닌 T 타입 참조를 하나 담거나, 혹은 아무것도 담지 않을 수 있다는 뜻이다. 즉 옵셔널은 원소를 최대 1개 가질 수 있는 불변 컬렉션 인다. 보통은 T를 반환해야 하지만 특정 조건에서는 아무것도 반환하지 않아야 할 때 T 대신 Optional를 반..
다음처럼 리스트가 비어있을 때 null을 반환하는 코드가 있다고 하자. private final List cheesesInStock = ...; public List getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList(cheesesInStock); } 이렇게 할 경우, 저 함수를 사용하는 클라이언트는 다음과 같은 null 체크 로직을 수행해야 한다. List cheeses = shop.getCheeses(); if (cheeses != null && cheeses.contains(Cheese.STILTON)) System.out.println("Jolly good, just the thing."); 이러한 코드는 실수할 가능성이 존..
가변인수 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있다. 가변인수 메서드를 호출하면, 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 저장하여 가변인수 메서드에 건네준다. 다음 예를 보자. 간단한 가변인수 활용 예 static int sum(int... args) { int sum = 0; for (int arg : args) sum += arg; return arg; } 다음 예제는 args 들의 합을 도출하는 메소드이다. 런타임시 args의 배열을 만들고 해당 메서드에 인수를 전달해 처리한다. 그렇다면 다음 예를 한번 보자. 인수가 1개 이상이어야 하는 가변인수 메소드 - 잘못 구현한 예 static int min(int... args) { if (args.length..
public class CollectionClassifier { public static String classify(Set s) { return "Set"; } public static String classify(List lst) { return "List"; } public static String classify(Collection c) { return "Unknown Collection"; } public static void main(String[] args) { Collection[] collections = { new HashSet(), new ArrayList(), new HashMap().values() }; for (Collection c : collections) System.out..
이번 아이템에는 개별 아이템으로 두기 애매한 API 설계 요령들을 모아 놓았다. 다음을 보자. 1. 메서드 이름을 신중히 짓자. 항상 표준 명명 규칙을 따라야 한다. 이해하기 쉽고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는 게 최우선 목표이다. 그다음 목표는 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하는 것이다. 긴 이름은 피하자. 애매하면 자바 라이브러리의 API 가이드를 참조하는 것이 좋다. 2. 편의 메서드를 너무 많이 만들지 말자. 모든 메서드는 각각 자신의 소임을 다해야 한다. 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수 하는데 어렵다. 인터페이스도 마찬가지이다. 따라서 아주 자주 쓰일 경우에만 별도의 약칭 메서드를 두기 바란다. 확신이 서지 ..