티스토리 뷰

Java

[Java] 내장 클래스

nc2u 2018. 10. 27. 19:34

자바에서는 클래스 안에서 클래스를 정의할 수 있다. 내부에 클래스를 가지고 있는 클래스를 외부 클래스(outer class)라고 한다. 클래스 내부에 포함되는 클래스를 내장 클래스(nested class)라고 한다.

내장 클래스의 종류

내장 클래스는 다음과 같이 분류할 수 있다.

  • 정적 내장 클래스 : 앞에 static이 붙어서 내장되는 클래스
  • 비정적 내장 클래스 : static이 붙지 않은 일반적인 내장 클래스
    1. 내부 클래스(inner class) : 클래스의 멤버처럼 선언되는 내장 클래스
    2. 지역 클래스(local class) : 메소드의 몸체 안에서 선언되는 내장 클래스
    3. 무명 클래스(anonymous class) : 수식의 중간에서 선언되고 바로 객체화 되는 클래스

여기서는 가장 많이 사용되는 내부 클래스만을 살펴보자. 


내부 클래스

클래스 안에 선언된 클래스를 내부 클래스라고 한다. 내부 클래스의 접근 지정자는 publicprivateprotected 또는 package(default)일 수 있다.

class OuterClass {
    ...
    class InnerClass {   }   // 클래스가 다른 클래스 안에 내장된다.
    ...
}

내부 클래스는 외부 클래스의 인스턴스 변수와 메소드를 전부 사용할 수 있다. private 로 선언되어 있어도 접근이 가능하다. 이것이 장점이다. 간단한 예제를 보자.

class OuterClass {
    private int value = 10;
    
    class InnerClass {
        System.out.println("외부 클래스의 private 변수 값 : " + value);
    }
    OuterClass() {
        InnerClass obj = new InnerClass();
        obj.myMethod();
    }
}
public class InnerClassTest {
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
    }
}

[실행결과] 외부 클래스의 private 변수 값 : 10


위의 코드에서는 외부 클래스의 생성자에서 내부 클래스의 객체를 생성하였다. 이때는 그냥 내부 클래스의 이름을 사용하면 된다.

만약 외부 클래스의 바깥에서 내부 클래스의 객체를 생성하려면 다음과 같이 약간 생소한 문법을 사용하여야 한다. 내부 클래스의 객체는 외부 클래스의 객체가 먼저 생성되어 있어야 생성될 수 있다.

...
OuterClass outer = new OuterClass();
// outer 객체 안에 정의된 innerClass란 의미가 된다.
OuterClass.InnerClass inner = outer.new InnerClass(); 
...

 

지역 클래스

지역 클래스(local class)는  메소드 안에 정의되는 클래스이다. 이 메소드는 접근 제어 지정자를 가질 수 없다. 지역 클래스는 abstract 또는 final로만 지정할 수 있다. 간단한 예를 보자.

class localInner {
	
    private int data = 30; // 인스턴스 변수
	
    void display() {
        final String msg = "현재의 데이터 값은 ";
		
	class Local {
	    void printMsg() {
	        System.out.println(msg + data);
	    }
	}
	Local obj = new Local();
	obj.printMsg();
    }
}

public class localInnerTest {
    public static void main(String[] args) {
	localInner obj = new localInner();
	obj.display();
    }
}

[실행결과] 현재의 데이터 값은 30


지역 클래스는 메소드의 지역 변수에도 접근할 수 있다. 하지만 지역 변수는 반드시 final로 선언되어야 한다. 이것은 지역 클래스 인스턴스가 메소드 호출보다 더 오랜 기간 동안 존재할 수도 있기 때문이다. 그래서 지역 변수의 자체 복사본을 필요로 한다. 동일한 범위에서 지역 변수가 다른 복사본을 갖는 문제를 방지하려면 반드시 final로 선언되어야 한다.


중첩 클래스를 사용하는 이유

  • 내장 클래스는 외부 클래스 멤버가 private가 선언되어 있더라도 접근할 수 있다.
  • 내장 클래스는 외부에서 보이지 않는다. 즉 철저하게 감춰진다.
  • 무명 클래스는 콜백 메소드(callback method)를 작성할 때 아주 편리하다.


'Java' 카테고리의 다른 글

[Java] super 키워드  (0) 2018.10.27
[Java] 고급 배열  (0) 2018.10.27
[Java]객체 지향 프로그래밍의 특징  (0) 2018.10.27
[Java] 자료형(data type)의 종류  (0) 2018.10.27
[Java] 접근 제어 지정자  (0) 2018.10.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크