본문 바로가기
Language/Effective java

클래스와 인터페이스

by y.j 2022. 6. 17.
728x90

멤버 클래스는 되도록 static으로 만들라.

중첩 클래스(nested class)란 다른 클래스 안에 정의된 클래스를 말한다. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱 레벨 클래스로 만들어야 한다. 그 외의 쓰임새가 있다면 톱 레벨 클래스로 만들어야 한다.

중첩 클랫의 종류   외부 접근 쓰임
정적 멤버 클래스   가능 외부 클래스에게 도움을 줄 때
(비정적) 멤버 클래스   불가 어댑터로 정의 할 때
익명 클래스   비정적 문맥 정적 팩토리 메서드나 작은 함수를 구현 할 때
지역 클래스   비정적 문맥  

 

정적 멤버 클래스

정적 멤버클래스는 public static class로 정의하고 private 멤버를 외부 클래스에서 접근할 수 있다는 점만 제외하고 모두 같다. 외부 클래스와 함께 쓰일 때만 유용한 도우미 클래스이다. 예를 들어 Operation 열거 타입은 Calculator 클래스의 public 정적 멤버 클래스가 되어야 한다. 그러면 Calculator의 클라이언트에서 Calculator.Operation.PLUS같은 형태로 원하는 연산을 참조 할 수 있다. 외부에서 중첩 클래스가 독립적으로 존재 할 수 있다면 정적 멤버 클래스로 만들어야 한다. 

* 정규화된 this       : 클래스명.this - 바깥 클래스의 이름을 명시

  내부 클래스 새성 : 바깥 인스턴스의 클래스.new MemberClass(args)

 

비정적 멤버 클래스

비정적 멤버 클래스는 어댑터를 정의할 때 자주 쓰인다( 어댑터 패턴 ). A라는 클래스의 인스턴스를 감싸 마치 B라는 클래스의 인스턴스처럼 보이게 하는 뷰로 사용한다. 

public class MySet<E> extends AbstractSet<E> {

    @Override
    public Iterator<E> iterator() {
        return new MyIterator();
    }
    
    private class MyIterator implements Iterator<E> {
        ...
    }
}

멤버 클래스에서 바깥 인스턴스에 접근 할 일이 없다면 무조건 static을 붙여서 정적 멤버 클래스로 만들자. static을 생략하면 바깥 인스턴스의 숨은 외부 참조를 가지게 된다. 이 참조를 저장하는데 시간과 공간이 소비되고 가비지 컬렉션이 바깥 클래스의 인스턴스를 수거하지 못하는메모리 누수가 생길 수 있다는 점이다.

 

익명클래스

익명 클래스는 쓰이는 시점에 선언과 동시에 인스턴스가 만들어진다. 오직 비정적인 문맥에서만 사용되며 상수 변수 이외의 정적 멤버는 가질 수 없다. 익명 클래스는 표현식 중간에 등장하므로 짧지 않으면 가독성이 떨어진다. 작은 함수나 처리 객체를 만드는데 사용하거나 정적 팩터리 메서드를 구현하는 데 사용한다.

 

지역 클래스

지역변수가 정의될 수 있는 곳에서 쓰일수 있으며 유효범위도 지역변수와 같다. 멤버 클래스처럼 이름이 있고 반복해서 사용 할 수 있다.

 

톱레벨 클래스는 한 파일에 하나만 담으라

소스 파일 하나에 톱레벨 클래스를 여러개 선언하더라도 자바 컴파일러는 불평하지 않는다. 하지만 아무런 득이 없고 컴파일에 따라 결과가 달라지므로 하나만 담는 것이 좋다.

public class Main {
    public static void main(String[] args) {
        System.out.println(Utensil.NAME + Dessert.NAME);
    }
}

 

Utensil.java

class Utensil {
    static final String NAME = "pan";
}

class Dessert {
    static final String NAME = "cake";
}

Dessert.java

class Dessert {
    static final String NAME = "pot";
}

class Utensil {
    static final String NAME = "pie";
}

 

 

컴파일이 어떻게 되느냐에 따라 결과가 달라진다. 따라서 하나의 파일에 하나의 톱 클래스만 담자

 

728x90

'Language > Effective java' 카테고리의 다른 글

제네릭  (0) 2022.06.19
제네릭  (0) 2022.06.18
클래스와 인터페이스  (0) 2022.06.17
클래스와 인터페이스  (0) 2022.06.14
클래스와 인터페이스  (0) 2022.06.14

댓글