TIL - 내부 클래스

장숭혁·2023년 10월 20일
1

TIL작성

목록 보기
3/60
  • 내부 클래스의 종류
    1.인스턴스 내부 클래스
    2.지역 내부 클래스
    3.정적 내부 클래스
    4.익명 내부 클래스
  • 특징:
    1.클래스를 감싸고 있는 외부클래스와 밀접한 연관이 있다.
    2.다른 외부클래스에서 전혀 사용할 일이 많이 없을때 사용한다.
    3.주로 private으로 선언한다.
  1. 내부 클래스와 외부클래스를 함께 관리하므로 유지, 보수 및 가독성에 이점이 있다.

1.인스턴스 내부 클래스

  • 선언방법 :

    OutClass outClass = new OutClass();
    OutClass.InClass inclass = outClass.new InClass();
    "외부 클래스.new 내부클래스임"에 유의해야 한다.

  • 외부 클래스 모든 접근 지정자 필드, 메소드 사용 가능하며,
  • 외부 클래스 객체가 먼저 생성되어야 접근이 가능하다.
  • 외부 클래스의 인스턴스 멤버처럼 다뤄짐
  • 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 주로 선언됨

2.지역 내부 클래스

  • 외부 클래스의 메소드 안에 위치한 내부 클래스이다.
  • 인스턴스 내부 클래스와 마찬가지로 외부 클래스 메서드, 필드에 접근이 가능하다.
  • 메소드 안 지역 변수를 사용한다면 그 지역변수는 자동으로 final로 선언된다.
  • 지역 내부 클래스는 static으로 지정 불가능

3.정적 내부 클래스

  • 외부 클래스의 멤버변수 선언위치에 선언, 외부 클래스의 static변수 처럼 쓰인다.
  • static 내부 클래스는 static 필드 변수, 메소드와 다른 메모리 구조나 기능을 가진다.
  • 정적 내부 클래스의 인스턴스를 생성하지 않고 해당클래스의 인스턴스 변수에 직접 접근할 수 없다.
package practice;

public class OuterClass {
    private int instanceVariable;
    private static int staticVariable;


        // 내부 클래스 선언
        class InnerClass {
            private int innerInstanceVariable; // 내부 클래스의 인스턴스 변수
            // 내부 클래스의 정적 변수
            private static final int INNER_STATIC_VARIABLE = 42;

            public void innerInstanceMethod() {
                System.out.println("내부 클래스의 인스턴스 메서드");
                System.out.println("외부 클래스의 인스턴스 변수: " + instanceVariable);
                System.out.println("내부 클래스의 인스턴스 변수: " + innerInstanceVariable);
                System.out.println("내부 클래스의 정적 변수: " + INNER_STATIC_VARIABLE);
            }


            // 내부 클래스의 인스턴스 생성
        }


    public static void staticMethod() {
        // 정적 메서드 내에서도 내부 클래스를 사용할 수 있습니다.
        class InnerClass {
            // 내부 클래스의 정적 메서드
            public static void innerStaticMethod() {
                System.out.println("내부 클래스의 정적 메서드");
                System.out.println("외부 클래스의 정적 변수: " + staticVariable);
            }
        }

        // 내부 클래스의 정적 메서드 호출
        InnerClass.innerStaticMethod();
    }

    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.innerInstanceVariable = 3;
        System.out.println(innerClass.innerInstanceVariable);

        outerClass.staticMethod();
    }
}
  • 내부 클래스안에서 정적 메서드와 정적 변수를 사용할 수 있다.

4.익명 내부 클래스

  • 이름이 없는 클래스이다.
  • 클래스 이름을 생략하고 주로 하나의 인터페이스나 하나의 추상클래스를 구현하여 반환한다.
    -인터페이스나 추상클래스 자료형의 변수에 직접 대입하여 클래스를 생성하거나 지역 내부 클래스의 메서드 내부에서 생성하여 반환할 수 있다.
  • 안드로이드 widget 이벤트 핸들러에서 많이 활용된다.
interface Greeting {
    void greet();
}

public class Main {
    public static void main(String[] args) {
        // 익명 내부 클래스로 Greeting 인터페이스를 구현
        Greeting greeting = new Greeting() {
            @Override
            public void greet() {
                System.out.println("안녕하세요!");
            }
        };

        // 익명 내부 클래스의 메서드 호출
        greeting.greet();
    }
}

profile
코딩 기록

0개의 댓글

관련 채용 정보