[Java_Tutorial]30강-자바 코딩, 내부 클래스 예제[Inner Class Example, 자바 프로그래밍 기초 , 자바 튜토리얼]
Software/Java 2019. 7. 27. 11:46[Oracle의 Java Tutorial을 읽고 순서에 의해 정리한 후 본인의 경험과 이해를 바탕으로 작성된 글임을 밝힌다.]
[Java Tutorial, 자바 프로그래밍 기초 배우기, Java Programming, 자바 튜토리얼]
내부 클래스 예제(Inner Class Example)
먼저 배열을 이용한 내부 클래스(inner class) 사용에 대해 아래 예제를 통해 알아본다. 먼저 배열을 생성하고 값을 할당한 뒤 짝수 인덱스를 순서대로 호출하는 프로그램을 만들어 볼 것이다.
DataStructure.java 프로그램은 다음과 같이 구성되어 있다.
-
외부 클래스(Outer Class)인 DataStructure는 연 이은 integer값인 0,1,2,3 등을 배열에 할당하는 객체를 생성하는 생성자를 포함하고 있다.
-
내부 클래스(Inner Class)인 EvenIterator는 Iterator인터페이스를 확장(extends)한 DataStructureIterator인터페이스를 구현(implements)하고 있다. Iterators는 데이터 구조를 단계별로 수행하고 마지막 요소를 체크하거나 현재 값을 가져오거나 다음 값으로 이동하는 전형적인 메서드가 있다.
-
DataStructure 객체를 인스턴스 하는 main메서드는 짝수 인덱스 값을 가진 arrayOfInts 배열을 출력하는 printEven메서드를 호출한다.
public class DataStructure {
private final static int SIZE = 15;
private int[] arrayOfInts = new int[SIZE];
public DataStructure() {
for (int i = 0; i < SIZE ; i++) {
arrayOfInts[i] = i;
}
}
public void printEven() {
DataStructureIterator iterator = this.new EvenIterator();
while(iterator.hasNext()) {
System.out.println(iterator.next() + " ");
}
System.out.println();
}
interface DataStructureIterator extends java.util.Iterator{ }
private class EvenIterator implements DataStructureIterator {
private int nextIndex = 0;
public boolean hasNext() {
return (nextIndex <= SIZE - 1);
}
public Integer next() {
Integer retValue = Integer.valueOf(arrayOfInts[nextIndex]);
nextIndex += 2;
return retValue;
}
}
public static void main(String[] args) {
DataStructure ds = new DataStructure();
ds.printEven();
}
}
결과는 0, 2, 4, 6, 8, 10, 12, 14
주목해 보면 EvenIterator클래스는 DataStructure 객체의 인스턴스 변수인 arrayOfInts로 직접 참조한다.
위 예제에서 보여준 것처럼 헬퍼 클래스로 구현하기 위해 내부 클래스를 사용할 수 있다. 사용자 인터페이스의 이벤트들을 다룰 수 있고 물론 내부 클래스를 어떻게 사용해야 하는지 반드시 알아야 하는 것이다. 왜냐하면 이벤트 핸들링 기술은 그것들을 광범위하게 사용할 수 있다.
로컬 및 익명 클래스(Local and Anonymous Classes)
내부 클래스에는 2가지 타입이 더 있다. 메서드의 몸체 내에 내부 클래스를 선언할 수 있다. 이 클래스들은 지역 클래스로 알려져 있다. 또한 클래스의 이름 없이 메서드의 몸체 내에 내부 클래스를 선언할 수도 있다. 이 클래스들을 익명 클래스라고 한다.
수식어/한정어(Modifiers)
외부 클래스의 다른 멤버 클래스를 위해 사용하는 내부 클래스를 위한 같은 수식어를 사용할 수 있다. 예를 들어, 다른 클래스 멤버들의 제한적 접근을 위해 사용할 수 있는 것처럼 내부 클래스의 접속을 제한하기 위해 접근 제어자인 private, public 그리고 protected를 사용할 수 있다.