생성자
인스턴스를 생성할 때 사용한다.
어떤 값을 가지고 인스턴스가 만들어지게 하고 싶다면 생성자를 사용한다.
클래스 작성시 생성자를 하나도 만들지 않았다면 자동으로 기본 생성자가 생성된다.
기본 생성자는 매개 변수를 하나도 받지 않는 생성자를 말한다.
추상 클래스
템플릿 메소드 패턴으로 배우는 추상 클래스
EX. 상황 : 초기화와 마무리 코드는 그대로, 실행 코드는 변경 가능하도록 하는 상황
public abstract class Car {
protected final void init(){ //추상 X : 항상 그대로, 오버라이딩 불가
System.out.println("초기화하는 코드");
}
protected abstract run(){}; 추상 O : 자식이 무조건 오버라이딩 해서 사용
protected final close(){ //추상 X : 항상 그대로, 오버라이딩 불가
System.out.println("마무리하는 코드");
}
//(템플릿 메소드)
public void execute(){
this.init();
this.run();
this.close();
}
}
public class Bus extends Car{
@Override
run(){
println("별도로 동작하는 코드 후륜구동");
}
}
main 메서드 {
Car c = new Bus();
c.execute();
}
final 클래스, 불변객체 String
pulbic final class 클래스명{...}접근 제한자

인터페이스
무슨 기능을 만들어야 할까 VS 구현부터 하기
-> 어떤 기능을 만들어야 할지부터 고민한다. 만들어야 할 기능들을 관련된 것끼리 묶은 후 이름을 지어준다. 기능 이름이 인터페이스다!
EX. public interface 인터페이스이름 {...}
인터페이스의 default method (JDK 8에 추가된 메소드)
인터페이스의 static method (JDK 8에 추가된 메소드)
팩토리 메소드 패턴과 Java Reflection
팩토리 메소드 패턴
→ SOLID의 OCP 개방-폐쇄 원칙, DIP 의존 관계 역전 원칙을 지키는 방법
클래스 로더를 이용한 인스턴스 생성하기
Class clazz = Class.forName("클래스풀네임");
Object obj = clazz.newInstance();
익명클래스와 처음 만나는 람다
이름 없는 클래스 (Anonymous Class)
→ 형태 : new 생성자(){...}
→ 추상 클래스의 자식 클래스로 오버라이딩 하여 구현하는 것이 아니라, 생성자 뒤에 중괄호가 나오고 코드를 오버라이딩 하여 보통 구현한다.
Car car = new Car(){
Public void run(){
System.out.println("Car를 상속 받는 이름 없는 객체가 run메소드를 오버라이딩함");
람다(Lambda) 인터페이스
: 메소드를 하나만 가지고 있는 인터페이스
→ 이름 없는 객체를 만들어서 전달 할 수 있다.
→ 람다 interface는 메소드를 한개 가지고 있다.
→ 람다 인터페이스를 사용하는 람다 표현식은 JDK 8에서 추가되었다.
→ JDK 8에 추가된 이러한 문법들을 사용할 때 보통 모던 자바라고 한다.
→ 나중에 Stream API와 엮여서 쓰이면 편리하게 코드를 작성할 수 있다.
< MyRunnable interface >
public interface MyRunnable {
public void run();
}
< RunnableExecute class >
public class RunnableExecute {
public void execute(MyRunnable myrunnable){
myrunnable.run();
}
}
< Main >
public class MyRunnableMain {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable() {
@Override
public void run() {
System.out.println("Hello!!!!");
}
};
RunnableExecute runnableExecute = new RunnableExecute();
runnableExecute.execute(myRunnable);
}
}
< 람다를 사용한 같은 결과 코드 >
public class MyRunnableMain {
public static void main(String[] args) {
RunnableExecute runnableExecute = new RunnableExecute();
runnableExecute.execute(() -> {
System.out.println("Hello!!!!");
}
);
}
}
이런 유용한 정보를 나눠주셔서 감사합니다.