
Do it! 자바 완전 정복
public class Main {
public static void main(String[] args) {
A a1 = null; // 힙에 아직 아무것도 없고 참조변수가 가르키는 번지수가 아직 없는상태
// 객체를 동적으로 할당해야할 때가 있음. 아직 객체를 생성하지 않고 있다가 추후 동적으로 할당해줘야할 때 사용될 수 있음.
//A a2 = new A(); // 힙에 있는 A객체의 번지수를 참조변수에 할당한 상태
//리소스 수동 해제
try {
a1 = new A("리소스");
} catch (Exception e) {
e.printStackTrace();
} finally {
if(a1.resource != null) {
try {
a1.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 리소스 자동 해제
try(A a2 = new A("리소스")) {
} catch (Exception e) {
e.printStackTrace();
}
}
}
AutoCloseable 인터페이스 구현 부분
class A implements AutoCloseable {
String resource;
A() { // 사용자 생성자를 만들 때 꼭 기본 생성자를 만드는걸 습관화 합시다.
}
A(String resource) {
this.resource = resource;
}
@Override
public void close() throws Exception {
if(resource != null) {
resource = null;
System.out.println("리소스가 해지되었습니다.");
}
}
}
람다식
public class Main {
public static void main(String[] args) {
// type1 익명이너클래스
A a1 = new A() {
@Override
public void abc() {
System.out.println("=====================");
System.out.println("a1 >>> abc() : ");
B b = new B();
b.bcd();
System.out.println("a1 >>> bcd() : ");
System.out.println("=====================");
}
};
// type2 람다식
A a2 = () -> {
System.out.println("----------------------");
System.out.println("a2 >>> abc() : ");
B b = new B();
b.bcd();
System.out.println("a2 >>> bcd() : ");
System.out.println("----------------------");
};
// 인스턴스 참조 type 1 표현
B b = new B();
A a3 = b::bcd;
// 실행
a1.abc();
a2.abc();
a3.abc();
System.out.println("new B() : ");
System.out.println("a1 >>> abc() : ");
System.out.println("a2 >>> abc() : ");
System.out.println("a3 >>> abc() : ");
}
}
interface A {
void abc();
}
class B {
void bcd() {
System.out.println("메서드 bcd");
}
}
A a = B::new이런식으로 참조람다식이 잘 이해가 가지 않는다.