1. 정의
말 그대로 클래스 내부에 정의된 클래스이다.
2. 종류
익명 클래스를 제외하고는, 일반적인 멤버 변수와 메서드와 성질이 같다.
- 인스턴스 클래스(멤버 변수): 외부 클래스의 선언위치에서 선언, 스코프는 외부 클래스
- 정적 클래스(정적 맴버 변수): 외부 클래스의 선언 위치에서 선언, 스코프는 전역
- 지역 클래스(메서드): 외부 클래스의 메서드 안에서 선언 ,스코프는 메서드
- 익명 클래스: 클래스의 선언과 객체 생성을 동시에 하는 클래스(일회용)
3. 특징
중요하다고 생각되는 몇 가지 특징을 정리해보았다.
1. 외부 클래스 밖에서 일반적인 방법으로 인스턴스화 될 수 없다.
2. 외부 클래스의 멤버에 바로 접근할 수 있다. 심지어 프라이빗 변수에도 접근할 수 있다.
//일반적인 클래스 사용방식
class A {
B b = new B(); // 객체를 생성한 후,
b.someMeber; //멤버에 접근
}
//내부 클래스의 사용 방식
Class A {
private int someMeber = 123;
Class B { // 내부 클래스로 정의되어 있다면,
someMember; // 바로 사용가능
}
}
4. 사용 이유
- 캡슐화
두 클래스가 아주 긴밀한 관계이고 다른 클래스에서는 호출되지 않는다면, 내부 클래스로 정의함으로써 외부에서 인스턴스화 될 일이 없고 코드의 복잡성이 낮아진다. - 접근성
객채를 따로 생성해 사용하지 않아도 되고, 프라이빗 멤버에도 접근할 수 있다. - 다중상속
자바는 기본적으로 다중 상속이 불가능한데, 각기 다른 클래스를 상속받은 내부 클래스를 여럿 정의하면서 다중상속의 효과를 볼 수 있다.
5. 기타
- 모든 제어자 사용가능(public private protected default) ↔ 일반 클래스는 퍼블릭이랑 프라이빗만 가능
- 스태틱 멤버를 사용하고 싶으면 클래스도 스태틱이어야한다. 근데 상수 스태틱은 가능하다(final static). 지역 클래스의 상수의 스코프는 메소드 내부이다.
- 내부클래스에서 외부클래스의 private 멤버에 접근할 수 잇다.
- 지역 클래스의 경우 메서드의 지역 변수에 접근 할 수 없다. 왜냐하면 지역변수는 스택메모리로 가서 메서드가 종료되면 사라져서 지역 객체가 더 오래 존재할 수도 있기 때문에. 지역 클래스는 상수(final)에만 접근할 수 있다. (근데 요즘 java에서 값이 바뀌지 않는 상수는 final로 간주함)
'Back-end > Java' 카테고리의 다른 글
Java의 Functional Interface (0) | 2023.04.27 |
---|---|
[JAVA] 불필요한 객채 생성을 막자. 싱글톤 패턴과 정적 초기화 블럭 (0) | 2022.07.09 |
[Java 에러] Get 통신에서 JsonProperty가 동작하지 않을 때 (0) | 2022.06.30 |