네스티드 클래스와 람다의 소개에 대해 간략히 정리 해보자.
알 필요가 있는 부분이지만 강제로 기억 할 필요가 없는 부분이다.
class Outer { // 외부 클래스
class Nested {...} // 네스티드 클래스
}
class OuterClass {
static class StaticNestedClass {...} // Static 네스티드 클래스
}
class OuterClass {
class InnerCLass {...} // Non-Static 네스티드 클래스, 이너 클래스
}
네스티드 클래스는 두 가지로 분류가 된다.
또한 이너 클래스는 세 가지로 분류가 된다.
Class Outer {
private static int num = 0;
static class Nested1 { // **Static 네스티드 클래스**
void add(int n) {
num+=n; // **Outer 클래스의 static 변수 공유!**
}
}
static class Nested2 { // **Static 네스티드 클래스**
int get() {
return num; // **Outer 클래스의 static 변수 공유!**
}
}
} // Outer
class StaticNested {
public static void main(String[] args) {
Outer.Nested1 nst1 = new Outer.Nested1(); // 인스턴스 생성 방법!
nst1.add(5);
Outer.Nested2 nst2 = new Outer.Nested2();
System.out.println(nst2.get());
}
}
5
우선 들어가기에 앞서 내부 클래스(이너 클래스-Inner Class)는 Static Nested 클래스와는 다른 클래스로 바라봐야 한다.
맴버 클래스 (Member Class)
로컬 클래스 (Local Class)
익명 클래스 (Anonymous Class)
class Outer {
class MemberInner {
... // 맴버 클래스
}
void method() {
class LocalInner {
... // 로컬 클래스
}
}
}
class Outer {
private int num = 0;
class Member { // 내부 클래스 혹은 이너 클래스 -> Class 내에 선언된 클래스
void add(int n) { num+=n;}
int get() {return num;}
}
// 맴버 클래스의 인스턴스는 외부 클래스의 인스턴스에 종속적이다.
}
class MemberInner {
public static void main(String[]args) {
Outer o1 = new Outer();
Outer o2 = new Outer();
// o1 기반으로 두 인스턴스 생성
Outer.Member o1m1 = o1.new Member();
Outer.Member o1m2 = o1.new Member();
// o2 기반으로 두 인스턴스 생성
Outer.Member o2m1 = o2.new Member();
Outer.Member o2m2 = o2.new Member();
// o1 기반으로 생성된 두 인스턴스의 메소드 호출
o1m1.add(5);
System.out.println(o1m2.get());
// o2 기반으로 생성된 두 인스턴스의 메소드 호출
o2m1.add(5);
System.out.println(o2m2.get());
}
}
5
7
interface Printable {
void print();
}
class Papers {
private String con;
public Papers(String s) {
con = s;
}
public Printable getPrinter() { // Printer를 반환형으로 넘겨줘도 상관 없다.
return new Printer();
}
// Paper Class 안에 Printer 클래스를 감춘 상태.
private class Printer implements Printable {
public void print() {
System.out.println(con);
}
}
}
public static void main(String[] args) {
Papers p = new Papers("서류 내용 : 행복합니다.");
Printable prn = p.getPrinter();
prn.print();
}
interface Printable {
void print();
}
class Papers {
private String con;
public Papers(String s) {
con = s;
}
public Printable getPrinter() {
class Printer implements Printable {
public void print() {
System.out.println(con);
}
}
// 감췄어! 더 깊이 감췄어!! 메소드 안으로**
return new Printer();
}
}
public static void main(String[] args) {
Papers p = new Papers("서류 내용 : 행복합니다.");
Printable prn = p.getPrinter();
prn.print();
}
서류 내용 : 행복합니다.
public Printable getPrinter() {
class Printer implements Printable { // 로컬 클래스의 Printer의 정의
public void print() {
System.out.println(con);
}
}
return new Printer(); // Printer 인스턴스 생성
}
------------------------> 변경 후
public Printable getPrinter() {
return new Printable() { // 익명 클래스의 정의와 인스턴스 생성
public void print() {
System.out.println(con);
}
};
}
Javascript에서 사용한 ES6 문법 화살표 함수와 유사, 람다식과 유사하다
Printable Interface를 구현한 클래스의 인스턴스를 너가 컴파일 해줘~~~!
public void print()의 출처가 어디인지 알려주는 것 → return new Printable();
new Printable() : Printable Interface를 구현한 클래스의 인스턴스를 생성 해라.
그런데 위 인스턴스 안에는 아래 메소드의 정의를 담아라.
public void print() {
System.out.println(con);
}
람다의 기본 골격은 익명 클래스를 기반으로 만들어진다 봐도 무방하다, 지금부터 람다에 대해 정리 해보자.
interface Printable {
void print(String s);
}
class Lamda01 {
public static void main(String[] args) {
Printable prn = new Printable() { // 익명 클래스
public void print(Stirng s) {
System.out.println(s);
}
};
prn.print("What is Lamda?");
}
}
interface Printable {
void print(String s);
}
class Lamda01 {
public static void main(String[] args) {
Printable prn = new Printable() { // 익명 클래스
public void print(Stirng s) {
System.out.println(s);
}
};
prn.print("What is Lamda?");
}
}
-------------------------> 변경 후
interface Printable {
void print(String s);
}
class Lamda01 {
public static void main(String[] args) {
Printable prn = (s) -> { System.out.println(s); } // Lamda -> 화살표 함수 똑같음.
prn.print("What is Lambda?");
}
}
위에서도 말했지만 Javascript ES6 문법 화살표 함수와 똑같다.
Javascript ES6 문법 내 포함되어 있는 화살표 함수
// 일반 함수
var foo = function () { console.log("foo") }; // foo
// 화살표 함수
var bar = () => console.log("bar"); // bar