본문 바로가기
728x90

JAVA/Effective Java65

item 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라 컬렉션이 비었으면 null을 반환하는 메서드가 있다고 치자. //null 반환 public List getCheeses() { return cheesesInStock.isEmpty() ? null : new ArrayList(cheesesInStock); } 클라이언트는 이 null 상황을 처리하는 코드를 추가적으로 작성해야 한다. 컬렉션이나 배열 같은 컨테이너가 비었을 때 null을 반환하는 메서드를 사용할 때면 항시 이와 같은 방어 코드를 넣어줘야 한다. 클라이언트에서 방어 코드를 빼먹으면 오류 상황이 발생할 수 있다. (수년 후에도 발생할 수 있음.) 마치 얼마 전에 풀었던 트리 복구라는 백준 문제가 생각난다. null처리를 안해줘서 틀렸던 친구들이 많았던 것 같아서(?) 그에 반해, 빈 컨테이너를.. 2022. 7. 14.
item 53. 가변인수는 신중히 사용하라 가변인수 메서드는 명시한 타입의 인수를 0개 이상 받을 수 있다. 가변인수 메서드를 호출하면, 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고, 인수들을 이 배열에 저장하여 가변인수 메서드에 건네준다. public static void main(String[] args) { System.out.println(sum(1, 2)); //3 System.out.println(sum(1)); //1 System.out.println(sum()); //0 } static int sum(int... numbers) { int sum = 0; for (int number : numbers) { sum += number; } return sum; } 입력받은 인수들의 합을 return해주는 메서드이다. 인수가 1개.. 2022. 7. 13.
item 52. 다중 정의는 신중히 사용해라 다중 정의는 모두 아시죠? 다른 말로는 오버로딩이라는 친숙한 이름을 갖고있다. 오버로딩이 뭐였더라? 서로 다른 시그니처를 갖는 여러 메소드들이 같은 이름으로 정의되는 것 이다. 즉, 메서드명은 같지만 매개변수의 개수, 타입, 순서들이 다른 메서드들을 의미한다. 다중 정의된 메소드는 어느 메서드를 호출할 지가 컴파일 타임에 정해진다. public class item52 { public static void main(String[] args) { Collection[] collections = { new HashSet(), new ArrayList(), new HashMap().values() }; for (Collection c : collections) { System.out.println(item52... 2022. 7. 10.
item 51. 메서드 시그니처를 신중히 설계하라 API 설계 요령들 메서드 이름을 신중히 짓자. 항상 표준 명명 규칙을 따라야 한다. 편의 메서드를 너무 많이 만들지 말자. 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고, 유지보수하기 어렵다. 클래스나 인터페이스는 자신의 각 기능을 완벽히 수행하는 메서드로 제공해야 한다. 확신이 서지 않으면 만들지 말아라 매개변수 목록은 짧게 유지하자. 4개 이하가 좋다. 같은 타입의 매개변수 여러개가 연달아 나오는 경우는 해롭다. 과하게 긴 매개변수 목록을 짧게 줄여주는 기술 3가지 여러 메서드로 쪼개기 매개변수 여러 개를 묶어주는 도우미 클래스를 만들기(일반적으로 정적 멤버 클래스) 객체 생성에 사용한 빌더 패턴을 메서드 호출에 응용한다. (매개변수가 많고 그 중 일부를 생략해도 괜찮을 때.. 2022. 7. 10.
item 50. 적시에 방어적 복사본을 만들라 자바 : 안전한 언어! 네이티브 메서드를 사용하지 않기 때문이라고 한다. 네이티브 메서드를 사용하지 않기 때문에 버퍼/배열 오버런, 와일드 포인터와 같은 메모리 충돌 오류에서 안전하다고 한다. 자바로 작성한 클래스에서는 시스템의 다른 부분에서 무슨 짓을 하든 그 불변식이 지켜진다. 따라서 메모리 전체를 하나의 거대한 배열로 다루는 언어에서는 누릴 수 없는 강점이다. (자바의 강점이 뭘까? 라고 하면 얘를 대답하면 좋지 않을까 해서 적어봄) 네이티브 메서드가 뭘까?.? 네이티브 메소드란? 네이티브 메소드는 자바가 아닌 다른 언어로 구현된 메소드라고 한다. 네이티브 메소드 앞에는 native 키워드가 붙어있다! 더 찾아보려 했는데 item 66에서 다루더라? 그래서 더 찾아보지는 않았다. 시스템 보안을 뚫으.. 2022. 7. 10.
item 49. 매개변수가 유효한지 검사하라 메서드와 생성자 대부분은 매개변수의 값을 정하는 데 제약을 주는데, 이는 가능한 한 오류를 빠르게 잡아야 하기 때문이다. 따라서 메서드 몸체가 실행되기 전에 매개변수를 확인하여 즉각적으로 예외를 던질 수 있게 해야한다. 매개변수 검사를 제때 하지 못하면 몇 가지 문제가 발생할 수 있다. 1. 메서드가 수행되는 중간에 모호한 예외를 던지며 실패할 수 있다. 2. 메서드가 잘 수행되지만 잘못된 결과를 반환할 수 있다. 3. 메서드는 문제없이 수행됐지만, 어떤 객체를 '이상한' 객체로 만들어 미래에 알 수 없는 시점에 해당 메서드와 관련 없는 오류를 낼 수 있다. 즉, 매개변수 검사에 실패하면 실패 원자성(failure atomicity)를 어기는 결과를 낳을 수 있다. public, protected 제어자.. 2022. 7. 7.
728x90