가변인수(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개만 받을 수도 있도록 설계하는 건 좋지 않습니다. 인수 개수는 런타임에 (자동 생성된) 배열의 길이로 ..
다음은 컬렉션을 집합, 리스트, 그 외로 구분하고자 만든 프로그램입니다. 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 ..
이번 아이템에는 개별 아이템으로 두기 애매한 API 설계 요령들을 모아 놓았습니다. 이 요령들을 잘 활용하면 배우기 쉽고, 쓰기 쉬우며, 오류 가능성이 적은 API를 만들 수 있습니다. [1]. 메서드 이름을 신중히 짓자. 항상 표준 명명 규칙(아이템 68)을 따라야 합니다. 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는 게 최우선 목표입니다. 🐻 클린 코드에서도 이와 같은 이야기가 언급됩니다. 그 다음 목표는 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하는 것입니다. 긴 이름은 지양합시다! 🐻 클린 코드에서는 긴 이름이어도 명확하게 의미를 전달하는 게 중요하다고 말합니다. 상황에 따라서 개발자가 선택을 하면 될 것 같습니다. 애매하면 자바 라이브러리의 API 가이드를 참조합시다..
자바는 안전한 언어입니다. 네이티브 메서드를 사용하지 않으니 C, C++ 같이 안전하지 않은 언어에서 흔히 보는 버퍼 오버런, 배열 오버런, 와일드 포인터 같은 메모리 충돌 오류에서 안전합니다. 자바로 작성한 클래스는 시스템의 다른 부분에서 무슨 짓을 하든 그 불변식이 지켜집니다. 메모리 전체를 하나의 거대한 배열로 다루는 언어에서는 누릴 수 없는 강점입니다. 하지만 아무리 자바라 해도 다른 클래스로부터의 침범을 아무런 노력 없이 다 막을 수 있는 건 아닙니다. 그러니 클라이언트가 여러분의 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야 합니다. 실제로도 악의적인 의도를 가진 사람들이 시스템의 보안을 뚫으려는 시도가 늘고 있습니다. 평범한 프로그래머도 순전히 실수로 여러분의 클래스..
메서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하기를 바랍니다. 예컨대 인덱스 값은 음수이면 안 되며, 객체 참조는 null이 아니어야 하는 식입니다. 이런 제약은 반드시 문서화해야 하며 메서드 몸체가 시작되기 전에 검사해야 합니다. 이는 "오류는 가능한 한 빨리 (발생한 곳에서) 잡아야 한다"는 일반 원칙의 한 사례이기도 합니다. 오류를 발생한 즉시 잡지 못하면 해당 오류를 감지하기 어려워지고, 감지하더라도 오류의 발생 지점을 찾기 어려워집니다. 메서드 몸체가 실행되기 전에 매개변수를 확인한다면 잘못된 값이 넘어왔을 때 즉각적이고 깔끔한 방식으로 예외를 던질 수 있습니다. 매개변수 검사를 제대로 하지 못하면 몇 가지 문제가 생길 수 있습니다. 1. 메서드가 수행되는 중간에 모호한 예외를..
주류 언어 중, 동시성 프로그래밍 측면에서 자바는 항상 앞서갔습니다. 처음 릴리스된 1996년부터 스레드, 동기화, wait/notify를 지원했습니다. 자바 5부터는 동시성 컬렉션인 java.util.concurrent 라이브러리와 Executor 프레임워크를 지원했습니다. 자바 7부터는 고성능 병렬 분해 프레임워크인 fork-join 패키지를 추가했습니다. 그리고 자바 8부터는 parallel 메서드만 한 번 호출하면 파이프라인을 병렬 실행할 수 있는 스트림을 지원했습니다. 이처럼 자바로 동시성 프로그램을 작성하기가 점점 쉬워지고는 있지만, 이를 올바르고 빠르게 작성하는 일은 여전히 어려운 작업입니다. 동시성 프로그래밍을 할 때에는 안전성(safety)과 응답 가능(liveness) 상태를 유지하기 ..
원소 시퀀스, 즉 일련의 원소를 반환하는 메서드는 수없이 많습니다. 자바 7까지는 이런 메서드의 반환 타입으로 Collection, Set, List 같은 컬렉션 인터페이스 혹은 Iterable이나 배열을 썼습니다. 이 중 가장 적합한 타입을 선택하기란 그다지 어렵지 않았습니다. 기본은 컬렉션 인터페이스입니다. for-ecah 문에서만 쓰이거나 반환된 원소 시퀀스가 주로 (contains(Object) 같은) 일부 Collection 메서드를 구현할 수 없을 때는 Iterable 인터페이스를 썼습니다. 반환 원소들이 기본 타입이거나 성능에 민감한 상황이라면 배열을 썼습니다. 그런데 자바 8이 스트림이라는 개념을 들고 오면서 이 선택이 아주 복잡한 일이 되어버렸습니다. 원소 시퀀스를 반환할 때는 당연히 스..
스트림은 처음 봐서는 이해하기 어려울 수 있습니다. 원하는 작업을 스트림 파이프라인으로 표현하는 것조차 어려울지 모릅니다. 성공하여 프로그램이 동작하더라도 장점이 무엇인지 쉽게 와 닿지 않을 수도 있습니다. 스트림은 그저 또 하나의 API가 아닌, 함수형 프로그래밍에 기초한 패러다임이기 때문입니다. 스트림이 제공하는 표현력, 속도, (상황에 따라) 병렬성을 얻으려면 API는 물론 이 패러다임까지 함께 받아들여야 합니다. 스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성하는 부분입니다. 이때 각 변환 단계는 가능한 한 이전 단계의 결과를 받아 처리하는 순수 함수여야 합니다. 순수 함수란 오직 입력만이 결과에 영향을 주는 함수를 말합니다. 다른 가변 상태를 참조하지 않고, 함수 스스로도 다른 상태를 변..
- Total
- Today
- Yesterday
- Effective Java
- 코테
- JPA
- kotest
- C++
- programmers
- node.js
- BAEKJOON
- Spring
- Kotlin
- 테라폼
- 클린 아키텍처
- AWS
- Spring Boot
- Algorithm
- 프로그래머스
- Java
- 클린 코드
- 디자인패턴
- 알고리즘
- kkoon9
- 이펙티브 자바
- 디자인 패턴
- BOJ
- 백준
- 정규표현식
- 객체지향
- 이팩티브 자바
- Olympiad
- MSA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |