본문 바로가기
Effective JAVA 2판

Effective JAVA Item22 멤버 클래스는 가능하면 static으로 선언하라.

by BroBroBro 2015. 7. 9.

------------------------------------------------

본글은 Effective JAVA 2판의 책의 내용을 토대로 작성하였으며
지극히 주관적인 사항들이 많이 있으므로 가려서 읽으시기바랍니다.
잘못된 내용이 있거나 의견이 있으시다면 언제든 댓글로^^~!

------------------------------------------------

CHAPTER 4 클래스와 인터페이스

4장에서는 클래스와 인터페이스를 설계할때 이용할 수 있는 강력한 요소들을 많이 갖추고 있다고 한다. 

[Item 13] 클래스와 그 멤버의 접근 권한을 최소화하자 부터 보도록 하자 

Item14 public 클래스 안에는 public 필드를 두지말고 접근자(accessor) 메소드를 사용한라
Item15 변경 기능성을 최소화 하라 
Item16 계승하는 대신 구성하라
Item17 계승을 위한 설계와 문서를 갖추거나, 그럴 수 없다면 계승을 금지하라
Item18 추상 클래스 대신 인터페이스를 사용하라
Item19 인터페이스는 자료형을 정의할 때만 사용하라
Item20 태그 달린 클래스 대신 클래스 계층을 활용하라
Item21 전략을 표현하고 싶을 때는 함수 객체를 사용하라
Item22 멤버 클래스는 가능하면 static으로 선언하라.

--page01

이번장에서는 어떤상황에 어떤 중첩 클래스가 어울리는지 설명한다.

중첩 클래스? 겹쳐있다는 말이지? 클래스안에 클래스가 있다는 말이지? 내부에 있다는 말이지...


30장에서 나온다고 한다. 도움 클래스(helper class)를 두어서 제공한다고 한다.

Calculator.Operation.PLUS

Calculator.Operation.MINUS

위와같이 바로 사용한걸 보면 Operation은 Calculator의 Static멤버 클래스이겠죠?

아무튼 저런식으로 사용을 한다고 쳣을때 정적과 비정적의 예를 한번 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class CoffeeTest{     
   int a=10;
 
   class Coffee{ 
     int b=20
     public void lattee(){ 
        System.out.println("Coffee 클래스가 멤버클래스 비정적입니다."); 
     } 
   }
 
   static class Coffee_S{        
       int b=20;
       static int c=30;
       public void lattee_S(){               
             System.out.println("Coffee_S 클래스가 멤버클래스 정적입니다.");
       }
   }
 
   public static void main(String[] args){
 
    CoffeeTest t=new CoffeeTest(); 
    CoffeeTest.Coffee c = t.new Coffee(); 
    c.lattee();
 
    CoffeeTest.Coffee_S c_S = new CoffeeTest.Coffee_S();
    c_S.lattee_S();
 
    System.out.println("static 변수:"+ c_S.lattee.c);
 
   }
}
cs

맨아래에 c_S.lattee. 까지누르면 static인 c 까지 보이는 반변에...

비정적으로 만든 Coffee는 c. 하면 b 도 보이고 lattee() 메소드도 보일것이다.

이것은 내부클래스가 Outther class의 필드들을 참조 하고 있다는 것이며 이는 GC등에 영향을 준다는 이야기다.

책에서 하는 말을 그대로 인용하자면 " 짐작하겠지만, 비-정적 클래스 객체에는 이 연결을 위한 공간이 필요하며, 그 때문에 객채 생성 시간이 늘어난다." 라고 말하고 있다.

다른 익명클래스, 내부클래스, 내부정적클래스(위에서 다룬내용), 지역클래스 등에서의 관계를 말하고 있는데 이것 하나만 알면 되는것 같다. (솔직히 다른건 잘모르겠다. ㅋㅋ)