Nested class, 즉 중첩 클래스라 한다.Nested class의 static 여부에 따라 Static, Non-static Nested class로 나뉜다.Nested class가 Inner class이다.참고
멤버 클래스 : 인스턴스 변수, 인스턴스 메서드와 동일한 위치에 정의
로컬 클래스 : 중괄호 내, 특히 메서드 내에 정의
ex)
class Outer {
class MemberInner {} // 멤버 클래스
void method() {} // 로컬 클래스
}
getter 등으로 외부에서 interface, (즉 메시지를 보낸다.. 정도) 할 수 있게 된다면 getter에서 반환하는 인스턴스가 다른 클래스의 인스턴스로 변경되어도, 외부에선 코드를 전혀 수정할 필요가 없게 된다.Iterator<E> interface를 알고 있다List 등에도 Iterator를 구현한 어떤 멤버 클래스의 정의는 감추어져 있으며 그저 우리는 컬렉션의 반복자라는 것만 알면 된다.Iterator를 implement한 인스턴스를 제공만 받아 사용하면 되기 때문이다.참고
List에서 iterator()의 인스턴스 클래스의 이름은Itr이다.
참고
간단하게 OOP에서 중요한 점은 캡슐화(encapsulation)이라는 것은 누구나 다 알고 있는 사실이다.
이는 무조건적으로 모든 걸 감추는게 아니라, 사용자에게 제공되는 공개 인터페이스는 누가 봐도 그 기능, 그 책임만을 확실히 하나만 할 수 있도록 하고, 외부에는 최대한 감추는게 호출하는 사용자 입장에선 좋다.
왜냐하면, 언젠간 그 공개 인터페이스를 수정함으로써 오는 유지보수를 최소화 하기 위함이다. (여러가지 이유가 더 있겠다..)
간단한 예제를 보고 가자.
import java.util.*;
class StrComp implements Comparator<String> {
@override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
class Anonymous {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("ABC");
list.add("AB");
list.add("A");
Comparator cmp = new StrComp();
Collections.sort(list, cmp);
System.out.println(list);
// => 결과 : A, AB, ABC
}
}
Comparator interface에는 추상 메서드가 하나 뿐인데, Comparator를 implements 받은 인스턴스 클래스를 장황하게 만들어 sort() 메서드에 던져 줄 필요가 없다. 그래서 바로 인스턴스 생성과 동시에 구현하여 할당시켜 준다.import java.util.*;
class Anonymous {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("ABC");
list.add("AB");
list.add("A");
Comparator<String> cmp = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
};
Collections.sort(list, cmp);
System.out.println(list);
// => 결과 : A, AB, ABC
}
}
{} 중괄호 내에 포함된 블럭이, 익명 클래스라 한다.
new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
};
Comparator interface에 메서드가 하나인데, 저렇게 길게 적을 필요가 있나?import java.util.*;
class Anonymous {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("ABC");
list.add("AB");
list.add("A");
Comparator<String> cmp = (s1, s2) -> s1.length() - s2.length();
Collections.sort(list, cmp);
System.out.println(list);
// => 결과 : A, AB, ABC
}
}
class Anonymous {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("ABC");
list.add("AB");
list.add("A");
Collections.sort(list, (s1, s2) -> s1.length() - s2.length());
System.out.println(list);
// => 결과 : A, AB, ABC
}
}