-
중첩 선언과 익명 객체언어/JAVA 2023. 7. 7. 13:53
1. 중첩클래스
- 객체 지향 프로그램에서 클래스간 긴밀한 관계 맺고 상호작용
- 클래스가 여러 클래스와 관계를 맺는 경우 독립 선언
- 특정 클래스와 관계를 맺는 경우에는 중첩 클래스로 선언
-> 유지보수에 도움, 코드 복잡성 줄이기, 클래스 멤버 쉽게 접근
- 크게 멤버클래스(인스턴스,static)와 로컬 클래스로 나눌 수 있다.
1.1 중첩클래스 저장
-outter$inner.class
-A $1 inner.class로 저장됨
2. 멤버클래스 (인스턴스,static)
> 공통점: 접근제한자 public,default,private을 가질 수 있다.
외부클래스 멤버 쉽게 접근 가능, 외부클래스는 내부클래스 멤버에 접근하려면 내부 클래스를 생성해야함
> 차이점
인스턴스 inner : outter클래스의 인스턴스 멤버로 사용된다.
인스턴스 멤버가 적용받는 규칙 동일 적용(인스턴스 필드,메서드,생성자에서만 자유롭게 생성)
외부 클래스의 모든 멤버와 메서드에 접근할 수 있다(단, 클래스 외부에서는 외부가 생성되야, inner생성가능)
일반적으로 private으로 생성
내부에 정적 멤버와 필드 가질 수 없다.
(JDK 17이후 가능)
static inner : outter클래스의 static 멤버로 사용된다.
static 멤버가 적용받는 규칙 동일 적용(외부 클래스 어디던 자유롭게 생성)
외부 클래스의 정적멤버와 메서드만 자유롭게 사용할 수 있다.
일반적으로 public으로 생성
내부에 정적필드와 메서드 만들 수 있다.
3. 로컬 클래스
-특정 메서드 내부에서 선언되고 사용되는 클래스
-생성자나 메서드가 실행되는 동안에만 객체 생성가능
- 로컬클래스에서 로컬변수(매개변수, 지역변수)를 사용할 경우 로컬변수는 final로 바뀜 이는 로컬 클래스 내부에서
지역변수의 값을 변경하지 못하도록 막기 위함이다.
4. 중첩인터페이스
- 클래스의 멤버로 선언된 인터페이스, 혹은 인터페이스 내부에 인터페이스를 의미한다.
- 클래스 내부에 인터페이스를 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 객체를 만들기 위함이다.
(인터페이스가 해당 클래스에서 사용하는 것 외에 딱히 쓰임이 없을 때 정도)
- 인터페이스 내부에 인터페이스를 선언하는 이유는 그냥 관련 인터페이스끼리 정리하는 용도이다.
- public이나 private을 붙일 수 있다.
- 기본적으로 static임 내부 인터페이스는 따라서 객체 생성없이 항상 접근할 수 있다.
public class Button{ public interface ClickListener{ void onClick(); } private ClickListener clicks; public void setClickListener(ClickListenr clicks){ this.clicks = clicks; } public void click(){ this.clicks.onClick(); } } // 내부에 인터페이스 정의한 클래스 public class BuEx { public static void main(String[] args){ Button bu = new Button(); Button.ClickListen ck = Button.ClickListen{ void Click(){ //구현} } Button.ClickListen cks = Button.ClickListen{ void Click(){ //구현} } bu.setClickListen(ck); bu.setClickListen(cks); //위와같이 인터페이스 셋팅 가능 Button과 긴밀한 관계가 있을 뿐 인터페이스 사용법은 다를게 없음 } }
5. 익명객체
- 이름이 없는 객체를 말한다.
- 주로 필드값, 로컬 변수값, 매개변수 값으로 사용된다.
-익명 객체는 클래스를 상속하거나 인터페이스를 구현해야만 생성할 수 있다. (익명 자식, 익명 구현)
> 익명 자식 객체
- 부모타입참조변수에 대입가능
- 중괄호 안에는 중괄호 안에서만 사용할 수 있는 익명 자식 객체의 멤버가 온다.
(부모 참조변수로 어차피 자식만의 멤버와 메서드 접근 불가)
- 상속이므로, 부모타입에 접근 가능 보통 익명자식객체는 부모 메서드를 재정의하는 코드가 온다.
> 익명 구현 객체
- 인터페이스형 참조변수에 들어갈 수 있다.
- 추상메서드 정의하는 코드가 온다.
'언어 > JAVA' 카테고리의 다른 글
컬렉션 (0) 2023.07.09 어노테이션 (0) 2023.07.08 상속,동적생성 (0) 2023.07.06 클래스,인스턴스 메서드 메모리 저장,싱글톤,접근제한자 (0) 2023.07.06 참조타입,메모리,배열복사 (0) 2023.07.06