Search

내부 클래스

내부 클래스 (Inner Class)

클래스 내에 선언된 클래스

내부 클래스의 장점

1.
내부 클래스에서 외부 클래스의 멤버들에 쉽게 접근 가능
2.
코드의 복잡성을 줄일 수 있음. (캡슐화)
class A { // 외부 클래스 ... class B { // 내부 클래스. 외부 클래스 A 외엔 다른 클래스에선 잘 사용되지 않는 것이어야.. ... } ... }
Java

내부 클래스의 종류와 특징

변수의 선언 위치에 따른 종류와 동일
인스턴스 클래스
외부 클래스의 멤버변수 선언 위치에 선언
외부 클래스의 인스턴스 멤버처럼 사용됨.
주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언
static 클래스
외부 클래스의 멤버변수 선언 위치에 선언
외부 클래스의 static 멤버처럼 사용됨.
static 메소드에서 사용될 목적으로 선언
지역 클래스
외부 클래스의 메소드나 초기화 블럭 안에 선언
선언된 영역 내부에서만 사용 가능
익명 클래스
클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스(일회용)

내부 클래스의 선언

변수의 선언 위치와 동일하게 내부 클래스를 선언
class Outer { int iv = 0; static int cv = 0; void myMethod() { int lv = 0; } } class Outer { class InstanceIneer { } static class StaticInner { } void myMethod() { class LocalInner { } } }
Java

내부 클래스의 제어자와 접근성

외부 클래스의 멤버변수처럼 내부 클래스도 같은 위치에 선언되므로, 멤버변수처럼 간주되어 규칙을 적용
내부 클래스이기 때문에 abstract, final 같은 제어자 사용 가능
멤버변수처럼 private, protected 같은 접근 제어자도 사용 가능
class Outer { private int iv = 0; protected static int cv = 0; void myMethod() { int lv = 0; } } class Outer { private class InstanceIneer { } protected static class StaticInner { } void myMethod() { class LocalInner { } } }
Java
내부 클래스 중 static 클래스만 static 멤버 보유 가능
InnerEx1.java
인스턴스 클래스는 외부 클래스의 인스턴스 멤버를 객체 생성없이 사용 가능하지만, static 클래스는 외부 클래스의 인스턴스 멤버를 객체생성 없이 사용 불가
InnerEx2.java
내부 클래스에서 외부 클래스의 변수들에 대한 접근성을 보여주는 예제
InnerEx3.java
외부 클래스가 아닌 다른 클래스에서 내부 클래스를 생성하고 내부 클래스의 멤버에 접근하는 예제 → 내부 클래스로 선언해서는 안되는 클래스를 내부 클래스로 선언했다는 의미
InnerEx4.java
내부 클래스와 외부 클래스에 선언된 변수의 이름이 같을 때 변수 앞에 this 또는 외부 클래스명.this를 붙여서 서로 구별 가능
InnerEx5.java

익명 클래스 (Anonymous Class)

이름이 없는 클래스로, 클래스 선언과 객체 생성을 동시에 하기 때문에 한번만 사용될 수 있고, 오직 하나의 객체만을 생성할 수 있는 일회용 클래스
new 조상클래스이름() { // 멤버 선언 } 또는 new 구현인터페이스이름() { // 멤버 선언 }
Java
이름이 없기 때문에 생성자를 가질 수 없음.
조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의
단 하나의 클래스를 상속받거나 단 하나의 인터페이스만 구현 가능
InnerEx6.java
익명 클래스는 이름이 없기에, 외부 클래스명$숫자.class 형식으로 클래스파일명이 결정됨.
익명 클래스 사용 전
InnerEx7.java
익명 클래스 사용 후
InnerEx8.java

참고 자료