Java/Do It! 자바 프로그래밍

[JAVA] 13-1. 내부 클래스

HSY_mumu 2022. 5. 10. 13:48
728x90

<정리>

종류 구현 위치 사용할 수 있는 외부 클래스 변수 생성 방법
인스턴스 내부 클래스 외부 클래스 멤버 변수와 동일 외부 인스턴스 변수,
외부 전역 변수
외부 클래스 생성 후 내부 클래스 생성
정적 내부 클래스 외부 클래스 멤버 변수와 동일 외부 전역 변수 외부 클래스와 무관하게 생성
지역 내부 클래스 메서드 내부에 구현 외부 인스턴스 변수,
외부 전역 변수
메서드 호출할 때 생성
익명 내부 클래스 1) 메서드 내부에 구현
2) 변수에 대입하여 직접 구현
외부 인스턴스 변수,
외부 전역 변수
1) 메서드 호출할 때 생성
2) 인터페이스 형 변수에 대입할 때 new 예약어로 생성

1. 내부 클래스 정의와 유형

내부 클래스(Inner Class)클래스 내부에 선언한 클래스다.

<내부 클래스를 선언하는 이유>

1) 외부 클래스와 밀접한 관련이 있는 경우

2) 그 밖의 다른 클래스와 협력할 일이 없는 경우

 

선언하는 위치, 예약어에 따라 크게 "인스턴스 내부 클래스, 정적 내부 클래스, 지역 내부 클래스, 익명 내부 클래스" 4가지 유형으로 나눌 수 있다.

인스턴스 내부 클래스, 정적 내부 클래스, 지역 내부 클래스는 변수의 유형(인스턴스 변수, 정적 변수, 지역 변수)와 유사하고 익명 내부 클래스는 클리스 이름없이 선언하고 바로 생성하여 사용할 수 있다.

2. 인스턴스 내부 클래스

인스턴스 내부 클래스인스턴스 변수를 선언할 때와 같은 위치에 선언하는 내부 클래스다.

1) 외부 클래스 내부에서만 생성하여 사용하는 객체를 선언할 때 사용한다.

2) 인스턴스 내부 클래스는 외부 클래스 생성 후 생성되므로, 외부 클래스가 먼저 생성되어야 사용 가능하다.

  • 내부 클래스 자료형 변수를 먼저 선언 → 외부 클래스(OutClass) 생성자에서 내부 클래스 생성

1. 인스턴스 내부 클래스에서 사용하는 변수와 메서드

1) 클래스 생성과 상관없이 사용할 수 있는 정적 변수, 정적 메서드인스턴스 내부 클래스에서 선언X

2) 인스턴스 내부 클래스의 메서드는 외부 클래스의 메서드가 호출될 때 사용O

 

2. 다른 클래스에서 인스턴스 내부 클래스 생성하기

내부 클래스를 private으로 선언하면 다른 클래스에서 내부 클래스를 사용할 수 없다.

어떤 클래스의 내부에서만 사용할 목적이라면 내부 클래스를 private으로 선언해야한다.

3. 정적 내부 클래스

정적 내부 클래스외부 클래스의 멤버 변수와 같은 위치에 정의하며 static 예약어를 사용하는 내부 클래스다.

<정적 내부 클래스 사용 이유>

1) 내부 클래스가 외부 클래스 생성과 무관하게 사용할 수 있어야 하는 경우

2) 정적 변수도 사용할 수 있어야 하는 경우

 

<정적 내부 클래스 메서드에서 변수의 사용 가능 여부>

정적 내부 클래스 메서드 변수 유형 사용 가능 여부
일반 메서드 외부 클래스의 인스턴스 변수 X
외부 클래스의 정적 변수 O
정적 내부 클래스의 인스턴스 변수 O
정적 내부 클래스의 정적 변수 O
정적 메서드 외부 클래스의 인스턴스 변수 X
외부 클래스의 정적 변수 O
정적 내부 클래스의 인스턴스 변수 X
정적 내부 클래스의 정적 변수 O

 

1. 다른 클래스에서 정적 내부 클래스 사용하기

1) 정적 내부 클래스는 외부 클래스를 생성하지 않고 내부 클래스 자료형으로 바로 선언하여 생성O

2) 정적 내부 클래스에서 선언한 메서드/변수private이 아닌 경우에 다른 클래스에서도 바로 사용O

4. 지역 내부 클래스

지역 내부 클래스는 지역 변수처럼 메서드 내부에 클래스를 정의하여 사용하는 내부 클래스다.

1. 지역 내부 클래스에서 지역 변수의 유효성

지역 변수는 메서드가 호출될 때 스택 메모리에 생성되고 메서드 종료 후 메모리에서 사라진다.

하지만 지역 내부 클래스에서 사용하는 지역 변수는 상수로 처리된다. 자바8부터는 지역 변수에 final 예약어를 써주지 않아도 컴파일러가 자동으로 추가해준다. 즉, 지역 내부 클래스에서 사용하는 메서드의 지역 변수는 모두 상수이므로 지역 내부 클래스에서 지역 변수 값을 변경하면 오류가 발생한다.

5. 익명 내부 클래스

익명 내부 클래스클래스 이름이 없는 내부 클래스다.

1) 메서드 내부에서 단 하나의 인터페이스나 추상 클래스를 구현

2) 인터페이스 자료형 변수에 익명 내부 클래스를 직접 대입

class Outter2{
	// 1번 방식	
	Runnable getRunnable(int i){

		int num = 100;
		
		return new Runnable() {
				
		@Override
		public void run() {
			//num = 200;   //에러 남
			//i = 10;      //에러 남
			System.out.println(i);
			System.out.println(num);
			}
		};
	}
    
    
	// 2번 방식
	Runnable runner = new Runnable() {
		
		@Override
		public void run() {
			System.out.println("Runnable 이 구현된 익명 클래스 변수");
			
		}
	};
}

 

 

 

 

 

 

728x90