☕️ JAVA/Effective JAVA

    [Effective Java] 아이템 42 : 익명 클래스보다는 람다를 사용하라

    [Effective Java] 아이템 42 : 익명 클래스보다는 람다를 사용하라

    아이템 42 : 익명 클래스보다는 람다를 사용하라 익명 클래스 과거 자바에서는 함수 타입을 표현할 때 추상 메서드를 하나만 담은 인터페이스를 사용했습니다. 이런 인터페이스의 인스턴스를 함수 객체라고하여, 특정 함수나 동작을 나타내는 데 썼습니다. JDK 1.1 부터 함수 객체를 만드는 주요 수단은 익명 클래스가 되었습니다. Collections.sort(words, new Comparator() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); 위 코드는 문자열을 길이순으로 정리하는데, 정렬을 위한 비교 함수로 익명 클래스를 사용합니다. Comparator 인터페이스가 정렬을..

    [Effective Java] 아이템 32 : 제네릭과 가변인수를 함께 쓸 때는 신중하라

    [Effective Java] 아이템 32 : 제네릭과 가변인수를 함께 쓸 때는 신중하라

    아이템 32 : 제네릭과 가변인수를 함께 쓸 때는 신중하라 가변인수 가변인수는 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해줍니다. 덕분에 메서드를 n번 오버로딩 하지않고 원하는 개수만큼 인자를 넘길 수 있게 해줍니다. 이 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어지는데요. 아래와 같은 방법으로 확인할 수 있습니다. public class Item32 { public static void varargsMethod(String... args) { System.out.println(Arrays.toString(args)); } } 위와 같은 가변인수 메서드를 아래와 같은 코드로 호출해줍니다. 사실 호출하지 않아도 IDE 덕분에 타입이 유추가 되긴하죠..ㅎㅎ ..

    [Effective Java] 아이템 21 : 인터페이스는 구현하는 쪽을 생각해 설계하라

    [Effective Java] 아이템 21 : 인터페이스는 구현하는 쪽을 생각해 설계하라

    아이템 21 : 인터페이스는 구현하는 쪽을 생각해 설계하라 자바 8 이전에는 기존 구현체를 깨뜨리지 않고서는 인터페이스에 메서드를 추가할 방법이 없었으나, 자바 8 에서 디폴트 메서드를 제공하면서 가능해졌습니다. 디폴트 메서드 해당 인터페이스를 구현한 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게됩니다. 🧑‍💻 : 와 그러면 인터페이스 설계할때 가볍게하고 나중에 디폴트 메서드를 추가해도 괜찮네요 👩 : 그러면 안돼요. 🧑‍💻 : ??? 디폴트 메서드는 구현 클래스에 대해 아무것도 모른채 합의 없이 무작정 삽입될 뿐입니다. 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어려운법! 자바 8의 Collection 인터페이스에 removeIf 메서드가 ..

    [Effective Java] 아이템 5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

    [Effective Java] 아이템 5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

    아이템 5 : 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 많은 클래스가 하나 이상의 자원에 의존합니다. 아래 SpecllChecker는 사전(dictionary)에 의존하고 있는데, 아래처럼 구현하는 경우를 많이 볼 수 있습니다. 정적 유틸리티 public class SpellChecker { private static final Lexicon dictionary = new LexiconDictionary(); private static boolean isValid(String word) { ... } private SpeckChecker() { } // 객체 생성 방지 } 싱글턴 public class SpellChecker { private final Lexicon dictionary = ..

    [Effective Java] 아이템 68 : 일반적으로 통용되는 명명 규칙을 따르라

    [Effective Java] 아이템 68 : 일반적으로 통용되는 명명 규칙을 따르라

    아이템 68 : 일반적으로 통용되는 명명 규칙을 따르라 철자 규칙 패키지와 모듈 점(.)으로 구분하여 계층적으로 짓는다. 모두 소문자 알파벳 혹은 숫자로 구성한다. 조직 바깥에서도 사용될 패키지라면, 인터넷 도메인 이름을 역순으로 사용한다. 점(.)으로 구분되는 각 요소는 보통 8자 이하 짧은 단어/약어로 한다. 클래스와 인터페이스 하나 이상의 단어로 구성하며, 각 단어는 대문자로 시작한다. 약어의 경우 각 약자의 시작과 끝을 명확하게 알 수 있도록 첫 글자만 대문자로 하는 경우가 많다 (HttpUrl ↔️ HTTPURL) 메서드와 필드 클래스 명명 규칙과 첫글자를 소문자로 쓴다는 점만 다르다. 첫 단어가 약자라면 단어 전체가 소문자여야한다. 상수 필드는 구성하는 단어 모두를 대문자를 사용하며, 단어 사..

    [Effective Java] 아이템 49 : 매개변수가 유효한지 검사하라

    [Effective Java] 아이템 49 : 매개변수가 유효한지 검사하라

    아이템 49 : 매개변수가 유효한지 검사하라 메서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하기를 바랍니다. 예) 인덱스 값은 음수가 아니어야함 예) 객체 참조는 null이 아니어야함 이러한 제약은 반드시 문서화해야 하며 메서드 몸체(로직)가 시작되기 전에 검사해야합니다. 매개변수 검사를 제대로 하지 못하면 아래와 같은 문제가 발생합니다. 메서드가 수행되는 중간에 모호한 예외를 던지며 실패 메서드가 잘 수행되지만 잘못된 결과를 반환 메서드가 문제없이 수행되었지만, 어떤 객체를 이상한 상태로 만들어놓아서 미래의 알 수 없는 시점에 이 메서드와 관련 없는 오류가 발생 public & protected 메서드 매개변수의 제약을 문서화한다면 그 제약을 어겼을 때 발생하는 예외도 함께 기술해야합니..

반응형