Inner 클래스
내부 클래스란 클래스안에 다른 클래스가 정의 되는 것을 말한다.
내부 클래스는 멤버형태로 클래스를 포함할 수 있으며 중첩되는 클래스의 개수는 제한이 없다.
내부 클래스를 포함하는 바깥 클래스를 Outer클래스라고하며 내부에 포함된 클래스를 Inner클래스라한다.
Inner클래스의 특징 및 장점
Inner클래스는 Outer클래스의 멤버를 마치 지신의 멤버처럼 사용할 수 있다. Outer클래스 멤버의 접근 지정자가 private 일지라도 접근 할 수 있다.
Inner클래스 안에 static변수를 선언 할 수 없다. 단 static Inner클래스는 선언 기능하다.
Inner클래스의 접근은 반드시 Outer클래스를 통해서 접근 할 수 있다. 단 static Inner클래스는 바로 접근 가능하다.
소스파일을 컴파일을 하면 Inner클래스는 Outer$Inner.class 형식으로 클래스 파일이 생성된다.
정의된 위치에 따라서 다양한 형태의 Iner클래스가 제공된다.
Inner클래스의 종류
종류 | 설명 |
member | Outer클래스의 멤버변수나 메소드처럼 클래스가 정의된 경우이다. |
local | Outer클래스의 특정 메소드안에서 클래스가 정의된 경우이다. |
static | static 키워드를 이용해서 클래스가 정의된 경우이다. |
annoymous | 익명 클래스를 이용해서 클래스가 정의된 경우이다. |
사용형식
Outer 객체1 = new Outer(); (Outer 클래스 객체 생성 방법)
Outer.Inner 객체2 = 객체1.new Inner(); (Inner 클래스 객체 생성 방법)
Member Inner 클래스 사용하기 예제
외부 클래스의 멤버로 내부 클래가 정의된 클래스이다.
public class Outer {
public int a = 10;
private int b = 20;
static int c = 30;
class Inner{
public void print() {
System.out.println("전역 변수" + a);
System.out.println("지역 변수 " + b);
System.out.println("정적 변수 " + c);
}
}//end Inner
public static void main(String[] args) {
Outer outer = new Outer();
//Inner 클래스를 사용하기 위해서는 반드시 Outer 클래스를 먼저 생성해야 한다.
//또한 Outer 클래스를 통해서만 접근 할 수 있다.
Outer.Inner inner = outer.new Inner();
inner.print();
}
}
실행결과]
전역 변수 10
지역 변수 20
정적 변수 30
Local Inner클래스 사용하기 예제
외부 클래스의 메소드 내에서 정의되는 클래스를 말한다.
메소드 안에서 정의되었기 때문에 로컬 변수처럼 인식된다. 따라서 메소드 호출될 때 생성되며 메소드가 종료될 때 삭제된다.
public class Outer {
public int a = 10;
private int b = 20;
static int c = 30;
public void outerMethod() {
int d = 40;
final int e = 50;
class Inner{
public void print() {
System.out.println("전역변수" + a);
System.out.println("지역변수" + b);
System.out.println("정적변수" + c);
//System.out.println("함수내 지역변수" + d);
System.out.println("함수내 상수변수" + e);
}
}
Inner local_test = new Inner();
local_test.print();
}
public static void main(String[] args) {
Outer outer = new Outer();
outer.outerMethod();
}
}
실행결과]
전역변수 10
지역변수 20
정적변수 30
함수내 상수변수 50
static Inner클래스 사용하기 예제
내부 클래스가 static으로 지정된 클래스를 말한다.
내부 클래스 멤버가 static으로 지정되었으면 내부 클래스도 반드시 static으로 지정해야 한다.
class Outer{
private int a = 10;
private static int b = 100;
void method0() {
System.out.println("Outer Class내의 메소드");
}
static void method1() {
System.out.println("Outer Class내의 정적 메소드");
}
static class Inner {
private int c=200;
static int d = 300;
public void print() {
// System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("c = " + c);
System.out.println("d = " + d);
// method0();
method1();
}
}
}
public class Ex02 {
public static void main(String[] args) {
Outer.Inner test = new Outer.Inner();
test.aaa();
}
}
실행결과]
b = 100
c = 200
d = 300
Outer Class내의 정적 메소드
Anonymous Inner클래스 사용하기 예제
클래스를 값(arguments : 메소드 호출시 넣어주는 값)으로 사용하는 클래스를 말한다.
ex1]
class Inner {
int y = 200;
public Inner() {
this.disp();
}
public void disp() { }
}
public class Ex04 {
public static void main(String[] args) {
final int x = 100;
new Inner() {
public void disp() {
System.out.println("Default 생성자");
System.out.println("x = " + x);
System.out.println("y = " + y);
}
};
}
}
실행 결과]
Default 생성자
x = 100
y = 200
ex2]
interface Anony {
public void print();
}
public class AnonyTest {
public void printB(Anony a) {
a.print();
}
public static void main(String[] args) {
AnonyTest t = new AnonyTest();
t.printB(new Anony() {
public void print() {
System.out.println("익명 클래스 사용 중입니다.");
}
});
}
}
실행결과]
익명 클래스 사용 중입니다.
1. 중첩 클래스를 이용하여 프로그램을 작성하시오. 학생 이름을 입력하고 출력하는 클래스 안에 점수를 입력 받아 출력하는 클래스로 처리되도록 프로그램을 작성하시오.
입력 예] | 출력 예] |
이름 : 홍길동 국어 : 70 영어 : 60 수학 : 80 |
학생 이름 : 홍길동 국어 점수 : 70 영어 점수 : 60 수학 점수 : 80 총점 : 210 평균 : 70.0 |
2. 정적 중첩 클래스를 이용하여 프로그램을 작성하시오. 사람의 키와 몸무게를 입력받아 출력하고 두 눈의 시력을 입력받아 평균시력을 출력하는 프로그램을 작성하시오.
입력 예] | 출력 예] |
키 : 165 몸무게 : 702 왼쪽 눈 : 1.0 오른쪽 눈 : 0.8 |
당신의 키는 165.0이고 몸무게는 702.0Kg 입니다. 왼쪽 눈과 오른쪽 눈 시력은 1.0, 0.8 이고 평균 시력은0.9입니다. |