개주 훈련일지/📚 코살대 교본 학습

내부 클래스와 종류

lshfood2 2025. 12. 1. 23:14

[ 내부 클래스 ]

내부 클래스(Inner Class)란?

클래스 안에 또 다른 클래스를 선언한 것.

 

외부 클래스의 멤버처럼 동작하며

캡슐화·구조적 결합에 유리하다.

 

내부 클래스 장점

  • 두 클래스 멤버들 간에 손쉽게 접근할 수 있다.
  • 불필요한 클래스를 감춰서 코드의 복잡성을 줄인다.

내부 클래스 종류

  1. 인스턴스 클래스 (Instance class)
  2. 정적 클래스 (static class)
  3. 지역 클래스 (local class)
  4. 익명 클래스 (anonymous class)
메서드 설명
인스턴스 클래스 외부 클래스의 멤버 변수와 같은 위치에 선언
주로 외부 클래스의 멤버 변수와 관련된
작업에 사용될 목적으로 선언
정적 클래스 외부 클래스의 클래스 변수와 같이 static 키워드 부여
지역 클래스 외부 클래스의 메서드 내부에서 선언하여 사용
메서드 영역에서 선언되기 때문에
메서드 내부에서만 사용 가능
익명 클래스 단 한 번만 사용 가능한 일회용 클래스,
주로 일회성 기능 구현에 사용

[ 인스턴스 클래스 ]

외부 클래스 내부에서 생성하고

선언되어 사용되는 클래스다.

 

인수턴스 변수와 같은 위치에 선언하며,

외부 클래스의 인스턴스 멤버처럼 다루어진다.

 

▼ 인스턴스 클래스 생성

public class Outer {
    private String name;
	//인스턴스 멤버

    public class Inner { // 인스턴스 클래스
        private String name;
        ...
    }
}

위와 같이 인스턴스 클래스는

인스턴스 멤버와 동일한 위치에 생성된다.

 

내부 클래스도 외부 클래스 안에  생성되지만

별도의 클래스이기 때문에 컴파일이 별도로 생성된다.

Outer  $  Inner.class
↓                  ↓
외부 클래스  내부클래스

컴파일 된 파일은 $ 기호를 기준으로

왼쪽은 외부 클래스, 오른쪽은 내부 클래스로 표현한다. 

 

▼ 인스턴스 클래스 선언

Outer outer = new Outer();
//외부 클래스 객체 outer 생성

Outer.Inner in = outer.new Inner();
//외부 클래스를 이용해 내부 클래스 객체 in 생성

위와 같이 인스턴스 클래스를 생성하기 위해서는

외부 클래스가 반드시. 선언된 후,

외부 클래스의 인스턴스를 이용해 선언한다.

 

또한 외부 클래스의 인스턴스 변수를 사용할 수 있으나

정적 변수나 메서드를 호출할 수는 없다.


[ 정적 내부 클래스 ]

클래스 안에 정적 변수를 선언하듯이

정적 클래스도 만들 수 있다.

 

static 키워드를 사용해 클래스를 선언하며

주로 외부 클래스의 static 메서드에

사용될 목적으로 선언된다.

 

▼ 정적 내부 클래스 생성

public class Outer {
    private String name;
	//인스턴스 멤버

    public static class Inner { // 정적 내부 클래스
        private String name;
        ...        
    }
}

클래스 앞에 static 키워드를 사용해 선언했다.

정적 변수와 마찬가지로 클래스에 속하지만 독립 존재한다.

 

또한 외부 클래스의 존재와 상관없이 정적 변수를 사용할 수 있다.

그러나 외부 클래스의 인스턴스 변수 또는 메서드를

정적 내부 클래스 안에서 사용할 수는 없다.

단 정적 변수는 정적 내부 클래스 안에서 사용할 수 있다.

 

▼ 인스턴스 클래스 선언

Outer.Inner in = new Outer.new Inner();
//외부 클래스 없이 바로 객체 생성

위와 같이 정적 내부 클래스는 외부 클래스의 선언 없이

바로 클래스의 객체를 선언하여 사용할 수 있다.


[ 지역 클래스 ]

지역 클래스는 외부 클래스의 메서드 내에서

선언되어 사용하는 클래스이다.

 

메서드 내에서 선언되기 때문에 해당 클래스는

메서드 내에서만 사용할 수 있고,

메서드 실행이 끝나면 클래스 사용이 종료된다.

 

▼ 지역 클래스 생성

public class LocalClass {
    ...
    publlic void print(){
    	...
        class A { //지역 클래스 선언
          ...
        }    
        A a = new A(); //메서드 내에서 선언 및 사용
    }    
}

위와 같이 메서드 내에서 선언하여 사용하기 때문에

접근 제한자와 정적 키워드(static)을 붙일 수 없다.


[ 익명 클래스 ]

익명 클래스는 다른 내부 클래스와는 달리

이름이 없는 클래스를 의미한다.

 

클래스의 선언과 객체의 생성을 동시에 하며

단 한 번만 사용할 수 있고, 오직 하나의 객체만을

생성할 수 있는 일회용 클래스이다.

 

따라서 생성자를 선언할 수도 없으며

둘 이상의 인터페이스를 구현할 수도 없다.

(오직 단 하나의 클래스/인터페이스만 적용)

 

그래서 한 번 쓰고 버릴 간단한 기능을 담을 때 사용한다.
인터페이스나 추상 클래스를 즉석에서 구현할 때 자주 사용!

 

▼ 익명 클래스 생성

//기존 객체 생성 방식
Person p = new Person();

//익명 클래스 선언 및 객체 생성 방법
Person p = new Person() {
    @Override
    void method(){
    }
    ...
};

클래스 생성자 뒤에 코드 블록 { ... } 이 추가되고

해당 클래스가 가진 메서드들을 override하여 구현한다.

 

즉 해당 클래스 자체를 재정의하여 구현하는 방식이다.

구현된 문법 마지막에는 세미콜론 ; 을 붙인다.

 

인터페이스를 상속하여 하위 클래스를 통해

구현하는 것이 아니라 익명 클래스로 선언하여

기능을 직접 구현하는 경우가 많다.


※주의사항

내부 클래스도 클래스이기 때문에 접근제한자 사용 가능
public, protected, default, private 모두 가능.

 

지역 클래스와 익명 클래스는 접근제한자 사용 불가
(메서드 내부니까 원래 public/private 같은 걸 붙일 수 없음)