TIL/Java7 [Java] Effective Java 3/E 3장 item 21~25 Item 21: 인터페이스는 구현하는 쪽을생각해 설계해라 디폴트 메소드를 통해 기존 인터페이스에 메소드를 추가할 수 있음 유용하다만 기존 구현체와 충돌하지 않는지에 대한 고려 필요함 Item 22: 인터페이스는 타입을 정의하는 용도로만 사용하라 상수 인터페이스는 안티 패턴임 상수 클래스는 인스턴스할 수 없는 유틸리티 클래스로 만들어 사용하자) public class Constants { private Constants(){} // 인스턴스화 방지 public static final int ONE = 1; } Item 23: 태그 달린 클래스보다는 클래스 계층 구조를 활용하라 public class TagClass { enum Type { HOT, COLD } final Type type; String h.. TIL/Java 2024. 1. 20. [Java] Effective Java 3/E 4장 item 15~20 Item 15: 클래스와 멤버의 접근 권한을 최소화하라 public 으로 나오는 것은 유지 보수, 하위 버전 호환의 책임 존재 외부에서 접근할 수 있는 내용은 최소화하자 public 클래스의 인스턴스 필드는 되도록 public 아니어야 함 public 가변 변수를 가진다면 일반적으로 Thread-Safe 하지 않음 Item 16: public 클래스에서는 public 필드가 아닌 접근자 메소드 사용하라 public 필드 바로 접근 X getter 쓸 것 setter는 정말 필요시에 쓸 것 Item 17: 변경 가능성을 최소화하라 객체 상태 변경하는 메소드 제공X 클래스 확장할 수 없도록 모든 필드 final 으로 선언 모든 필드 private 으로 선언 자신 외에는 내부의 가변 컴포넌트에 접근 불가 불변.. TIL/Java 2024. 1. 18. [Java] Effective Java 3/E 3장 item 10~14 3장 모든 객체의 공통 메소드 item 10: equals는 일반 규약을 지켜 재정의하라 equals 메소드를 재정의하며서 발생할 수 있는 문제를 회피하는 방법은 재정의하지 않는 것 equlas 메소드를 재정의하지 않으면 오직 자기 자신과만 같게 된다. equals 메서드를 재정의하지 않는 것이 최선인 Case 각 인스턴스가 본질적으로 고유하다. 인스턴스의 논리적 동치성을 검사할 일이 없다. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. 클래스가 private이거나 package-private이고 equals 메소드를 호출할 일이 없다. equals 메소드를 재정의해야하는 Case 객체 식별성, 물리적으로 두 객체가 같냐? 가 아니라 논리적 동치성, 논리적으로 두 객체가 같냐? .. TIL/Java 2023. 11. 14. [JAVA] Java Version 8 vs 17 처음 자바를 접했을 때 영문도 모른채 조교의 안내대로 JAVA 버전 8을 설치하여 사용하다보니 자연스럽게 사용해왔던 8버전, 그리고 현재 스프링 부트 3.0을 사용하기 위해 버전 업그레이드를 따라가면서 사용하게 된 17버전에 대한 차이를 알아보며 내가 자연스럽게 사용하고 있는 기능에 대한 복습과 놓치고 있던 점에 대해 학습하고자 한다. 개요 JAVA 8 Lambda Stream interface default Method 인터페이스가 추상메소드말고 default 선언으로 메소드를 미리 선언할 수 있는 기능 ⇒ 추후에 overriding 가능 Optional LocalDateTime JAVA 17 Pattern Matching for Switch(17에서 등장) Sealed Classes (15에서 등장,.. TIL/Java 2023. 10. 21. [Java] Effective Java 3/E item 7~9 item 7: 다 쓴 객체는 참조 해제하라 public class Stack { private Object[] stack; private int size = 0; public Stack() { stack = new Object[1000]; } public void push(Object e){ /// 구현 내용 } public Object pop(){ if(size == 0){ throw new EmptyStackException(); } return stack[--size]; } // 기타 구현 내용 } 예를 들어 위와 같이 stack을 구현하였을 때, 내용에서 메모리 누수가 발생하는 곳은 pop() 메소드를 실행시켰을 때, 논리적인 개념으로는 stack의 가장 윗 부분의 객체를 꺼내서 사용했다지만 실제.. TIL/Java 2023. 6. 13. [Java] Effective Java 3/E item 4~6 item4: 인스턴스화를 막으려거든 private 생성자를 사용해라 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰는 설계X 하지만 생성자를 명시하지 않으면 자동 생성되기에, private 생성자를 만들어 인스턴스화를 막자 이러한 방법은 상속을 불가능하게 하는 효과도 존재 Plus) 추상 클래스로 만드는 것으로 인스턴스화를 막을 수 없음. 왜냐하면 하위 클래스를 만들어 인스턴스화할 수 있기 때문 + 상속하여 사용하라는 의도로 착각될 수 있음 item5: 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 하나 이상의 자원에 의존하는 클래스를 만들 때, 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱클톤 방식이 적합하지 않음 인스턴스를 생성할 때 생성자에 필요한 자원을.. TIL/Java 2023. 5. 28. [Java] Effective Java 3/E item 1~3 Item1: 생성자 대신 정적 팩토리 메소드를 고려하라 클래스 인스턴스를 얻는 전통적인 수단는 public 생성자 이와 별도의 수단으로 클래스는 정적 팩토리 메소드를 제공할 수 있음 정적 팩토리 메소드가 public 생성자에 비해 가지는 장단점 장점 이름을 가질 수 있음 Ex) BigInteger(int, int, Random) vs BigInteger.probablePrime 호출될 때마다 인스턴스를 새로 생성하지 않아도 됨 생성 비용이 큰 객체가 자주 요청되는 상황이라면 성능적으로 좋음 반복되는 요청에 같은 객체를 반환하는 식의 정적 팩토리 방식의 클래스는 인스턴스 통제할 수 있음. 이를 통해 클래스를 싱글톤으로 만들 수도, 인스턴스화 불가로 만들 수도 있음 반환 타입의 하위 타입 객체를 반환할 수 .. TIL/Java 2023. 5. 26. 이전 1 다음 반응형