![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/o7yQA/btrBsZSqnuL/L8lJjzrjGGZvror2oUBzEk/img.jpg)
API를 쓸모 있게 하려면 잘 작성된 문서도 곁들여야 합니다. 전통적으로 API 문서는 사람이 직접 작성하므로 코드가 변경되면 매번 함께 수정해줘야 하는데, 자바에서는 Javadoc이라는 유틸리티가 이 귀찮은 작업을 도와줍니다. 자바독은 소스코드 파일에서 문서화 주석이라는 특수한 형태로 기술된 설명을 추려 API 문서로 변환해줍니다. 문서화 주석을 작성하는 규칙은 공식 언어 명세에 속하진 않지만 자바 프로그래머라면 응당 알아야 하는 업계 표준 API라 할 수 있습니다. 여러분의 API를 올바로 문서화하려면 모든 클래스, 인터페이스, 메서드, 필드 선언에 문서화 주석을 달아야 합니다. 직렬화할 수 있는 클래스라면 직렬화 형태(아이템 87)에 관해서도 적어야 합니다. 문서화 주석이 없다면 자바독도 그저 공개..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bLB9io/btrBu5EklPO/4vFhleKEBD7bFOBk6X5Nm0/img.jpg)
자바 8 전에는 메서드가 특정 조건에서 값을 반환할 수 없을 때 취할 수 있는 선택지가 두 가지 있었습니다. 예외를 던지거나, (반환 타입이 객체 참조라면) null을 반환하는 것입니다. 두 방법 모두 허점이 존재합니다. 예외 예외는 진짜 예외적인 상황에서만 사용해야 하며 (아이템 69) 예외를 생성할 때 스택 추적 전체를 캡처하므로 비용도 만만치 않습니다. null 반환 null을 반환하면 위같은 문제는 생기지 않지만, 그 나름의 문제가 있습니다. null을 반환할 수 있는 메서드를 호출할 때는, (null이 반환될 일이 절대 없다고 확신하지 않는 한) 별도의 null 처리 코드를 추가해야 합니다. null 처리를 무시하고 반환된 null 값을 어딘가에 저장해두면 언젠가 NullPointerExcept..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bk9dQu/btrBuzewq7F/HJJVBBXH67BzCS72zDCDk0/img.jpg)
다음은 주변에서 흔히 볼 수 있는 메서드입니다. private final List cheeseInStock = ...; /** * @return 매장 안의 모든 치즈 목록을 반환한다. * 단, 재고가 하나도 없다면 null을 반환한다. */ public List getCheeses() { return cheeseInStock.isEmpty() ? null : new ArrayList(cheeseInstock); } 사실 재고가 없다고 해서 특별한 취급할 이유는 없습니다. 그럼에도 이 코드처럼 null을 반환한다면, 클라이언트 역시 이 null 상황을 처리하는 코드를 추가로 작성해야 합니다. List cheeses = shop.getCheeses(); if (cheeses != null && cheeses..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/brg2rZ/btrBtBXX28B/JAhynZFK2NCYkc3dwVtPh1/img.jpg)
가변인수(varargs) 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있습니다. 가변인수 메서드를 호출하면, 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 저장하여 가변인수 메서드에 건네줍니다. 다음은 입력받은 int 인수들의 합을 계산해주는 가변인수 메서드입니다. sum(1,2,3)은 6을, sum()은 0을 돌려줍니다. static int sum(int... args) { int sum = 0; for(int arg : args) { sum += args; } return sum; } 인수가 1개 이상이어야 할 때도 있습니다. 예컨대 최솟값을 찾는 메서드인데 인수를 0개만 받을 수도 있도록 설계하는 건 좋지 않습니다. 인수 개수는 런타임에 (자동 생성된) 배열의 길이로 ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bItITN/btrBvXMK5ri/Z120aRrqkvejsTm4B5zIWk/img.jpg)
다음은 컬렉션을 집합, 리스트, 그 외로 구분하고자 만든 프로그램입니다. public class CollectionClassifier { public static String classify(Set s) { return "집합"; } public static String classify(List list) { return "리스트"; } public static String classify(Collection c) { return "그 외"; } public static void main(String[] args) { Collection[] collections = { new HashSet(), new ArrayList(), new HashMap().values() }; for (Collection c ..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/b5B6WS/btrBqDHXJIQ/nH06Dwljp6KnLexKdaoql0/img.jpg)
이번 아이템에는 개별 아이템으로 두기 애매한 API 설계 요령들을 모아 놓았습니다. 이 요령들을 잘 활용하면 배우기 쉽고, 쓰기 쉬우며, 오류 가능성이 적은 API를 만들 수 있습니다. [1]. 메서드 이름을 신중히 짓자. 항상 표준 명명 규칙(아이템 68)을 따라야 합니다. 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는 게 최우선 목표입니다. 🐻 클린 코드에서도 이와 같은 이야기가 언급됩니다. 그 다음 목표는 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하는 것입니다. 긴 이름은 지양합시다! 🐻 클린 코드에서는 긴 이름이어도 명확하게 의미를 전달하는 게 중요하다고 말합니다. 상황에 따라서 개발자가 선택을 하면 될 것 같습니다. 애매하면 자바 라이브러리의 API 가이드를 참조합시다..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/v2DpU/btrA32WMJ9Z/d7AzID5Gn3dzbYLrCvuV91/img.jpg)
자바는 안전한 언어입니다. 네이티브 메서드를 사용하지 않으니 C, C++ 같이 안전하지 않은 언어에서 흔히 보는 버퍼 오버런, 배열 오버런, 와일드 포인터 같은 메모리 충돌 오류에서 안전합니다. 자바로 작성한 클래스는 시스템의 다른 부분에서 무슨 짓을 하든 그 불변식이 지켜집니다. 메모리 전체를 하나의 거대한 배열로 다루는 언어에서는 누릴 수 없는 강점입니다. 하지만 아무리 자바라 해도 다른 클래스로부터의 침범을 아무런 노력 없이 다 막을 수 있는 건 아닙니다. 그러니 클라이언트가 여러분의 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야 합니다. 실제로도 악의적인 의도를 가진 사람들이 시스템의 보안을 뚫으려는 시도가 늘고 있습니다. 평범한 프로그래머도 순전히 실수로 여러분의 클래스..
생성자를 통해 초기화 할 때, 새로운 객체로 감싸서 복사해주는 방법입니다. 외부와 내부에서 주소값을 공유하는 인스턴스의 관계를 끊어주기 위함입니다. (예를 들어 외부에서 add했는데, 내부에 add가 반영되는 경우) public School(Student[] students) { this.school = new ArrayList(students); } 방어적 복사 이용 만약 생성자에서 유효성 검증이 필요하다고 합시다. 일반적으로는 아래와 같이 넘어온 값을 검증하고 객체 내부변수에 검증된 값을 할당해주는 순서가 맞다고 생각할 수 있습니다. public Period(Date start, Date end) { if (validation(start, end)) { throw new IllegalArgumentE..
- Total
- Today
- Yesterday
- kotest
- 정규표현식
- MSA
- Algorithm
- Spring Boot
- 이펙티브 자바
- 코테
- Olympiad
- programmers
- AWS
- BAEKJOON
- 백준
- 객체지향
- 클린 아키텍처
- Effective Java
- BOJ
- 디자인 패턴
- 클린 코드
- Spring
- node.js
- kkoon9
- 알고리즘
- Kotlin
- 디자인패턴
- Java
- 프로그래머스
- 이팩티브 자바
- C++
- JPA
- 테라폼
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |