내부 클래스
- 클래스나 인터페이스 내에서 선언된 클래스로서 내부클래스에서 외부클래스 멤버에 접근 가능
- 외부에서는 내부 클래스에 접근 불가하다.
- 외부에 불필요한 클래스를 감추어서 코드의 복잡성을 줄일 수 있다. (캡슐화)
1. 멤버 이너 클래스 (member inner class)
클래스 내부에서 멤버 변수처럼 선언된 이너 클래스다.
인스턴스 멤버 클래스와 정적 멤버 클래스가 존재한다.
( 이너 클래스에서 필드나 메서드의 이름이 동일한 아우터 클래스 멤버를 참조하고 싶으면
"아우터 클래스명.this.멤버"처럼 사용할 수 있다. )
2. 정적 이너 클래스 (static inner class)
정적 메서드와 동일하게 아우터 클래스의 정적 멤버에만 접근할 수 있다.
정적 이너 클래스도 정적 멤버이므로 객체 생성 없이 클래스명으로 바로 접근할 수 있다.
3. 지역 이너 클래스 (local inner class)
외부 클래스에 메서드나 초기화 블록에 선언된 이너 클래스를 의미한다.
지역 변수처럼 해당 메서드 내부에서만 한정적으로 사용된다.
(지역 변수는 반드시 final로 선언한다. 생략 시 컴파일러가 삽입)
4. 익명 이너 클래스(anonymous class)
익명 클래스는 이름이 존재하지 않는 이너 클래스다.
클래스의 선언과 동시에 객체를 생성한다. 단 하나의 객체만을 생성하는 일회용 클래스다.
따라서 생성자를 생성할 수 없다.
link
https://romcanrom.tistory.com/59
java/ 내부 클래스의 종류와 내부 클래스를 사용함으로써 얻는 장점
내부 클래스 Inner Class = 이너 클래스, 중첩 클래스 내부 클래스는 클래스나 인터페이스 내에서 선언된 클래스를 말한다. 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용할 수 있으며
romcanrom.tistory.com
// Java 프로그래밍 - 내부 클래스
class Outer {
public void print() {
System.out.println("Outer.print");
}
class Inner {
void innerPrint() { // 내부 인스턴스
Outer.this.print();
}
}
static class InnerStaticClass { //내부 정적 : 바로 메모리에 올라감
void innerPrint() {
// Outer.this.print(); //Outer는 외부클래스라서 바로 메모리에 안올라감
}
}
public void outerMethod() { //외부
class InnerLocal {
}
InnerLocal il1 = new InnerLocal();
}
}
abstract class Person {
public abstract void printInfo();
}
class Student extends Person {
public void printInfo() {
System.out.println("Student.printInfo");
}
}
public class Main {
public static void main(String[] args) {
// 외부 클래스
Outer o1 = new Outer();
// 내부 클래스 - 인스턴스
Outer.Inner i1 = new Outer().new Inner();
// 내부 클래스 - 정적
Outer.InnerStaticClass is1 = new Outer.InnerStaticClass();
// 익명 클래스
Person p1 = new Person() {
@Override
public void printInfo() {
System.out.println("Main.printInfo");
}
};
}
}
'Study for Backend > Programming language - Java' 카테고리의 다른 글
[Java기초] next()와 nextLine()의 차이점 (0) | 2024.02.12 |
---|---|
[Java기초] 입출력 (2) | 2024.02.08 |
[Java기초] 인터페이스 (0) | 2024.02.08 |
[Java기초] Random 클래스 관련 (0) | 2024.02.07 |
[Java기초] StringBuilder와 StringBuffer (0) | 2024.02.06 |