본문 바로가기

언어/JAVA

15장 Nested 클래스

Nested 클래스 : 클래스안에 또다른 클래스가 정의되는 것

 

Nested클래스를 사용하는 가장 큰 이유는 코드를 간단하게 표현하기위함이다.

자바 기반의 UI를 처리할 때 외부의 이벤트 처리를 하는 곳에서 많이 사용된다. 

 

Nested클래스는 선언방법에 따라 "Static nested 클래스"와 "내부(inner)클래스"로 나뉜다.

이 둘의 차이는 static으로 선언되었는지 여부이다.

"내부(inner)클래스"는 다시 2가지로 나뉘는데 이름이 있는 내부클래스는 "로컬 내부 클래스(local inner class)", 이름이 없는 내부클래스를 "익명 내부 클래스(anonymous inner class)라한다.

 

Nested클래스 종류

 

Nested클래스를 만드는 이유

  • 한 곳에서만 사용되는 클래스를 논리적으로 묶어서 처리할 필요가 있을 때
  • 캡슐화가 필요할때,  내부구현을 감추고싶을 때
  • 소스의 가독성과 유지보수성을 높이고싶을 때

Static Nested Class

내부클래스를 감싸고 있는 외부클래스의 어떤변수도 접근할 수 있다.(private로 선언된 변수도 접근가능)

public class OuterOfStatic {
    static class StaticNested {
        private int value = 0;
        public int getValue() {
            return value;
        }
        
        public void setValue(int value) {
        	this.value = value;
        }
    }
}

선언방식은 static사용하는 것과 비슷하다.(어찌되었건 static이 붙으니까...)

public static main(String[] args) {
  OuterOfStatic.StaticNested staticNested = new OuterOfStatic.StaticNested();
  staticNested.setValue(3);
  System.out.println(staticNested.getValue());
}

 

Inner클래스

Static Nested Class과의 차이점은 겉보기엔 static을 사용했는가의 차이지만 객체를 만드는 방법이다르다.

public class OuterOfInner {
    class Inner {
        private int value = 0;
        public int getValue() {
            return value;
        }
    	public void setValue(int value) {
        	this.value = value;
        }
    }
}

객체를 만드는 법은 아래와같다.

public static main(String[] args) {
    OuterOfInner outer = new OuterOfInner();
    OuterOfInner.Inner inner = outer.new Inner();
    System.out.println(inner.getValue());
}

캡슐화를 위해 Inner Class 를 사용한다고 했었다.

A 클래스에서 어떤 공통적인 작업을 수행하는 B 클래스가 필요한데,

다른 클래스에서는 B 클래스가 전혀 필요가 없을 때는 이렇게 내부 클래스를 만들어 사용한다.

 

내부 클래스는 GUI 관련 프로그램을 개발할 때 가장 많이 사용한다.

 

Inner 클래스의 특징

  • 외부 클래스의 멤버를 마치 자신의 멤버처럼 사용할 수 있다. (접근지정자가 private 라고 해도 접근 가능)
  • 내부 클래스 안에는 static 변수를 선언할 수 없다. (static Inner 클래스는 선언 가능)
  • 내부 클래스의 접근은 반드시 Outer 클래스를 통해서 접근 할 수 있다. (static Inner 를래스는 바로 접근 가능)
    • 소스파일을 컴파일하면 Outer$Inner.class 형식으로 생성
  • 캡슐화가 필요할 때 사용된다. 
    • A클래스 내에서 공통적인 작업을 수행하는 B클래스가 필요한데 다른클래스에서는 B 클래스가 전혀 필요가 없을 때 사용
    • 내부 클래스는 GUI 관련 프로그램을 개발할 때 가장 많이 사용한다.

'언어 > JAVA' 카테고리의 다른 글

18장 정리  (0) 2021.10.30
17장 어노테이션  (0) 2021.10.28
14장 예외처리  (0) 2021.10.24
13 인터페이스 / 추상클래스 / enum  (0) 2021.10.22
12장 object  (0) 2021.10.22