람다로 가는 길목으로서 네스티드 클래스와 이너 클래스에 대한 강의였다.
자바의 람다랑 파이썬의 람다가 비슷한 개념이면 좋겠다. 비슷하다면 이해하는데 도움이 될테니까.
어쨋든 네스티드 클래스에 대해서 정리해본다.
네스티드 클래스(Nested Class)
- 네스티드 클래스란 클래스 내부에 정의된 클래스이다.
- 2가지 종류의 네스티드 클래스가 있다.
- Static Nested Class
- Inner Class(Non-Static Nested Class)
Static 네스티드 클래스
- Static 키워드를 사용한 선언의 특성이 반영되는 네스티드 클래스, 외부 클래스와 상관없이 인스턴스를 생성할 수 있다.
- 외부 클래스의 Static 변수에 대한 직접 접근이 허가된다.
- private 접근 지정자로 Static 변수에 대한 접근을 특정할 수 있다.
Non-Static 네스티드 클래스 (이너 클래스)
- Non-Static 네스티드 클래스, 즉 이너 클래스는 3가지 종류로 나뉜다.
- 멤버 클래스
- 멤버 클래스의 인스턴스는 외부 클래스의 인스턴스에 종속된다.
- 외부 클래스 인스턴스의 속성을 내부 클래스의 인스턴스간에 공유가 가능하다.
- 멤버 클래스는 클래스 정의를 감출 때 유용하게 사용된다. -> 클래스 수정이 진행되어도 사용법에는 변화가 없다.
- 반복자(Iterator)가 대표적인 멤버 클래스의 예시
class Outer {
private int num = 0;
class Member {
void add(int n) {num += n;}
int get() { return num;}
}
}
public class Main {
public static void main(String[] args) {
Outer o1 = new Outer();
Outer.Member o1m1 = o1.new Member(); //멤버 클래스 인스턴스의 선언 방법
Outer.Member o1m2 = o1.new Member();
o1m1.add(10); //o1m1 인스턴스에서 o1 인스턴스의 num 변수에 접근 후 값 저장
System.out.println(o1m2.get()); //o1m2 인스턴스에서 o1 인스턴스의 num 변수에 접근 후 값 반환
}
}
- 로컬 클래스
- 멤버 클래스와 특성의 상당부분을 공휴한다.
- 외부 클래스의 메소드 내부에 정의되어 해당 메소드에서만 사용된다.
interface Hello {
void say();
}
class Greet {
private String sentence;
public Greet(String s) { sentence = s; }
public Hello speak() { //클래스 내부의 메소드
class speakHello implements Hello { //메소드 안에 클래스를 정의하는 것이 로컬 클래스
public void say() {
System.out.println(sentence);
}
}
return new speakHello();
}
}
public class Main {
public static void main(String[] args) {
Greet gt = new Greet("Hello World!");
Hello hl = gt.speak();
hl.say();
}
}
- 익명 클래스
- 로컬 클래스의 정의를 더욱 단순화한 형태를 가진다.
- 자바 람다식의 선행조건
class Greet {
...
public Hello speak() { //위의 로컬 클래스를 익명 클래스로 변경
return new Hello() {
public void say() {
System.out.println(sentence);
}
};
}
}
'프로그래밍 > Java' 카테고리의 다른 글
Java - 열거형과 가변인자, 어노테이션 (0) | 2020.10.14 |
---|---|
Java - Collection (2) (0) | 2020.10.09 |
Java - Collections (1) (0) | 2020.10.09 |
Java - 제네릭 (2) (0) | 2020.09.27 |
Java - 제네릭 (1) (0) | 2020.09.22 |