Study
-
클래스와 인터페이스 - 아이템 25. 톱레벨 클래스는 한 파일에 하나만 담으라Study/Effective Java 2022. 12. 27. 14:23
톱레벨 클래스는 한 파일에 하나만 담으라 톱레벨 클래스란? 톱레벨 클래스란 함수, 클래스 또는 다른 무언가로 감싸지지 않은 모든 구문을 의미한다. 즉, 톱레벨 클래스란 중첩 클래스가 아닌 것을 말한다. 다중 톱레벨 클래스의 문제점 소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 자바 컴파일러는 불평하지 않는다. 하지만 아무런 득이 없을뿐더러 심각한 위험을 감수해야 하는 행위다. 이렇게 하면 한 클래스를 여러 가지로 정의할 수 있으며, 그중 어느 것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라지기 때문이다. 위 문제점에 대한 구체적인 예를 들어 보겠다. // Main.java public class Main { public static void main(String[] args) { ..
-
클래스와 인터페이스 - 아이템 24. 멤버 클래스는 되도록 static으로 만들라Study/Effective Java 2022. 12. 27. 11:29
멤버 클래스는 되도록 static으로 만들라 중첩 클래스란? 중첩 클래스란 다른 클래스 안에 정의된 클래스를 말한다. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야 한다. 중첩 클래스의 종류는 정적 멤버 클래스, 비정적 멤버 클래스, 익명 클래스, 지역 클래스 이렇게 네 가지가 존재한다. 이 중 첫 번째를 제외한 나머지는 내부 클래스에 해당한다. 이번 게시글에서는 각각의 중첩 클래스를 언제 그리고 왜 사용해야 하는지에 대해서 알아보겠다. 정적 멤버 클래스 정적 멤버 클래스는 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다. 정적 멤버 클래스는 다른 정적 멤버와 똑같은 접근 규칙을 적용받는다. 예컨대 정적 멤버..
-
클래스와 인터페이스 - 아이템 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라Study/Effective Java 2022. 12. 26. 17:07
태그 달린 클래스보다는 클래스 계층구조를 활용하라 태그 달린 클래스 public class Figure { enum Shape {RECTANGLE, CIRCLE}; // 태그 필드 - 현재 모양을 나타냄 final Shape shape; // 아래 필드들은 모양이 RECTANGLE일 때만 사용 double length; double width; // 아래 필드는 모양이 CIRCLE일 때만 사용 double radius; // RECTANGLE용 생성자 Figure(double length, double width) { shape = Shape.RECTANGLE; this.length = length; this.width = width; } // CIRCLE용 생성자 Figure(double radius)..
-
클래스와 인터페이스 - 아이템 22. 인터페이스는 타입을 정의하는 요도로만 사용하라Study/Effective Java 2022. 12. 26. 16:32
인터페이스는 타입을 정의하는 요도로만 사용하라 인터페이스의 용도 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 즉, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것이다. 인터페이스는 오로지 이 용도로만 사용돼야 한다. 인터페이스의 잘못된 사용 public interface PhysicalConstants { static final double AVOGADROS_NUMBER = 6.022_140_857e23; static final double BOLZMANN_CONSTANT = 1.380_648_52e-23; static final double ELECTRON_MASS = 9.109_383-56e-31; }..
-
클래스와 인터페이스 - 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라Study/Effective Java 2022. 12. 26. 15:23
인터페이스는 구현하는 쪽을 생각해 설계하라 디폴트 메서드 Java 8 이전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었다. Java 8 이후부터는 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드가 추가되었다. 하지만, 위험이 완전히 사라진 것은 아니다. 디폴트 메서드를 선언하면, 그 인터페이스를 구현한 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 된다. 즉, 디폴트 메서드는 구현 클래스에 대해 아무것도 모른 채 합의 없이 무작정 삽입될 뿐이라는 것이다. Java 8에서는 핵심 컬렉션 인터페이스들에 다수의 디폴트 메서드가 추가되었다. 주로 람다를 활용하기 위해서다. 자바 라이브러리의 디폴트 메서드는 코드 품질이 높고 범용적이라 대부분 상..
-
클래스와 인터페이스 - 아이템 20. 추상 클래스보다는 인터페이스를 우선하라Study/Effective Java 2022. 12. 21. 17:54
추상 클래스보다는 인터페이스를 우선하라 자바가 제공하는 다중 구현 메커니즘 자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스, 두 가지가 존재한다. Java 8부터는 인터페이스도 디폴트 메서드를 제공할 수 있게 되었다. 이제는 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공할 수 있다. 추상 클래스 vs 인터페이스 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다. 자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는 데 커다란 제약을 안게 되는 셈이다. 반면, 인터페이스가 선언한 메서드를 모두 정의하고 그 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다. ..