본문 바로가기

자바10

인터페이스 설계 - 구현하는 개발자를 생각하자 # default Method 자바 8 이전 기존 구현체를 깨뜨리지 않고, 인터페이스에 메서드 추가 방법 전무후무 - 인터페이스에 메서드 추가하면 대부분 컴파일 오류 발생 - 추가된 메서드가 기존 구현체에 존재할 가능성 희박 자바 8 이후 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드 추가 핵심 컬렉션 인터페이스들에 많은 디폴트 메서드 추가 for lambda 활용 디폴트 메서드 선언시, 그 인터페이스를 구현한 후에 디폴트 메서드를 재정의하지 않은 모든 클래스에서는 디폴트 구현이 사용 단, 디폴트 메서드는 구현 클래스에 대한 정보 없이 무작정 삽입(추가) 된 것이므로 주의해야 한다. 자바 라이브러리의 디폴트 매서드는 코드 품질이 높고 범용적이므로 대부분의 상황에서 잘 작동 하지만, 생각할 수.. 2022. 2. 7.
equals 재정의 일단, 결론부터 얘기하자면 Object Class를 믿고, equals 꼭 필요한 것이 아니면 재정의하지 말자 그래도 반드시 재정의를 해야할 때가 있을 수 있으니 고려하고 준수해야할 사항들을 살펴보도록 하자. # 재정의하지 않는 것이 좋은지 다시 확인 재정의하지 않는 것이 최선인 상황들이 존재한다. 각 인스턴스가 본질적으로 고유할 때 ex) 동작하는 개체를 표현하는 클래스 - Thread 인스턴스의 논리적 동치성(logical equality)을 검사할 일이 없을 때 상위 클래스에서 재정의한 equals가 하위클래스에서도 적절하게 동작할 때 Constructor Set / List / Map 은 모두 AbstractSet / AbstractList / AbstractMap 으로부터 상속받아서 그대로 사용.. 2022. 1. 16.
불필요한 객체 생성 피하는 방법 static boolean isRomanNumeral(String s) { return s.matches(" ... "); } # 정적 팩토리 메서드 방법 똑같은 기능을 제공하는 객체를 반복적으로 생성하는 것보다 객체 하나를 재사용하는 것이 더 효율적 /* 실행될 때마다 new 를 통해 새로운 인스턴스 생성 - 쓸데없는 String 인스턴스가 계속해서 생성된다. */ String s = new String("Xonmin"); /* 하나의 String 인스턴스 생성 JVM 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드는 같은 객체를 재사용하게 된다. */ String s = "Xonmin"; 생성자 대신 정적 팩토리 메서드를 통해 불변 클래스에서 불필요한 객체 생성 회피 가변 객체라고 해도 사용 .. 2022. 1. 9.
다중 instance 방지 & 의존성 주입[Dependency Injection] # 다중 인스턴스 방지 인스턴스화를 막기 위해서 private 생성자 사용하자 정적 메서드와 정적 필드만을 가진 클래스 기본 타입 , 배열 관련 메서드만 존재하는 클래스 ex) java.lang.Math , java.util.Arrays 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(팩토리)를 모아놓은 클래스 ex) java.util.Collections final 클래스와 관련한 메서드를 모아놓은 클래스 final 클래스를 상속해서 하위 클래스에 메서드를 넣는 것은 불가능 하기 때문 위와 같이, 정적 멤버만 담은 utility 클래스는 인스턴스로 만들려고 설계한 것이 아님 → 따라서 외부에서 해당 클래스의 생성자에 접근하지 못하게 해야함 하지만 생성자를 명시하지 않으면 자동으로 컴파일러는 d.. 2022. 1. 4.