우주코딩
인터페이스 구현하는 두가지 케이스, 패키지에 직접 소속된 클래스, 중첩 클래스, inner 클래스 본문
인터페이스 구현하는 두가지 케이스
인터페이스를 미리 구현한 추상 클래스를 만든다 (간접 구현)
추상클래스에서 구현하지 않은 인터페이스 규칙은 추상메서드로 남아있기 때문에 이를 상속받은 클래스에서 추상메서드로 남아있는 인터페이스를 구현해야한다.
서브클래스에서 특성에 맞게 오버라이딩 해야하는 메서드는 추상클래스에서 구현하지 않는다.인터페이스를 오버라이딩 한 클래스를 만든다 (직접 구현)
패키지에 직접 소속된 클래스
"Top Level Class" = 패키지 멤버 클래스
top level class의 접근제한자
- public : 다른 패키지에서도 접근 가능
- (package-private; modifier 가 없다) : 다른 패키지 접근 불가!
같은 패키지의 클래스를 사용할 때는 패키지 명을 생략할 수 있다.
중첩 클래스
중첩 클래스
=> 특정 클래스 안에서만 사용되는 클래스가 있다면 중첩 클래스로 선언하라. 노출 범위를 좁히는 것이 유지보수에 좋다.
1) static nested class
바깥 클래스의 인스턴스에 종속되지 않는 클래스.
top level class 와 동일하게 사용한다.
static class A {}
2) non-static nested class = inner class
바깥 클래스의 인스턴스에 종속되는 클래스.
중첩 클래스에서 바깥 클래스의 인스턴스 멤버를 사용한다는 뜻이다.
바깥 클래스의 인스턴스 없이 작업할 수 없는 경우 중첩 클래스를 non-static nested class 로 정의한다.
바깥 클래스의 인스턴스 없이 생성할 수 없다.
class B {}
3) local class
특정 메서드 안에서만 사용되는 클래스.
main(
class C {}
)
%% 중첩 클래스도 클래스의 멤버이기 때문에 필드나 메서드처럼 접근 제한자를 붙일 수 있다. %%
static nested class : 클래스 정의와 인스턴스 생성
class A {
static class X {
}
}
public class Exam0110 {
public static void main(String[] args) {
// 레퍼런스 선언
A.X obj;
// A - 바깥클래스
// X - 중첩클래스
// 인스턴스 생성
obj = new A.X();
}
}
inner 클래스의 정의
class A {
class X {
}
}
public class Exam0110 {
public static void main(String[] args) {
// 레퍼런스 선언
A.X obj;
// 인스턴스 생성
// obj = new A.X(); // 컴파일 오류!
//1) 바깥 클래스의 인스턴스 준비
A outer = null;//new A();
//2) 바깥 클래스의 인스턴스 주소를 사용하여 inner class의 인스턴스 생성
obj = outer.new X();
}
}
inner 클래스 선언
class A2 {
class X {
int v2;
void m2() {}
{}
}
}
public class Exam0111 {
public static void main(String[] args) {
// 바깥 클래스의 인스턴스를 먼저 만든 다음에
// inner 클래스의 인스턴스를 만든다.
A2 outer = new A2();
A2.X obj = outer.new X();
// 물론 다음과 같이 위의 두 줄을 한 줄로 표현할 수 있다.
A2.X obj2 = new A2().new X();
}
}
inner 클래스의 특징
inner class 의 가장 큰 특징은 바깥 클래스의 다른 멤버에 손쉽게 접근할 수 있다는 것이다.
=> 이것이 가능한 이유는 바깥 클래스의 인스턴스 멤버이기 때문이다.
class B{
static int v1 = 100;
static void m1() {};
int v2 = 200;
int v3 = 300;
void m2() {};
}
class X {
int v3 = 300;
void test(){
B.v1; // 접근 가능
B.m1; // 접근 가능
v1; // 바깥 클래스 이름 생략 가능
v2; // 바깥 클래스 이름 생략 가능
m2(); // 바깥 클래스 이름 생략 가능
int v2 = 2000; // 로컬 클래스
B.this.v2; //인스턴스 멤버에 접근 가능, 바깥클래스명.this.인스턴스멤버명
B.this.v3; // 바깥 클래스의 인스턴스
v2; // this를 생략하면 가장 가까운 곳 부터 찾는다 test() 메서드의 로컬변수를 가리킨다.
v3; // X클래스의 인스턴스 변수
}
}
inner class 는 스태틱 멤버를 가질 수 없다.
스태틱 멤버는 오직 top level class 나 static nested class 만이 가질 수 있다.
'자바 본 강의' 카테고리의 다른 글
익명 클래스, 익명 클래스의 생성자 호출 (0) | 2021.08.17 |
---|---|
inner 클래스 사용, 클래스 import, 로컬 클래스, 로컬 클래스와 로컬 변수 (0) | 2021.08.17 |
메서드 명칭, 인터페이스와 추상클래스의 콜라보, default 메서드의 필요성, 인터페이스의 static 메서드, 인터페이스와 추상클래스의 상속 (0) | 2021.08.13 |
인터페이스 상속 (0) | 2021.08.12 |
인터페이스 정의, 구현하기 , default 메서드, private & static 메서드 (0) | 2021.08.12 |