IT 개발/Java

[Java] 자바 - 내부클래스 (inner class, nested class)

KADOSHOLY 2022. 7. 5. 02:45
반응형

 

자바 - 내부클래스 (inner class, nested class)

 

 

클래스 안에 또 하나의 클래스가 정의되어 있을 때 이를 내부클래스라고 하며, 내부에 선언된 위치에 따라 인스턴스 내부클래스, static 내부클래스, 지역 내부클래스로 구분할 수 있습니다. 여기에서는 각 내부클래스의 특징과 사용예제를 간략히 살펴보도록 하겠습니다. 

 

 

   목차

  1. 내부클래스
    • 인스턴스 내부클래스
    • static 내부클래스
    • 지역내부클래스
  2. 사용예제

 

 

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

 

 

반응형