JAVA 웹 개발 패키지 - 패스트캠퍼스/Chapter6

내부 클래스의 정의와 유형

giggs 2022. 1. 16. 16:20

여러 내부 클래스의 정의와 유형

- 인스턴스 내부 클래스, 정적(static) 내부 클래스, 지역(local) 내부 클래스, 익명(anonymous) 내부 클래스

- 현재 익명 내부 클래스가 가장 많이 사용

 

내부 클래스란? (inner class)

 

  • 클래스 내부에 선언한 클래스로 이 클래스를 감싸고 있는 외부 클래스와 밀접한 연관이 있는 경우가 많고, 다른 외부 클래스에서 사용할 일이 거의 없는 경우에 내부 클래스로 선언해서 사용함
  • 중첩 클래스라고도 함
  • 내부 클래스의 종류

 

인스턴스 , 정적(static) , 지역(local)  // 익명(anonymous) 내부 클래스

변수와 선언 위치나 생성 주기가 똑같다. // 익명 내부 클래스는 다름

 


 

인스턴스 내부 클래스

 

  • 내부적으로 사용할 클래스를 선언 ( private으로 선언하는 것을 권장 )
  • 외부 클래스가 생성된 후 생성됨 ( 정적 내부 클래스와 다름 )
  • private이 아닌 내부 클래스는 다른 외부 클래스에서 생성할 수 있음

 

 


 

정적 내부 클래스

 

  • 외부 클래스 생성과 무관하게 사용할 수 있음
  • 정적 변수, 정적 메서드 사용
  • 정정 내부 클래스 예

 

 

정적 내부 클래스 일반 메서드와 정적 메서드에서의 변수 사용

 


 

지역 내부 클래스

 

  • 지역 변수와 같이 메서드 내부에서 정의하여 사용하는 클래스
  • 메서드의 호출이 끝나면 메서드에 사용된 지역변수의 유효성은 사라짐
  • 메서드 호출 이후에도 사용해야 하는 경우가 있을 수 있으므로 지역 내부 클래스에서 사용하는 메서드의 지역 변수나 매개 변수는 final로 선언됨 - ( 컴파일러가 자동으로 상수화 해줌 )

 

 

지역 내부 클래스에서 외부 지역변수 사용할 때 주의할 점

  • 외부의 매개변수나 지역 변수를 가져다가 사용할 때 생성 주기의 차이로 외부 매개변수나 지역변수는 final 처리된다.
  • 지역 내부 클래스에서 가져가 사용하는 것은 괜찮지만 변경은 되지 않음 - 상수화 된 변수이므로 

 

final int i , final int num = 10; - final 선언 안 해줘도 컴파일러가 적용해줌

//getRunnable()와 run()의 생성 주기 차이 때문에.
//getRunnable() 메서드의 매개변수와 지역변수가 상수화 처리 안되어서 원래대로 스택 메모리에 있다면 
//getRunnable() 메서드 처리완료 시 사라져 버림. 그럼 run() 메서드 호출될 때 값이 없을 수도 있으므로

 

 

MyRunnable 클래스를 사용하려면 직접 생성하는 것이 아닌 getRunnable()메서드를 호출하여 생성된 개체를 반환받아야 함

 


 

익명 내부 클래스

 

  • 이름이 없는 클래스 (위 지역 내부 클래스의 MyRunnable 클래스 이름은 실제로 호출되는 경우가 없음)
  • 클래스의 이름을 생략하고 주로 하나의 인터페이스나 하나의 추상 클래스를 구현하여 반환
  • 인터페이스나 추상 클래스 자료형의 변수에 직접 대입하여 클래스를 생성하거나 지역 내부 클래스의 메서드 내부에서 생성하여 반환 할 수 있음.
  • widget의 이벤트 핸들러에 활용됨

 

  • 이름이 없는 클래스 (위 지역 내부 클래스의 MyRunnable 클래스 이름은 실제로 호출되는 경우가 없음)

 

  • 클래스의 이름을 생략하고 주로 하나의 인터페이스나 하나의 추상 클래스를 구현하여 반환

 

  • 인터페이스나 추상 클래스 자료형의 변수에 직접 대입하여 클래스를 생성하거나 지역 내부 클래스의 메서드 내부에서 생성하여 반환할 수 있음.

출력 테스트 - 호출해서 사용하는 법

 

 

 


 

review

내부 클래스의 4가지 유형을 학습했다.
인스턴스 / 정적 / 지역 / 익명 내부 클래스
변수사용할때와 같은 위치에 선언해주고 사용하는 법도 비슷해서 크게 어렵진 않았다.

인스턴스 내부 클래스 - private
정적 내부 클래스 - 일반 메서드 클래스 / 정적 메서드 클래스
지역 내부 클래스 - 메서드 내부에서 정의하여 사용 / 외부 변수 final 처리
익명 내부 클래스 -> 클래스 이름 생략 / 주로 하나의 인터페이스나 추상 클래스 구현하여 반환 
-> 변수에 직접 대입 - 메서드 내부에서 생성하여 반환 할 수 있음. 


클래스 안에 클래스
예전에 한 클래스에서 public class는 하나여야한다고 한다는 내용이 생각났다.
클래스 하나에 클래스가 하나지 왜 그런가 했었는데 이유를 알았다. ㅎㅎ
중첩 클래스라고도 하는 내부 클래스들의 종류.
그 중에 요즘 제일 많이 사용한다는 익명 내부 클래스
하나의 클래스를 만들고 생성자와 메서드를 만들고 사용하는 것보다
과정을 줄여주고 코드도 단순 명확하게 만들어 주는 것 같다.