JAVA/상속
Test128 중첩 클래스(내부 클래스) - 내부 클래스(inner class)
ready J
2020. 9. 10. 22:42
2. 내부 클래스(inner class)
클래스 내부에... 『public class 클래스명』
- static 중첩 클래스와 마찬가지로 프로그램 구조를 보다 더 간단하고 알아보기 쉽도록 할 수 있다.
- 외부 클래스의 메소드에서 내부 멤버 클래스를 사용하기 위해서는 반드시 내부 멤버 클래스 객체를 생성해 주어야 함
- 외부 클래스의 멤버 변수와 메소드를 객체 생성 없이 바로 사용하는 것이 가능하다.
- 내부 멤버 클래스는 외부에서 단독으로 객체를 생성하여 사용할 수 없다.
즉, 내부 멤버 클래스는 외부 클래스의 인스턴스 생성이 선행되어야 한다는 것이다.
- static 으로 선언된 변수 또는 메소드를 가질 수 없다.
내부 클래스(inner class)의 예시
/*===========================
■■■ 클래스 고급 ■■■
- 중첩 클래스(내부 클래스)
=============================*/
class Test2
{
static int a = 10; // 전역변수, Test2의 멤버변수, static변수(클래스 변수)
int b = 20; // 전역변수, Test2의 멤버변수, instance변수
void write() // ▶ 첫 번째 write() 메소드
{
System.out.println("write()... ①");
final int c = 30; // 지역변수, 상수화된 변수(값이 변하지 않는 수)
int d = 40; // 지역변수, 값이 수시로 변할 수 있는 변수
// 메소드 안에 존재하는 또다른 클래스(local class, 지역 클래스)
class LocalTest
{
void write() // ▶ 두 번째 write() 메소드
{
System.out.println("write()... ②");
System.out.println("a : " + a);
System.out.println("b : " + b);
System.out.println("c : " + c);
System.out.println("d : " + d);
}
}
// ※ 변수 c 와 변수 d 는 둘 다 지역변수이지만...
// c 는 final 변수이기 때문에
// 두 번째 write() 메소드에서 언제 접근하더라도
// 고정된 값임을 보장받을 수 있다.
// 반면에 d 는 그 값이 수시로 변동될 수 있는 상황이므로
// LocalTest 클래스의 인스턴스 생성 시점을
// 보장받을 수 없기 때문에 d 에 접근하는 것은 피해야 하는 것이다
//d = 10;
LocalTest ob1 = new LocalTest();
ob1.write(); //-- 두 번째 write() 메소드 호출
//d += 10;
}
}
public class Test128
{
public static void main(String[] args)
{
Test2 ob = new Test2();
ob2.write(); //-- 첫 번째 write() 메소드 호출
}
}
// 실행 결과
/*
write()... ①
write()... ②
a : 10
b : 20
c : 30
d : 40
계속하려면 아무 키나 누르십시오 . . .
*/