본문 바로가기
프로그래밍/Java

Java - 네스티드(Nested) 클래스

by 왕거 2020. 10. 15.

람다로 가는 길목으로서 네스티드 클래스와 이너 클래스에 대한 강의였다.

 

자바의 람다랑 파이썬의 람다가 비슷한 개념이면 좋겠다. 비슷하다면 이해하는데 도움이 될테니까.

 

어쨋든 네스티드 클래스에 대해서 정리해본다.

 

 

네스티드 클래스(Nested Class)

  • 네스티드 클래스란 클래스 내부에 정의된 클래스이다.
  • 2가지 종류의 네스티드 클래스가 있다.
    • Static Nested Class
    • Inner Class(Non-Static Nested Class)

 

Static 네스티드 클래스

  • Static 키워드를 사용한 선언의 특성이 반영되는 네스티드 클래스, 외부 클래스와 상관없이 인스턴스를 생성할 수 있다.
  • 외부 클래스의 Static 변수에 대한 직접 접근이 허가된다.
    • private 접근 지정자로 Static 변수에 대한 접근을 특정할 수 있다.

 

Non-Static 네스티드 클래스 (이너 클래스)

  • Non-Static 네스티드 클래스, 즉 이너 클래스는 3가지 종류로 나뉜다.
  • 멤버 클래스
    • 멤버 클래스의 인스턴스는 외부 클래스의 인스턴스에 종속된다.
    • 외부 클래스 인스턴스의 속성을 내부 클래스의 인스턴스간에 공유가 가능하다.
    • 멤버 클래스는 클래스 정의를 감출 때 유용하게 사용된다. -> 클래스 수정이 진행되어도 사용법에는 변화가 없다.
    • 반복자(Iterator)가 대표적인 멤버 클래스의 예시
class Outer {
    private int num = 0;

    class Member {
        void add(int n) {num += n;}
        int get() { return num;}
    }
}

public class Main {

    public static void main(String[] args) {
	    Outer o1 = new Outer();

	    Outer.Member o1m1 = o1.new Member();	//멤버 클래스 인스턴스의 선언 방법
	    Outer.Member o1m2 = o1.new Member();

	    o1m1.add(10);			//o1m1 인스턴스에서 o1 인스턴스의 num 변수에 접근 후 값 저장
	    System.out.println(o1m2.get());	//o1m2 인스턴스에서 o1 인스턴스의 num 변수에 접근 후 값 반환
    }
}

맴버 클래스의 종속 및 외부 클래스 변수 직접 접근 테스트

 

  • 로컬 클래스
    • 멤버 클래스와 특성의 상당부분을 공휴한다.
    • 외부 클래스의 메소드 내부에 정의되어 해당 메소드에서만 사용된다.
interface Hello {
    void say();
}

class Greet {
    private String sentence;
    public Greet(String s) { sentence = s; }

    public Hello speak() {			//클래스 내부의 메소드
        class speakHello implements Hello {	//메소드 안에 클래스를 정의하는 것이 로컬 클래스
            public void say() {
                System.out.println(sentence);
            }
        }
        return new speakHello();
    }
}

public class Main {

    public static void main(String[] args) {
	    Greet gt = new Greet("Hello World!");
	    Hello hl = gt.speak();
	    hl.say();
    }
}

 

  • 익명 클래스
    • 로컬 클래스의 정의를 더욱 단순화한 형태를 가진다.
    • 자바 람다식의 선행조건
class Greet {
    ...
    public Hello speak() {		//위의 로컬 클래스를 익명 클래스로 변경
        return new Hello() {
            public void say() {
                System.out.println(sentence);
            }
        };
    }
}

로컬 클래스를 익명 클래스로 변경한 후에도 작동 결과는 같다.

 

 

 

'프로그래밍 > Java' 카테고리의 다른 글

Java - 열거형과 가변인자, 어노테이션  (0) 2020.10.14
Java - Collection (2)  (0) 2020.10.09
Java - Collections (1)  (0) 2020.10.09
Java - 제네릭 (2)  (0) 2020.09.27
Java - 제네릭 (1)  (0) 2020.09.22