본문 바로가기
JAVA

내부 클래스

by 융디's 2024. 4. 25.
728x90
내부 클래스

내부 클래스

@2024.04.12

내부 클래스

💡
클래스 내부에 또 다른 클래스를 정의하는 것이며,
이런 클래스는
외부 클래스의 멤버처럼 취급되며, 특별한 접근 권한과, 기능을 가진다.
  • 주요 사용
    • 한 클래스가 다른 클래스의 동작을 확장할 때
    • 보조하는 경우
    • 인터페이스 구현을 숨기고 싶은 경우에 사용
  • 특징
    • 접근성과 은닉성
      • 외부 클래스의 필드와 메서드에 직접 접근 가능(private 포함)
      • 외부에서는 내부 클래스의 private 멤버에 접근할 수 없어 은닉성을 제공
    • 코드의 조직화
      • 관련된 기능을 같은 외부 클래스에 묶어두면, 코드를 더 잘 조직화하고 관리
      • 코드의 가독성과 유지 보수성을 향상

멤버 내부 클래스

💡
다른 클래스 내부에 위치하는 클래스로, 외부 클래스의 인스턴스와 연결되어 있다.
  • 외부 클래스의 멤버에 대한 접근이 필요할 때 주로 사용
  • 선언
    • 외부 클래스의 멤버 변수나 메서드가 위치한 곳
  • 인스턴스 생성
    • 외부 클래스의 인스턴스를 생성 후 내부 클래스 인스턴스 생성
  • 외부 클래스 멤버 접근
    • 필드, 메서드, 중첩 클래스 등 모든 멤버에 접근 가능(private 포함)
  • 접근 제한자
    • public, private, protected (+ default)
    // 외부 클래스
    public class OuterClass{
    		// 멤버 내부 클래스
    		public class InnerClass{
    		
    		}
    }
    
    // 외부 클래스의 인스턴스 생성
    OuterClass outer = new OuterClass();
    // 내부 클래스의 인스턴스 생성
    OuterClass.InnerClass inner = outer.new InnerClass();

로컬 내부 클래스

💡
메서드 내부에 정의되는 클래스로, 주로 특정 메서드에만 사용되는 기능을 구현하는 데 사용
  • 선언
    • 외부 클래스의 메서드 내부에 위치
    • 정의된 메서드의 지역변수처럼 취급되며 해당 메서드 내에만 사용 가능
  • 인스턴스 생성
    • 클래스가 정의된 메서드 내에서만 생성되고 사용
  • 외부 클래스 멤버 접근
    • 메서드의 지역 변수는 파라미터에 접근 가능
    • 단, final 일 경우에만 접근 가능
      • 메서드 내에서 변경되지 않아야 하기 때문
  • 접근 제한자
    • 정의된 메서드 내에서만 접근 가능
    • 메서드 외부에서는 클래스의 인스턴스를 생성하거나 사용 불가능
    // 외부 클래스
    public class OuterClass {
        // 외부 메소드
        public void add(int a, int b) {
            // 로컬 내부 클래스
            class LocalInnerClass {
                // 로컬 내부 클래스의 메소드
                public void localMethod() {
                    System.out.println("localMethod() 호출됨");
                }
            } //LocallInnerClass
            
            // 로컬 내부 클래스의 인스턴스 생성
            LocalInnerClass inner = new LocalInnerClass();
            // 로컬 내부 클래스의 메소드 호출
            inner.localMethod();
        }//add()
    }//OuterClass
    
    OuterClass outer = new OuterClass();
    outer.add(5, 3);
    outer.add(5,3).localMathod() // 접근 불가능

정적 내부 클래스

💡
외부 클래스의 정적 멤버처럼 취급되는 내부 클래스로, 외부 클래스의 인스턴스와 독립적으로 존재할 수 있다.
  • 네트워크 통신, 데이터 처리, 유틸리티 클래스 구현 등 다양한 상황에서 사용
  • 선언
    • 외부 클래스 내부에 static 키워드를 사용하여 정의
  • 인스턴스 생성
    • 외부 클래스의 인스턴스와 독립적으로 생성된다.
    • 외부 클래스의 인스턴스 없이 외부 클래스 명을 이용하여 직접 접근이 가능
  • 외부 클래스 멤버 접근
    • 외부 클래스의 인스턴스 변수나 메서드에 접근 불가능
    • 외부 클래스의 정적 메서드나 필드는 접근 가능
  • 접근 제한자
    • public, private, protected (+ default)
    public class OuterClass {
        // 외부 클래스의 정적 필드
        public static int staticField = 10;
    		Public String text = "이건 접근이 불가능해";
        // 외부 클래스의 정적 메서드
        public static void staticMethod() {
            System.out.println("OuterClass의 정적 메서드 호출됨");
        }
    
        // 정적 내부 클래스
        public static class InnerClass {
            // 내부 클래스의 메서드
            public void innerMethod() {
                System.out.println("InnerMethod() 호출됨");
            }
        }
    }
    
    // 외부 클래스의 인스턴스 생성 없이 정적 내부 클래스의 인스턴스 생성
    OuterClass.InnerClass inner = new OuterClass.InnerClass();
    inner.innerMethod(); // InnerMethod() 호출됨
    
    System.out.println(OuterClass.staticField); // 외부 클래스의 정적 필드에 접근
    OuterClass.staticMethod(); // 외부 클래스의 정적 메서드 호출
    System.out.println(inner.text); // 외부 클래스의 인스턴스 변수 접근 불가능

내부 인터페이스

💡
클래스나 다른 인터페이스 내부에 정의된 인터페이스로, 주로 코드를 더욱 잘 조직화하고, 관련된 기능들을 그룹화하기 위해 사용
  • 클래스 내 선언
    • 클래스 내부에 정의
    • 해당 클래스의 멤버처럼 취급되며, 클래스 명을 통해 접근 가능
    // 외부 클래스
    public class OuterClass{
    		// 내부 인터페이스
    		public interface InnerInterface{
    				void performAction();
    		}
    }
  • 인터페이스 내 선언
    • 인터페이스 내에 다른 인터페이스를 정의
    • 관련 인터페이스를 함께 묶어 관리하는데 유용
    // 외부 인터페이스
    public interface OuterInterface{
    		// 내부 인터페이스 
    		interface InnerInterface{
    		}
    }
  • 접근 제한자
    • public, private, protected (+ default)
  • 내부 인터페이스 구현
    • 클래스 내부나 외부에서 구현 가능
    • 관련된 인터페이스들을 함께 묶어 관리하는데 유용
  • 예시
    public class OuterClass {
        // 내부 인터페이스
        public interface InnerInterface {
            void innerMethod();
        }
    
        // 외부 클래스의 멤버 변수
        private int outerVar = 10;
    
        // 내부 인터페이스 구현 클래스
        public class InnerClass implements InnerInterface {
            @Override
            public void innerMethod() {
                System.out.println("InnerMethod() 호출됨");
                System.out.println("OuterVar 값: " + outerVar);
            }
        }
    
        public static void main(String[] args) {
            // 내부 인터페이스 구현 클래스의 인스턴스 생성
            OuterClass.InnerClass inner = new OuterClass().new InnerClass();
            inner.innerMethod(); // InnerMethod() 호출됨
                                 // OuterVar 값: 1

728x90

'JAVA' 카테고리의 다른 글

제네릭  (1) 2024.04.26
java.lang과 java.util 패키지  (0) 2024.04.26
자동 리소드 닫기  (0) 2024.04.25
예외 처리  (1) 2024.04.25
Final  (0) 2024.04.25