중첩 클래스 / 멤버 클래스/ 로컬 클래스 / 중첩 인터페이스
클래스와 클래스간의 관계
내부에 선언하는..
ㅇㅇㅇ중첩 클래스 (nested class)
class ClassName { class NestedClassName { } } |
: 클래스 내부에 선언한 클래스.
ㄴ클래스간의 멤버들에 서로 쉽게 접근 가능
클래스 내부에 <<선언되는 위치에 따라>>
중첩 클래스는 두 가지로 분류한다.
1. 멤버 클래스 (클래스의 멤버로서 선언된다.)
ㄴa)인스턴스 멤버 클래스
ㄴb)정적 멤버 클래스
2. 로컬 클래스 (생성자 or 메소드 내부에서 선언된다.)
당연히!
멤버 클래스는 -> 클래스나 객체가 사용중이라면 언제든지 재사용 가능.
로컬 클래스는 -> 메소드 실행 중에만 사용되고, 메소드가 종료되면 없어진다.
++중첩클래스 - 멤버클래스 - 인스턴스멤버클래스++
인스턴스 멤버 클래스에는
인스턴스 필드, 메소드만 선언 가능하다
정적 필드, 메소드는 선언 못한다.
A클래스의 멤버로서 선언된 중첩 클래스가 B클래스라고 한다면,
ㅇA클래스 외부에서:
ㄴB객체를 생성하고 싶으면 "먼저 A객체를 생성해야 한다"
A a = new A();
A.B b = a.new B();
b.field1 =3;
b.method1();
ㅇA클래스 내부에서:
ㄴ일반 클래스에서 그냥 하는 것처럼 B객체를 생성할 수 있다.
class A {
class B {...}
void methodA() {
B b = new B();
b.field =3;
b.method1();
}
}
//보통 A클래스 외부에서 B객체를 생성하는 일이 거의 없다고 한다.
대부분 A클래스 내부에서 B객체를 생성해 이용한다.
++중첩클래스 - 멤버클래스 - 정적 멤버 클래스 ++
정적멤버 클래스에는
(인.클에서 인.멤만 선언 가능한 것과는 달리)
인스턴스 멤버, 정적 멤버 모두 선언 가능하다.
정적멤버 클래스에서는
모든 종류의 필드, 메소드 선언할 수 있다.
또한 A클래스 외부에서 정적멤버클래스C의 객체를 생성하고 싶다면
그냥 생성하면 된다!! 그것이 정적멤버니까 끄덕!!
++중첩클래스 - 로컬클래스 ++
!! 로컬 클래스다!!
중첩 클래스는 메소드 안에도 선언이 된다.
앗 잠깐~~>o< 로컬 클래스는 메소드 내부에서만 사용되니까 무슨 접근 제한자로 접근을 제한할 필요가 없다.
-->로컬 클래스에는 public, private과 같은 접근 제한자나 static을 붙일 수가 없다.
로컬 클래스 내부에는
인스턴스 필드, 메소드만 선언할 수 있으며
정적 필드, 메소드는 선언할 수 없다.
메소드에는 정적 선언이 필요 없다.
로컬 클래스는 메소드가 실행될 때
"메소드 안에서 **객체를 생성하고** 사용해야 한다."
그치
로컬 클래스..
비동기 처리를 위해 스레드 객체를 만들 때 사용한다고 하는데..
스레드는 12장에서 배운다.
ㅇ중첩 클래스의 접근 제한
ㄴ멤버 클래스 내부에서 바깥 클래스의 필드와 메소드에 접근할 때는 제한이 따른다.
마찬가지로
메소드의 매개변수나 로컬 변수를 로컬클래스에서 사용할 때에도 제한이 따른다.
바깥꺼를 안(중첩클래스)에서 사용할 때에 제한이 따른다는 것임
바깥에서 안꺼를 사용할 때에도 제한이 있음.
멤버 클래스의
1. 바깥 필드와 메소드에서 사용 제한 (중첩클래스 객체생성 관련)
ㅇ중첩클래스 ㅡ 인스턴스 멤버 클래스는.....
ㄴ밖클래스의 '인스턴스필드 초기값' or '인스턴스 메소드 안' 에서만 객체를 생성할 수 있다.
ㄴ밖클래스의 '정적 필드 초기값' or '정적 메소드 안' 에서 객체를 생성할 수 없다.
ㅇ중첩클래스 ㅡ 정적 멤버 클래스는.....
ㄴ밖클래스의 "모든" 필드 초기값", "모든 메소드"에서 객체를 생성할 수 있다!!
2. 멤버 클래스 안에서 사용 제한 (밖->내부 접근 관련)
ㅇ중첩클래스 ㅡ 인스턴스 멤버 클래스 안에서는.....
ㄴ밖클래스 모든 필드, 메소드에 접근 가능!!!
ㅇ중첩클래스 ㅡ 정적 멤버 클래스 안에서는.....
ㄴ밖클래스의 "정적" 필드, 메소드에만 접근 가능
ㄴ인스턴스 필드, 메소드에는 접근 불가능
1,2 정리 ㅇ정적 멤버 클래스는 밖에서는 자유롭게 객체생성하지만 안에서는.. 밖의 정적 멤버밖에 못 쓴다. ㅇ인스턴스 멤버 클래스는 밖에 인스턴스멤버에다가밖에 객체 생성을 못한다. 하지만 안에서는 정적, 인스턴스 멤버 모두 끌어올 수 있다. "정적 안에는 인스턴스가 들어올 수 없다" "인스턴스는 정적을 받을 수 있다" 라고 머릿속에 저장해두면 편할 것 같다. |
3. 로컬 클래스에서 사용 제한
메소드의 매개 변수, 로컬 변수를 로컬클래스 안에서 사용할 때도 제한이 있다.
+로컬클래스의 객체는 : 보통은 메소드 끝나면 없어지는 게 일반적이지만
메소드가 종료되어도 계속 실행상태로 남아있을 수 있다.
-->예) 로컬 스레드 객체를 사용할 때!
(메소드를 실행하는 스레드와 다르기 때문에, 메소드가 종료된 후에도 로컬스레드객체는 실행상태로 존재할 수 있다 --> 스레드는 12장에서 배운다. 간단히 그렇구나 하구 넘어가자)
--> 이 문제를 해결하기 위해..
컴파일 시 로컬클래스에서 사용하는 매개변수나 로컬 변수의 값을 로컬클래스 내부에 복사해두고 사용한다.
매개변수, 로컬변수가 수정되는 것을 방지하기 위해 final로 선언하라고 한다. (자바 7 이전)
(자바8이후: ) final을 붙이지 않아도 final의 특성을 자동적으로 부여한다.
결국 final인 매개 변수와 로컬 변수만을 허용하는 것이다
중첩 클래스에서 바깥 클래스 참조 얻기
중첩클래스 내부에서 this 키워드는 중첩 클래스의 객체 참조가 된다.
만약 바깥 클래스 객체 참조를 얻고 싶다면
바깥클래스.this.필드
바깥클래스.this.메소드();
따위로 작성하면 된다.
<<중첩클래스에서 바깥 클래스 참조 얻어보자>>
ㅇㅇㅇ중첩 인터페이스 (nested interface)
class A { [static] interface I { void method(); } } |
: 클래스 내부에 선언한 인터페이스
ㄴ해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위함.
ㅡ인스턴스 멤버 인터페이스
ㄴ밖클래스의 객체가 있어야 사용 가능
ㅡ정적 멤버 인터페이스
ㄴ밖클래스 객체 없이 밖클래스만으로 바로 접근 가능!!
ㄴ주로 정적 멤버 인터페이스를 많이 사용한다. UI프로그래밍에서 이벤트를 처리할 목적으로 많이 활용한다고 한다.
예) Button 클릭시 이벤트를 처리하는 객체를 받고 싶다 -> Button 내부에 선언된 중첩 인터페이스를 구현한 객체만 받을 거라고 하자 --> 다음처럼 Button 클래스를 선언하면 된다.
인터페이스 타입 필드 listener,
Setter 메소드를 통해서 이 필드값에 "어떤 인터페이스 구현 객체" 를 넣느냐에 따라서
터치 이벤트 결과가 달라진다.
(터치 메소드 --> 그 인터페이스 구현 객체의 실체메소드를 작동시킨다. listener.onClick() )
확인문제
05.
인터페이스 구현클래스에서 메소드 재정의 할 때
public을 붙여야지 오류가 나지 않았다. 왜 public을 붙여야 하는지 궁금해서 검색해봤다.
아.. 이거 저번에 배운 내용인데 그새 까먹었나보다.. 이렇게 복습하게 되어서 다행이다.
지난번에 학습했던 내용을 검색해봤다.
그렇자나ㅠㅠ
인터페이스 내부의 메소드는 기본적으로 public이고,
구현클래스에서 메소드를 재정의 할 때 public보다 더 낮은 접근제한으로 작성 불가능하다.
그래서 public을 뗄 경우 default로 설정되기 때문에 오류가 났던 것이다.
잊어버리면 안돼 ㅠㅠ
'JAVA' 카테고리의 다른 글
객체지향 프로그래밍 간단한 개념 정리 / 특징 (0) | 2020.07.14 |
---|---|
[2주차] 기본미션 + 선택미션 [혼공단] [혼공자] (0) | 2020.07.14 |
[혼자 공부하는 자바] 7/12 8-2 [타입 변환과 다형성] [인터페이스 상속] (0) | 2020.07.12 |
[혼자 공부하는 자바] 7/11 8-1 [인터페이스] [추상 메소드] [실체 메소드] (0) | 2020.07.11 |
[혼자 공부하는 자바] 7/11 07-3 [추상 클래스] [실체 클래스] [메소드 재정의] (0) | 2020.07.11 |