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