중첩 클래스, 내부 클래스

- 중첩 클래스의 종류
- 정적 중첩 클래스
- 내부 클래스
- 내부 클래스
- 지역 클래스
- 익명 클래스
class Outer {
//정적 중첩 클래스
static class StaticNested {...}
//내부 클래스
class Inner{...}
}
- 정적 중첩 클래스는 static이 붙는다.
- 내부 클래스는 static이 붙지 않는다.
- 중첩 클래스 vs 내부 클래스
- 중첩 클래스 : 외부 클래스의 안에 있지만 외부 클래스와 관계가 없는 것을 의미한다, 단순히 위치만 안에 있는 것.
static이 붙으며 외부 클래스의 인스턴스에 소속되지 않는다. - 내부 클래스 : 외부 클래스의 내부에서 외부 클래스를 구성하는 요소를 의미한다.
static이 붙지 않으며 외부 클래스의 인스턴스에 소속된다.
- 중첩 클래스 : 외부 클래스의 안에 있지만 외부 클래스와 관계가 없는 것을 의미한다, 단순히 위치만 안에 있는 것.
- 내부 클래스 : 외부 클래스의 인스턴스 멤버에 접근
- 지역 클래스 : 내부 클래스의 특징 + 지역 변수에 접근
- 익명 클래스 : 지역 클래스의 특징 + 클래스의 이름이 없는 특별한 클래스
- 중첩 클래스를 사용하는 경우와 이유는?
- 외부 클래스의 안에서만 사용되거나, 외부 클래스와 아주 긴밀하게 연결되어 있는 경우에만 사용한다.
- 만약 외부에서 사용한다면 중첩 클래스로 만들면 안된다.
- 논리적 그룹화 : 특정 클래스가 다른 하나의 클래스 안에서만 사용되는 경우 해당 클래스 안에 포함하는 것이 논리적으로 더 그룹화가 된다.
다른 곳에서 사용할 필요가 없는 중첩 클래스는 외부에 노출되지 않는다는 장점이 있다. - 캡슐화 : 외부 클래스의 private 멤버에 접근할 수 있기에 불필요한 public 메소드를 제거할 수 있다.
- 외부 클래스의 안에서만 사용되거나, 외부 클래스와 아주 긴밀하게 연결되어 있는 경우에만 사용한다.
정적 중첩 클래스
- 정적 중첩 클래스
- static으로 선언된 내부 클래스로 외부 클래스의 static 멤버(클래스 멤버)에만 접근할 수 있다.
- 외부 클래스 내부에 있기 때문에 외부 클래스의 private 필드에 접근 가능.
public class NestedOuter {
static class Nested {...}
}
// 정적 중첩 클래스 객체 생성
NestedOuter.Nested nested = new NestedOuter.Nested();
- 정적 중첩 클래스는 new 외부클래스.중첩클래스()로 인스턴스를 생성할 수 있다.
- 외부 클래스의 인스턴스와 중첩 클래스의 인스턴스는 서로 아무 관계가 없다.
- 서로 다른 클래스를 중첩해뒀을 뿐 아무 관계가 없다.
- 서로 다른 클래스를 중첩해뒀을 뿐 아무 관계가 없다.
- 다른 곳에 있는 중첩 클래스에 접근할 때 외부클래스.중첩클래스로 접근해야 한다.
- 내 클래스의 포함된 중첩 클래스에 접근할 때는 외부 클래스의 이름을 적지 않아도 된다.
- 중첩 클래스는 외부 클래스 안에서만 사용되는 용도로 만들어진 클래스
- 외부 클래스가 아닌 다른 클래스에서 중첩 클래스를 사용하고 있다면 중첩 클래스로서의 용도로 맞지 않는다.
중첩 클래스를 밖으로 빼주는 것이 더 나은 선택.
- 외부 클래스가 아닌 다른 클래스에서 중첩 클래스를 사용하고 있다면 중첩 클래스로서의 용도로 맞지 않는다.
내부 클래스
public class InnerOuter {
class Inner {...}
}
InnerOuter outer = new InnerOuter();
InnerOuter.Inner inner = outer.new Inner();
- 내부 클래스는 static으로 선언되지 않으며 외부 클래스의 인스턴스에 소속된다.
- 외부 클래스의 인스턴스 정보를 알아야 생성할 수 있다.
외부 클래스 객체명.new 내부 클래스(); 로 내부 클래스 인스턴스를 생성한다. - 외부 클래스의 인스턴스를 먼저 생성해야 내부 클래스의 인스턴스를 생성할 수 있다.
- 내부 인스턴스가 외부 인스턴스 안에 생성되지는 않는다.
내부 인스턴스가 외부 인스턴스의 참조를 보관하며 이를 통해 외부 인스턴스의 멤버에 접근할 수 있다.
- 외부 클래스의 인스턴스 정보를 알아야 생성할 수 있다.
- 내부 클래스에서는 외부 클래스의 인스턴스 참조를 가지기 때문에 외부 클래스의 인스턴스 멤버에 접근할 수 있다.
- 외부 클래스에서 내부 클래스의 인스턴스를 생성할 때 내부 클래스의 인스턴스는 외부 클래스의 인스턴스를 자동으로 참조한다.
- 외부 클래스 멤버, 내부 클래스 멤버, 지역 변수명이 같다면?
public class ShadowingMain {
public int value = 1;
class Inner {
public int value = 2;
void go() {
int value = 3;
System.out.println("value = " + value);
System.out.println("this.value = " + this.value);
System.out.println("ShadowingMain.this.value = " + ShadowingMain.this.value);
}
}
}
- 외부 클래스, 내부 클래스의 변수와 지역 변수명이 같은 경우
프로그래밍에서 우선순위는 보통 더 가깝거나 더 구체적인 것이 우선권을 갖는다. - go()에서는 지역 변수 value가 가장 우선순위가 높기에 value로 접근한다.
go()는 내부 클래스에 선언된 메소드이므로 내부 클래스의 자신의 멤버에 접근하기 위해서는 this.value로 접근한다.
외부 클래스 멤버 value에 접근하기 위해서는 외부클래스명.this.value로 접근한다.
Shadowing : 위에 예시처럼 다른 변수(value)들을 가려서 보이지 않게 하는 것.
다른 변수들을 가려서 보이지 않게 하더라도 인스턴스의 참조를 사용하면 다른 변수에 접근할 수 있다.
출처: [인프런 김영한 실전 자바 - 중급편]
김영한의 실전 자바 - 중급 1편 강의 | 김영한 - 인프런
김영한 | 실무에 필요한 자바의 다양한 중급 기능을 예제 코드로 깊이있게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을
www.inflearn.com
'Java > [인프런 김영한 실전 자바 - 중급편]' 카테고리의 다른 글
[인프런 김영한 실전 자바 - 중급편] 예외 처리1, 2 (0) | 2024.07.23 |
---|---|
[인프런 김영한 실전 자바 - 중급편] 중첩 클래스, 내부 클래스 2 (0) | 2024.07.23 |
[인프런 김영한 실전 자바 - 중급편] 날짜와 시간 (1) | 2024.07.21 |
[인프런 김영한 실전 자바 - 중급편] 열거형 - ENUM (0) | 2024.07.19 |
[인프런 김영한 실전 자바 - 중급편] 래퍼, Class 클래스 (0) | 2024.07.19 |