여러 내부 클래스의 정의와 유형
- 인스턴스 내부 클래스, 정적(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는 하나여야한다고 한다는 내용이 생각났다.
클래스 하나에 클래스가 하나지 왜 그런가 했었는데 이유를 알았다. ㅎㅎ
중첩 클래스라고도 하는 내부 클래스들의 종류.
그 중에 요즘 제일 많이 사용한다는 익명 내부 클래스
하나의 클래스를 만들고 생성자와 메서드를 만들고 사용하는 것보다
과정을 줄여주고 코드도 단순 명확하게 만들어 주는 것 같다.
'JAVA 웹 개발 패키지 - 패스트캠퍼스 > Chapter6' 카테고리의 다른 글
사용자 정의 예외 클래스, 로그 남기기 (0) | 2022.01.22 |
---|---|
예외 처리는 왜 해야 하나? - 예외처리, 예외클래스, 예외처리미루기 (0) | 2022.01.19 |
예제) 스트림을 활용하여 패키지 여행 비용 계산하기 (0) | 2022.01.18 |
스트림(Stream) , reduce() 연산 (0) | 2022.01.18 |
람다식(Lambda expression) (0) | 2022.01.17 |