@Eeap
velog
@Eeap
전체 방문자
오늘
어제
  • 전체 (168)
    • osam (1)
    • Cloud (21)
      • Docker (2)
      • AWS (13)
    • AI & Data (7)
    • Algorithm (76)
      • Baekjoon (75)
      • Codeforces (1)
    • Language (18)
      • Java (18)
    • Back-end (17)
      • Spring (3)
      • JSP & Servlet (12)
      • Go (2)
    • 일상 (4)
    • 기타 (8)
    • git (1)
    • Infra (9)
      • Apache Kafka (5)
      • Kubernetes (4)
      • 기타 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • flink
  • SageMaker
  • 심폴릭링크
  • knowledge bases
  • Agent
  • bedrock
  • 인터페이스
  • AWS CodeArtifact
  • AWS CodeStar
  • 오블완
  • converse api
  • invokemodel api
  • 티스토리챌린지
  • CLASS
  • sagemaker unified studio
  • Python
  • bedrock agent
  • AWS CodeCatalyst
  • bedrock api
  • java

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
@Eeap

velog

Language/Java

Java 중첩 클래스와 중첩 인터페이스

2022. 6. 11. 20:06
반응형
중첩 클래스란?

클래스 내부에 선언된 클래스로서 바깥 클래스와 긴밀한 관계를 가지며 바깥 클래스가 없으면 필요없는 클래스이다.

중첩 클래스의 종류는 크게 멤버 클래스와 로컬 클래스로 나눌 수 있다.

멤버 클래스의 경우 클래스의 멤버로서 선언되고 멤버 클래스는 다시 인스턴스와 정적으로 나뉠 수 있다.

class Main{
 class Sub{} // 인스턴스
 static class Sub2{} //정적
}

인스턴스 멤버 클래스의 경우 정적 필드와 메소드는 선언할 수 없고 인스턴스 필드와 메소드만 선언이 가능하다.

public class Main{
 class Sub{
  Sub(){}
  int cnt; //static 사용 불가
  void test(){} //마찬가지로 static 사용 불가
 }
}

public class Main{
 class Sub{}
 void test(){ // Main 클래스의 void도 static이 아닐때만 이렇게 내부에서 중첩 클래스를 사용할 수 있음 
  Sub sub = new Sub();
  sub.cnt = 1;
  sub.test();
 }
}

//Sub 클래스 사용법
Main m = new Main();
Main.Sub s = m.new Sub();

정적 멤버 클래스는 인스턴스 멤버 클래스와 달리 Main 클래스가 선언이 안되도 Sub 클래스를 사용할 수 있다.

public class Main{
 static class Sub{
  Sub(){}
  int cnt;
  static int cnt2;
  void test(){}
  static void test1(){}
 }
}

//Sub 클래스 사용법
Main.Sub s = new Main.Sub();
s.cnt1=1;
s.test();
Main.Sub.cnt2 = 1; //Sub 클래스 선언없이 cnt2에 접근
Main.Sub.test1();

위처럼 Sub클래스의 static 필드와 메소드도 Sub 클래스의 선언없이 접근이 가능하다.

 

로컬 클래스의 경우 생성자 또는 메소드 내부에서 선언되고 생성자나 메소드가 실행될 때만 사용이 된다.

앞선 멤버클래스처럼 접근 제한자인 private이나 static을 붙일 수 없고 따라서 정적 필드와 메소드도 선언이 불가능하다.

public class Main{
 void mtd(){
  class Sub{
   Sub(){}
   int cnt;
   //static int cnt2;
   void test(){}
   //static void test1(){}
  }
  // 로컬 클래스의 경우엔 함수 내에서 바로 사용해야함
  Sub s = new Sub()
  s.cnt = 1;
  s.test();
 }
}

위처럼 로컬 클래스의 경우엔 메소드 내에서 만들고 바로 사용해야한다.

또한, 로컬 클래스에서 메소드의 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 때 그 매개변수와 로컬 변수는 final 특성을 갖는다(즉, 수정이 불가능한 값임)

public class Main{
 int cnt=1;
 void test(){}
 void mtd(int i){
  int j =1;
  class Sub{
   int cnt=1;
   public void test(){ int res = i+j;}
   void p(){
    System.out.println(Main.this.cnt) //바깥 클래스 cnt
    Main.this.test(); // 바깥클래스 test
   }
  }
 }
}

추가적으로 중첩 클래스 내에서 바깥 클래스를 쓰기 위해서는 this 수식어를 쓰면된다.

ex ) 바깥클래스.this.field(or method)

 

중첩 인터페이스란?

클래스 내부에 선언된 인터페이스로서 중첩 클래스와 마찬가지로 바깥 클래스와 긴밀한 관계를 갖는다.

public class Main {
 [static] interface Sub {
  void test();
 }
}

중첩 인터페이스는 주로 UI프로그래밍에서 이벤트 처리 목적으로 자주 활용하기도 한다.(버튼 기능을 구현할 때)

반응형
저작자표시 (새창열림)

'Language > Java' 카테고리의 다른 글

Java 예외 클래스  (0) 2022.06.12
Java 익명 객체  (0) 2022.06.12
Java 타입 변환과 다형성  (0) 2022.06.06
Java 인터페이스  (0) 2022.05.30
Java 추상클래스  (0) 2022.05.30
    'Language/Java' 카테고리의 다른 글
    • Java 예외 클래스
    • Java 익명 객체
    • Java 타입 변환과 다형성
    • Java 인터페이스
    @Eeap
    @Eeap

    티스토리툴바