옝옹
냠
옝옹
전체 방문자
오늘
어제
  • 분류 전체보기 (84)
    • [LG유플러스]유레카 SW (5)
    • React (20)
    • JS (17)
    • TypeScript (5)
    • CSS & HTML (1)
    • 알고리즘 (11)
    • JAVA (20)
    • GIT (1)
    • 자격증 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 혼자 공부하는 자바
  • TypeScript
  • JavaScript
  • While문
  • Node.js
  • useRef
  • 리액트를다루는기술
  • 함수선언
  • 자바스트립트
  • switch문
  • reduce
  • java
  • fillter
  • match()
  • 접근제한자
  • reverse() 메서드
  • 백준
  • 인스턴스멤버
  • js
  • 자바
  • 타입변환
  • 정적멤버
  • 타입스크립트
  • break문
  • useMemo
  • join() 메서드
  • 자바스크립트
  • map
  • java.lang패키지
  • 코드스플리팅
  • ==
  • map() 함수
  • indexOf()
  • 변수선언
  • toFixed
  • join()
  • 노마드코더
  • useCallback
  • 리액트
  • 화살표함수
  • template literal
  • 템플릿리터럴
  • useEffect
  • useState
  • sort() 메서드
  • java.util패키지
  • 기본api클래스
  • continue문
  • do-while문
  • 혼자공부하는자바

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
옝옹

냠

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

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

2022. 11. 15. 01:15

중첩 클래스

클래스 내부에 선언한 클래스

 

  • 두 클래스의 멤버들을 서로 쉽게 접근 가능
  • 코드의 복잡성을 줄일 수 있음

 

멤버 클래스

클래스의 멤버로서 선언되는 중첩 클래스

로컬 클래스

생성자 또는 메소드 내부에서 선언되는 중첩 클래스

 

- 멤버 클래스는 클래스나 객체가 사용 중이라면 언제든지 재사용이 가능하지만, 로컬 클래스는 메소드를 실행할 때만 사 용되고 메소드가 종료되면 없어진다.

중첩 클래스도 하나의 클래스이기 때문에 컴파일하면 바이트 코드 파일(.class)이 별도로 생성된다.

- 멤버 클래스일 경우

- 로컬 클래스일 경우

인스턴스 멤버 클래스

- static 키워드 없이 중첩 선언된 클래스

- 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언 불가능

정적 멤버 클래스

- static 키워드로 선언된 클래스

- 모든 종류의 필드와 메소드를 선언 가능

- A 클래스 외부에서 정적 멤버 클래스 C의 객체를 생성하기 위해서는 다음과 같이 C객체를 생성하면 된다.

로컬 클래스

- 메소드 내에서 선언할 수 있는 중첩 클래스

- 로컬 클래스는 접근 제한자(public, private) 및 static을 붙일 수 없음

    - 로컬 클래스는 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문

- 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언할 수 있고 정적 필드와 메소드는 선언할 수 없다.

중첩 클래스의 접근 제한

  • 바깥 필드와 메소드에서 사용 제한
    •  인스턴스 멤버 클래스(B)는 바깥 클래스의 인스턴스 필드(field1)의 초기값이나 인스턴스 메소드(method1())에서 객체를 생성할 수 있으나, 정적 필드 (field3)의 초기값이나 정적 메소드(method2())에서는 객체를 생성할 수 없음
    • 정적 멤버 클래스(C)는 모든 필드의 초기값이나 모든 메소드에서 객체를 생성할 수 있습니다.

  • 멤버 클래스에서 사용 제한
    • 인스턴스 멤버 클래스(B)안에서는 바깥 클래스의 모든 필드 와 모든 메소드에 접근할 수 있지만, 정적 멤버 클래스(C)안에서는 바깥 클래스의 정적 필드(field2) 와 메소드(method2())에만 접근할 수 있고 인스턴스 필드(field1)와 메소드(method1())에는 접근할 수 없음  

 

  • 로클 클래스에서 사용 제한
    • 로컬 클래스의 객체는 메소드 실행이 종료되면 없어지는 것이 일반적이지만, 메소드가 종료되어도 계속 실행 상태로 존재 가능
  • 중첩 클래스에서 바깥 클래스 참조 얻기
    •  중첩 클래스 내부에서 ‘this. 필드, this.메소드()’로 호출하면 중첩 클래스의 필드와 메소드가 사용
    •  중첩 클래스 내부에서 바깥 클래스의 필드와 메소드에 접근하기 위해 ‘바깥 클래스.this’를 사용한 예
바깥클래스. this. 필드
바깥클래스. this. 메소드();

중첩 인터페이스

클래스 내부에 선언한 인터페이스

  • 인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 가능
  • 인스턴스 멤버 인터페이스는 바깥 클래스의 객체가 있어야 사용 가능하며, 정적 멤버 인터페이스는 바깥 클래스의 객체 없이 바깥 클래스만으로 바로 접근가능

[확인 문제]

4. (X) → 정적 멤버 클래스안에서는 바깥 클래스의 정적 필드와 정적 메소드에만 접근이 가능하고

              인스턴스 필드와 인스턴스 메소드에는 접근할 수 없다.

 

3. (X) → 로컬 클래스는 메소드 내부에서만 사용되므로 접근 제한자(public, private) 및 static을 붙일 수 없다.

               또한 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.

package yeong.exam04;
public class NestedClassExample { 
    public static void main(String[] args) {
    Car myCar = new Car();
    Car.Tire tire = myCar.new Tire();
    Car.Engine engine = new Car.Engine();
    }
}

 → nickName은 final 특성을 갖기 때문에 4라인에서 값을 변경할 수 없다.

     수정: 3,4 라인을 없애고 대신 String nickName = chatld;를 넣는다

package yeong.exam05;
public class BackgroundChangeListener implements CheckBox.OnSelectListener { 
    @Override
    public void onSelect() {
    	System.out.println("배경을 변경합니다.");
    }
}
저작자표시 비영리 변경금지 (새창열림)

'JAVA' 카테고리의 다른 글

java.lang 패키지  (3) 2022.11.30
익명 객체  (1) 2022.11.15
타입 변환과 다형성  (1) 2022.11.09
인터페이스  (1) 2022.11.09
추상 클래스  (2) 2022.10.31
    'JAVA' 카테고리의 다른 글
    • java.lang 패키지
    • 익명 객체
    • 타입 변환과 다형성
    • 인터페이스
    옝옹
    옝옹

    티스토리툴바