🤓 스터디/이펙티브 자바38 [아이템 51] 메서드 시그니처를 신중히 설계하라 먼저 메서드 시그니처(Method Signature)가 뭔지 알아보자 자바 컴파일러는 메서드 이름과 파라미터를 이용하여 메서드를 구분하는데 메서드의 이름과 파라미터가 메서드 시그니처이다. 즉, 이름이 같은 메서드들이 있더라도 파라미터의 개수와 타입이 다르면 컴파일러가 서로 다른 메서드로 구분하는 것이다. 이번 아이템은 메서드 시그니처 설계에 대해 얘기하고 있고 즉, 메서드를 만들 때 메서드 이름이랑 파라미터에 신경 쓰라는 소리 ㅋ ✅ 메서드 이름은 신중히! 표준 명명 규칙에 따라 짓도록 하고 긴 이름은 지양하자(자바 라이브러리의 API 참조해도 ok) 같은 패키지에 속한 다른 이름들과 일관되게 짓는 것이 좋다. 자바 표준 명명 규칙을 정리한 글을 가져와봤다. https://ozofweird.tistory.. 2023. 4. 17. [아이템 50] 적시에 방어적 복사본을 만들라 이번 아이템의 핵심 키워드는 "방어적 프로그래밍"이다. "클라이언트가 여러분의 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야 한다." "어떤 경우든 적절치 않은 클라이언트로부터 클래스를 보호하는 데 충분한 시간을 투자하는 게 좋다. 어떤 객체든 그 객체의 허락 없이는 외부에서 내부를 수정하는 일을 불가능하게 해야 한다! 예시) 불변식을 지키지 못한 클래스 Period public final class Period { private final Date start; private final Date end; /** * @param start 시작 시각 * @param end 종료 시각; 시작 시각보다 뒤여야함. * @throws IllegalArgumentException 시작 시각.. 2023. 4. 17. [아이템 49] 매개변수가 유효한지 검사하라 아이템 주제처럼 메서드나 생성자 작성 시 매개변수 유효검사를 왜 해야 하는지 이해하는 것이 요번 아이템의 핵심인 것 같다. "메서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하기를 바란다. ... 이런 제약은 반드시 문서화해야 하며메서드 몸체가 시작되기 전에 검사해야 한다." 매개변수 검사를 제대로 하지 못하면 생기는 문제 ▶️ 메서드가 수행되는 중간에 모호한 예외를 던질 수 있다. ▶️ 메서드가 잘 수행되었지만 잘못된 결과를 반환할 수 있다. ▶️ 메서드는 문제없이 수행됐지만, 어떤 객체를 이상한 상태로 만들어 놓아서 미래를 알 수 없는 시점에 메서드와 관련 없는 오류를 낼 수 있다. (실패 원자성을 어기는 결과) public과 protected 메서드는 매개변수 값이 잘못됐을 때 던지는.. 2023. 4. 13. [아이템 43] 람다보다는 메서드 참조를 사용하라 익명 클래스보다 더 좋은 게 있어! 람다 람다보다 더 좋은 게 있어 ! 메서드 참조 🧐 메서드 참조는 뭐고 🤔 람다와 메서드 참조의 차이는 뭘까 메서드 참조(Method reference) Java 8에 도입된 메서드 참조는 class::methodName 구문을 사용하여 클래스 또는 객체에서 메서드를 참조할 수 있다. 메서드 참조는 이중 콜론(::)을 사용하여 클래스 이름과 메서드 이름을 구분하며, 람다식과 달리 인수를 전달할 필요가 없고, 인수는 메서드 참조 타입에 따라 처리된다. 예시) // 람다식 str -> str.toString() // 메서드 참조 String::toString // 람다식 str -> str.length() // 메서드 참조 String::length // 람다식 (int .. 2023. 4. 7. [아이템 25] 톱레벨 클래스는 한 파일에 하나만 담으라 "소스 파일 하나에 톱 레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 불평하지 않는다." (하나의 자바 파일에 중첩되지 않은 클래스가 여러 개 담긴 것 ) 🤔 왜 톱레벨 클래스는 한 파일에 하나만 담으라는 걸까? "... 그중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라지기 때문이다." javac Main.java A.java 명령으로 컴파일한다면 컴파일 오류가 나고 A와 B 클래스를 중복 정의했다고 알려줄 것이다. A.java class A { String NAME = "은하철도"; } class B{ String NAME = "999"; } B.java class A{ String NAME = "은하철도"; } class B{ String NAME = "999"; } ja.. 2023. 4. 7. [아이템 24] 멤버 클래스는 되도록 static으로 만들라 "중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하고, 그 외의 쓰임새가 있다면 톱 레벨 클래스로 만들어야한다." 왜 중첩 클래스는 바깥 클래스에서만 쓰여야 하는지 중첩 클래스는 왜 사용하는지 알아보는 게 이번 아이템의 핵심 같다. 💡중첩 클래스 - 다른 클래스 안에 정의된 클래스 public class A{ //톱레벨 클래스 ... public class B{ //중첩 클래스 ... } } 중첩 클래스의 종류 (정적 멤버 클래스를 제외한 나머지는 inner class에 해당한다.) 정적 멤버 클래스 (비정적) 멤버 클래스 익명 클래스 지역 클래스 ✅ 정적 멤버 클래스 class 내부에 static으로 선언된 클래스 바깥 클래스의 private 멤버에도 접근할 수 있다. public class Ca.. 2023. 4. 7. 이전 1 2 3 4 5 6 7 다음