IT 개발/Java
[Java] 자바 - 내부클래스 (inner class, nested class)
KADOSHOLY
2022. 7. 5. 02:45
반응형
자바 - 내부클래스 (inner class, nested class)
클래스 안에 또 하나의 클래스가 정의되어 있을 때 이를 내부클래스라고 하며, 내부에 선언된 위치에 따라 인스턴스 내부클래스, static 내부클래스, 지역 내부클래스로 구분할 수 있습니다. 여기에서는 각 내부클래스의 특징과 사용예제를 간략히 살펴보도록 하겠습니다.
목차
- 내부클래스
- 인스턴스 내부클래스
- static 내부클래스
- 지역내부클래스
- 사용예제
1. 내부클래스
클래스안에 또 하나의 클래스를 정의하였을 때, 외부에 선언된 클래스를 외부클래스(Outer Class), 내부에 선언된 클래스를 내부클래스(Inner Class) 또는 Nested 클래스라고 합니다. 내부클래스는 선언된 위치에 따라 다음과 같이 구분할 수 있습니다.
1) 인스턴스 내부클래스
- 클래스안에 선언된 또 하나의 클래스로 인스턴스 멤버처럼 사용됩니다. (멤버변수 선언위치에 선언)
- 외부클래스의 멤버를 직접 접근하여 사용할 수 있습니다.
2) Static 내부클래스
- 클래스안에 static 키워드를 사용하여 선언한 클래스로 static 멤버처럼 사용됩니다. (멤버변수 선언위치에 선언)
- static멤버에 접근하여 사용할 수 있습니다. (인스턴스 멤버는 사용할 수 없습니다)
- static이므로 외부클래스의 생성없이 사용할 수 있습니다.
3) 지역 내부클래스
- 외부 클래스의 메소드안에서 선언된 클래스를 말합니다.
- 지역 클래스를 사용하는 다른 코드보다 먼저 선언되어 있어야합니다.
2. 사용예제
1) 외부클래스 및 내부클래스(인스턴스 내부클래스, static 내부클래스, 지역 내부클래스) 정의
public class School {
private int totalCount = 0;
private int staffCount = 0;
ArrayList<Student> list = new ArrayList<Student>();
public void addStudent(String name) { // 메소드
new Student(name); // Student클래스 생성
}
public void speakAll() { // 메소드
System.out.println("전체인원수 : " + totalCount);
for (int i=0; i<list.size(); i++) {
list.get(i).speak();
}
}
public void showStaff() { // 메소드
final int schoolCode = 1004; // 자바8부터 final 생략가능
//===== 지역 내부클래스 정의 =====
class Staff {
String name;
int code = schoolCode; // 지역변수는 final 상수만 사용가능
Staff(String name) {
this.name = name;
staffCount++;
}
}
Staff sf1 = new Staff("스태프1");
System.out.println("Staff인원수 : " + staffCount);
System.out.println(sf1.name + "입니다. code:" + sf1.code);
}
//===== 인스턴스 내부클래스 정의 =====
class Student {
String name;
Student(String name) { // 생성자
this.name = name;
list.add(this); // 외부클래스의 멤버변수에 직접 접근
totalCount++; // 외부클래스의 멤버변수에 직접 접근
}
void speak() { // 메소드
System.out.println(name + "입니다");
}
}
//===== Static 내부클래스 정의 =====
static class Teacher {
String name;
static int code = 1001;
Teacher(String name) { // 생성자
this.name = name;
}
}
}
2) 객체 생성 및 실행
public class HelloWorld {
public static void main(String[] args) {
System.out.println("[인스턴스 내부클래스]-----------------");
School mySchool = new School();
mySchool.addStudent("홍길동");
mySchool.addStudent("이순신");
mySchool.list.get(0).speak();
mySchool.list.get(1).speak();
School.Student ss1 = mySchool.new Student("유관순");
ss1.speak();
mySchool.speakAll();
System.out.println();
System.out.println("[Static 내부클래스]---------------");
School.Teacher t1 = new School.Teacher("선생님1");
System.out.println(t1.name + "입니다. code:" + School.Teacher.code);
System.out.println();
System.out.println("[지역 내부클래스]------------------");
mySchool.showStaff();
}
}
3) 실행결과
[인스턴스 내부클래스]-----------------
홍길동입니다
이순신입니다
유관순입니다
전체인원수 : 3
홍길동입니다
이순신입니다
유관순입니다
[Static 내부클래스]---------------
선생님1입니다. code:1001
[지역 내부클래스]------------------
Staff인원수 : 1
스태프1입니다. code:1004
반응형