중첩클래스를 알아보자 (내부클래스, 정적 중첩클래스, 지역클래스, 익명클래스)
일반클래스는 Package member class 라고들 하며, 아래 항목에서 제외했다. 구글링해보면 클래스간에 관계나 큰 틀에서의 구조를 안잡고 나열하는 식이 많은 것 같다ㅋㅋ
1. 중첩 클래스는 왜 쓰는가?
- 클래스들의 논리적인 그룹을 나타낼 때 쓴다. 주로 model 객체에서 상위모델과 하위모델이 있을 때 쓰는 것 같다. (Static Nested Class 를 많이 씀)
- 향상된 캡슐화
- 좋은 가독성과 유지보수성
2. 중첩 클래스의 종류
3. 내부클래스 (Inner Class)
- 내부클래스로서 일반클래스 내부에 생성된다. Non-Static Nested Class 라고도 불린다.
- 밖에 있는 클래스는 내부클래스를 멤버변수처럼 사용할 수 있다. 사용하려면 new로 인스턴스를 만들어야한다.
- 내부클래스는 자신의 밖에 있는 클래스의 자원을 직접 사용할 수 있다.
모양새
class Outer {
변수;
메소드;
public class Inner {
}
}
객체 생성
Outer 객체1 = new Outer();
Outer.Inner 객체2 = 객체1.new Inner();
클래스 파일 생성
컴파일하면 각각 아래와 같이 생긴다.
- Outer.class
- Outer$Inner.class
4. 정적 중첩클래스 (Static Nested Class)
- 위의 내부클래스와 비슷하나, static 으로 선언한다. 정확히는 Static Nested Class 라고 한다.
- 밖에 있는 클래스의 변수와 메소드 중에 static이 붙은 것들은 사용할 수 있다.
내부클래스와의 차이
- 내부클래스는 밖에 있는 클래스의 자원을 마음대로 사용할 수 있지만, 중첩클래스는 static 키워드가 안붙었다면 사용할 수 없다.
- Outer 클래스의 객체가 없어도 Inner 클래스의 객체 생성이 가능하다. (하단에 객체생성법 참고)
모양새
class Outer {
변수;
메소드;
public static class Inner {
}
}
객체 생성
Outer.Inner 객체 = new Outer.Inner();
5. 지역 클래스(Method Local Inner Class)
- 메소드 내부에 클래스를 정의하는 경우이다. 마치 메소드 내의 지역변수처럼 쓰인다.
- 메소드 내부에서 new 한 뒤 사용해야 한다. 메소드 밖에서 사용할 수 없다(지역변수 룰)
모양새
class Outer {
변수;
메소드1;
메소드2() {
지역변수;
class Inner {
}
}
}
클래스 파일 생성
컴파일하면 각각 아래와 같이 생긴다.
- Outer.class
- Outer$숫자Inner.class
6. 익명클래스(Anonymous Inner Class)
- 익명클래스는 인스턴스 이름이 없다. new 와 동시에 부모클래스를 상속받아 내부에서 오버라이딩해서 사용한다.
- 매개변수로 사용할 수도 있다.
- 익명클래스 내부의 변수나 메소드는 익명클래스의 밖에서 사용이 불가능하다.
- 주로 익명클래스는 이럴때 사용 : 상속은 받아야하지만, 한번만 사용할 것이라서 extends 문법을 굳이 사용안함
- 익명클래스 내부에 생성자X
- 익명클래스 외부의 자원은 final 키워드가 붙은 것만 사용할 수 있다.
- 아래 모양새에서 보듯이 Inner 클래스가 이미 선언되어있어야 한다. Inner 클래스를 바로 상속받고 오버라이딩해서 쓰는 구조이다.
모양새
Class Inner {
변수;
메소드;
}
class Outer {
변수;
메소드1;
메소드2() {
지역변수;
new Inner() {
override된 내용들..
}
}
}
클래스 파일 생성
컴파일하면 각각 아래와 같이 생긴다.
- Outer.class
- Outer$숫자.class
출처: https://sjh836.tistory.com/145?category=679845 [빨간색코딩]
'JAVA > Java' 카테고리의 다른 글
lambda (람다, 표현식, 함수형 인터페이스, default 메소드, 메소드 레퍼런스) (0) | 2021.03.21 |
---|---|
객체지향 설계 5원칙 SOLID (SRP, OCP, LSP, ISP, DIP) (0) | 2021.03.21 |
객체지향의 4대 특성 (클래스, 객체, 인스턴스, 캡슐화, 상속, 추상화, 다형성) (0) | 2021.03.21 |
스레드덤프 (thread dump) (0) | 2021.03.21 |
최상위 객체 Object 클래스(주요 메소드, finalize 이슈) (0) | 2021.03.21 |
apache commons (StringUtils) (0) | 2021.03.19 |
time 패키지 (util.Date와 util.Calendar의 문제, LocalDate, LocalDateTime, DateTimeFormatter) (0) | 2021.03.19 |
enum (이전 방식, 개념, 동작방식, 사용예제, 관련메소드) (0) | 2021.03.19 |