빨간색코딩

중첩클래스를 알아보자 (내부클래스, 정적 중첩클래스, 지역클래스, 익명클래스) 본문

Java

중첩클래스를 알아보자 (내부클래스, 정적 중첩클래스, 지역클래스, 익명클래스)

빨간색소년 2018. 4. 2. 19:53

일반클래스는 Package member class 라고들 하며, 아래 항목에서 제외했다. 구글링해보면 클래스간에 관계나 큰 틀에서의 구조를 안잡고 나열하는 식이 많은 것 같다ㅋㅋ

1. 중첩 클래스는 왜 쓰는가?

  1. 클래스들의 논리적인 그룹을 나타낼 때 쓴다. 주로 model 객체에서 상위모델과 하위모델이 있을 때 쓰는 것 같다. (Static Nested Class 를 많이 씀)
  2. 향상된 캡슐화
  3. 좋은 가독성과 유지보수성

2. 중첩 클래스의 종류

3. 내부클래스 (Inner Class)

  • 내부클래스로서 일반클래스 내부에 생성된다. Non-Static Nested Class 라고도 불린다.
  • 밖에 있는 클래스는 내부클래스를 멤버변수처럼 사용할 수 있다. 사용하려면 new로 인스턴스를 만들어야한다.
  • 내부클래스는 자신의 밖에 있는 클래스의 자원을 직접 사용할 수 있다.

모양새

class Outer {
    변수;
    메소드;

    public class Inner {

    }
}

객체 생성

Outer 객체1 = new Outer();
Outer.Inner 객체2 = 객체1.new Inner();

클래스 파일 생성

컴파일하면 각각 아래와 같이 생긴다.

  • Outer.class
  • Outer$Inner.class

4. 정적 중첩클래스 (Static Nested Class)

  • 위의 내부클래스와 비슷하나, static 으로 선언한다. 정확히는 Static Nested Class 라고 한다.
  • 밖에 있는 클래스의 변수와 메소드 중에 static이 붙은 것들은 사용할 수 있다.

내부클래스와의 차이

  1. 내부클래스는 밖에 있는 클래스의 자원을 마음대로 사용할 수 있지만, 중첩클래스는 static 키워드가 안붙었다면 사용할 수 없다.
  2. Outer 클래스의 객체가 없어도 Inner 클래스의 객체 생성이 가능하다. (하단에 객체생성법 참고)

모양새

class Outer {
    변수;
    메소드;

    public static class Inner {

    }
}

객체 생성

Outer.Inner 객체 = new Outer.Inner();

5. 지역 클래스(Method Local Inner Class)

  • 메소드 내부에 클래스를 정의하는 경우이다. 마치 메소드 내의 지역변수처럼 쓰인다.
  • 메소드 내부에서 new 한 뒤 사용해야 한다. 메소드 밖에서 사용할 수 없다(지역변수 룰)

모양새

class Outer {
    변수;
    메소드1;

    메소드2() {
        지역변수;

        class Inner {

        }
    }
}

클래스 파일 생성

컴파일하면 각각 아래와 같이 생긴다.

  • Outer.class
  • Outer$숫자Inner.class

6. 익명클래스(Anonymous Inner Class)

  • 익명클래스는 인스턴스 이름이 없다. new 와 동시에 부모클래스를 상속받아 내부에서 오버라이딩해서 사용한다.
  • 매개변수로 사용할 수도 있다.
  • 익명클래스 내부의 변수나 메소드는 익명클래스의 밖에서 사용이 불가능하다.
  • 주로 익명클래스는 이럴때 사용 : 상속은 받아야하지만, 한번만 사용할 것이라서 extends 문법을 굳이 사용안함
  • 익명클래스 내부에 생성자X
  • 익명클래스 외부의 자원은 final 키워드가 붙은 것만 사용할 수 있다.
  • 아래 모양새에서 보듯이 Inner 클래스가 이미 선언되어있어야 한다. Inner 클래스를 바로 상속받고 오버라이딩해서 쓰는 구조이다.

모양새

Class Inner {
    변수;
    메소드;
}

class Outer {
    변수;
    메소드1;

    메소드2() {
        지역변수;

        new Inner() {
            override된 내용들..
        }
    }
}

클래스 파일 생성

컴파일하면 각각 아래와 같이 생긴다.

  • Outer.class
  • Outer$숫자.class


Comments