IT/Programming / / 2023. 4. 27. 09:30

<Effective Java> RULE 22 멤버클래스는 가능하면 static으로 선언하라

반응형

 

중첩 클래스는 해당 클래스가 속한 클래스 안에서만 사용되야한다.

 

왜 중첩 클래스를 사용해야 하나?

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

한 곳에서만 사용되는 클래스를 논리적으로 그룹화하는 방법.

- 한 클래스가 다른 한 클래스에 유용하면 그 클래스에 클래스를 포함시키고 두 클래스를 함께 유지하는 것이 논리적입니다. 이러한 "헬퍼 클래스"를 중첩하면 패키지가보다 간결 해집니다.

캡슐화를 증가.

- A와 B라는 두 개의 최상위 클래스를 생각해 봅니다. 여기서 B는 private으로 선언 될 A의 멤버에게 액세스해야합니다. A 클래스 내의 B 클래스를 숨김으로써 A 멤버는 비공개로 선언 될 수 있고 B 멤버는 비공개로 선언 될 수 있습니다. 또한 B 자체는 외부 세계로부터 숨길 수 있습니다.

 

보다 읽기 쉽고 유지 보수가 쉬운 코드.

- 최상위 클래스의 작은 클래스를 중첩하면 코드가 사용되는 위치에 가깝게 배치됩니다.

 

중첩 클래스 종류

- 정적 멤버 클래스

- 비-정적 멤버 클래스 (Inner)

- 익명 클래스 (Inner)

- 지역 클래스 (Inner)

 

http://code.i-harness.com/ko/q/112b4

 

1. 정적 멤버 클래스 : 일반적인 클래스

- 바깥 클래스의 모든 멤버에 접근할 수 있다.

- 정적 멤버 클래스는 바깥 멤버 클래스의 정적 멤버이다.

- 다른 정적 멤버와 동일한 접근권한 규칙을 따른다.

- Helper Class를 정의할 때 도움된다.

ㄴ Enum Class(Rule 30)

- private 정적 멤버 클래스는 바깥클래스 객체의 컴포넌트를 표현하는데 쓰인다.

ㄴMap객체에서 Entry객체들은 메서드 (getKey,setKey..)들은 Map객체에 접근할 필요가 없으므로 private 정적 멤버 클래스로 구현해야 한다.

 

2. 비-정적 클래스 : 클래스 안에서 바깥 클래스의 메소드를 호출 할 수있으며, this구문을 통해 바깥 객체에 대한 참조를 획득할 수 있다.

- 바깥 클래스의 객체 생성 메서드 안에서 비-정적 멤버 클래스의 생성자를 호출하는 순간 자동으로 만들어 진다.

- 어댑터를 정의할 때 많이 쓰인다.

 

“바깥 클래스 객체에 접근할 필요가 없는 멤버 클래스를 정의할 때는 항상 선언문 앞에 static을 붙여서 정적 멤버 클래스로 만들어라.”

 

static을 생략하면 모든 객체가 내부적으로 바깥 객체에 대한 참조를 유지하게 되므로 시간과 공간 요구량이 늘어나며 바깥 객체에 대한 가비지콜렉션이 힘들어 진다.규칙 6

 

3. 익명 클래스 : 바깥 클래스의 멤버도 아니며 멤버로 선언하지도 않고 사용하는 순간에만 객체를 만든다.

- 제약조건

ㄴ선언하는 그 순간에만 사용가능하다.

instanceof를 비롯하여 클래스 이름이 필요한 곳에는 사용할 수 없다.

 인터페이스를 구현하는 동시에 특정 클래스를 계승할 수 없다.

 10줄 이하로 짧게 작성해야지만 가독성이 좋아진다.

- Runnable, Thread, TimerTask같은 프로세스 객체를 만든는데 자주 쓰인다.

 

4. 지역 클래스 : 지역 변수가 선언될 수 있는 곳어디든 선언할 수 있다.

- 이름을 가지며 반복적으로 사용될 수 있다.(멤버클래스)

- 비-정적클래스 문맥에서 정의했을 때만 바깥 객체를 갖는다.(익명클래스)

 

결론

- 중첩클래스를 메서드 밖에서 사용할 수 있어야 하거나, 메서드 안에 놓기에는 너무 길 경우 멤버클래스로 정의하라

- 멤버 클래스의 객체 각각이 바깥 객체에 대한 참조를 가져야 하는 경우에는 비-정적 멤버 클래스로 만들어라.

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유