08-46.1 내부클래스
Def) 내부 클래스: 클래스 안에 선언한 클래스를 말한다. (특정 클래스 내에서만 사용한다.)
- 어느 위치에서 선언하느냐에 따라 네 가지로 나뉜다.
(1) 인스턴스 클래스 (instance class) (중첩 클래스)
(2) 스태틱 클래스 (static class)
(3) 지역 클래스 (local class)
(4) 익명 클래스 (anonymous class)
08-46.2 인스턴스 클래스(instance class) (중첩 클래스)
- 클래스 안에 인스턴스 변수, 즉 필드를 선언하는 위치에 선언하는 경우이다.
<hide/>
package javaStudy;
public class InnerExam1 {
class Cal{
int value = 0;
public void plus() {
value++;
}
}
public static void main(String[] args) {
InnerExam1 t = new InnerExam1();
InnerExam1.Cal cal = t.new Cal();
cal.plus();
System.out.println(cal.value);
}
}
Note) 실행 결과 : 1
- InnerExam1 클래스를 만들고 이 클래스를 이용해 Cal 객체를 생성할 수 있다.
- 이 때 Cal객체를 이용하려면 인스턴스 변수를 선언해야 한다.
- InnerExam1.Cal cal = t.new Cal() : 바깥 쪽 클래스 타입. 내부 타입으로 타입을 선언한다.
- 이렇게 접근해야 사용가능하다. 객체를 생성한 다음 사용하는 방법은 다른 클래스와 같다.
08-46.3 스태틱 클래스 (정적 중첩 클래스)
<hide/>
package javaStudy;
public class InnerExam2 {
static class Cal{
int value = 0;
public void plus() {
value++;
}
}
public static void main(String[] args) {
InnerExam2.Cal cal = new InnerExam2.Cal();
cal.plus();
System.out.println(cal.value);
}
}
Note) 출력 결과: 1
- 첫 번째 형태와 같은 위치에 static으로 정의한 내부 클래스를 만든다.
- 인스턴스 클래스의 경우에는 외부에 InnerExam 객체를 반드시 먼저 생성한 다음에 내부 클래스에 접근했다.
- 이번 경우에는 static한 필드이므로 InnerExam2 객체를 생성할 필요 없이 바로 접근해서 사용할 수 있다.
- 첫 번째와 마찬가지로 내부 클래스인 Cal이 가진 메서드 필드에 접근해서 value 값을 출력한다.
08-46.4 지역 중첩 클래스/ 지역 클래스 (local calss)
<hide/>
package javaStudy;
public class InnerExam3 {
public void exec() {
class Cal{
int value = 0;
public void plus() {
value++;
}
}
Cal cal = new Cal();
cal.plus();
System.out.println(cal.value);
}
public static void main(String[] args) {
InnerExam3 t = new InnerExam3();
t.exec();
}
}
Note) 실행 결과: 1
- 내부 클래스를 인스턴스 변수로 선언하는 것이 아니라 메서드 안에서 선언한다.
- InnerExam3 안에 exec메서드를 만들고 Cal클래스를 생성한다.
- 이 경우 Cal 객체는 메서드 안에서만 생성하고 사용할 수 있다.
- Cal cal = new Cal() : 메서드 안에 Cal객체 만든다.
- cal.plus() : Cal객체가 가진 메서드를 호출한다.
- System.out.println(cal.value) : Cal이 가진 value를 호출해 사용가능하다.
- 클래스를 메서드 안에서 지역 변수처럼 사용할 수 있다.
'Java > 모두의 자바' 카테고리의 다른 글
Chapter 09-48 예외(Exception) (0) | 2022.02.11 |
---|---|
Chapter 08-47 익명 클래스(anonymous class) (0) | 2022.02.11 |
Chapter 08-45 인터페이스의 default 메서드 (0) | 2022.02.11 |
Chapter 08-43 인터페이스 만들기 (0) | 2022.02.09 |
Chapter 07-42 클래스 형변환 (0) | 2022.02.09 |