[JAVA]객체지향(10): 팩토리 메소드 패턴, 람다식

ho's·2022년 4월 17일
0
post-custom-banner

위 글은 김성박선생님의 자바 강의를 바탕으로 쓰여졌습니다.
더 자세한 내용은 아래 링크를 통해 알아보실 수 있습니다.

부부개발단 유투브


팩토리 메소드 패턴

  • 공장이 하는일은?
  • 복잡한 생산 과정을 숨기고, 완성된 인스턴스만 반환한다.

지난 시간 배운, 싱글톤에 대해

저번 시간에 우리는 BeanFactory 클래스에서 싱글톤을 이용해 객체를 만들어 보았다. 내용이 생각 안날 수 있으니 다시 한번 보자.


위와 같이 객체를 2개 생성하지 않고 하나의 객체를 이용해 bf1, bf2를 만들었다.

BeanFactory를 이용해 객체를 생성하기

BeanFactory 클래스에서 Bus()를 호출하는 getBus() 메소드를 만든다.

보통 Bus 객체를 만들때와 같이 직접 객체를 생성했었다.

Bus b3 = new Bus(); 

하지만 위의 코드는 생성과정을 BeanFactory를 통해 객체를 대신 생성해주고 있다.

클래스 로더를 이용한 인스턴스 생성하기

Class clazz = Class.forName("클래스 풀네임");
Object obj = clazz.newInstance();

지금까지 메소드를 실행시키기 위해서는 메인 메소드에서, 객체를 생성하고 객체명.메소드명() 과 같은 방법으로 호출을 했었다.

아래와 같은 상황에 처해 있다고 생각해보자.

  • a() 메소드를 가지고 있는 클래스가 있다.
  • 이 클래스 이름이 아직 무엇인지 모르겠다.
  • 나중에 이 클래스 이름을 알려주겠다.
  • a()메소드를 실행하도록 작성해라!

String className = "~~";

클래스의 경로를 작성한다

Class clazz = Class.forName(className);

Class.forName은 className을 CLASSPATH에서 읽어 들인 후, clazz에 저장한다.
Method[] declaredMethods = clazz.getdeclaredMethods();
-> clazz가 가지고 있는 메소드들의 정보들을 Method[] 배열에 저장한다.

for(Method m : declaredMethods){
	System.out.println(m.getName());}

declaredMethods의 메소드 이름을 출력한다.

인스턴스 만드는 다양한 방법

메소드 이름을 이용해 실행 시키기

MyHome 클래스 a() 메소드를 가지고 있다.

Object타입의 객체 o를 생성한 후,

Method m = clazz.getDeclaredMethod("a",null);
clazz가 가지고 있는, a의 메소드가 어떠한 정보를 갖고 있는지 m에 저장된다.

m.invoke(o, null);
m을 실행시켜라, 실행시키기 위해서는 인스턴스가 필요하다.
위에서 o 인스턴스를 만들었고 사용하자.

즉 객체 o가 참조하는 객체 m의 메소드를 실행하라.

이를 통해서, 문자열로 된 클래스와 메소드 이름만 갖고 있어도 표현할 수 있는 방법이 있다는 것을 알자

이름없는 클래스(Anonymous Class)

  • new 생성자(){...}
  • 생성자 뒤에 중괄호가 나오고 코드를 오버라이딩하여 보통 구현한다.
Car car = new Car(){
	public void run(){
    	System.out.println("Car를 상속받는 이름 없는 객체가 run메소드를 오버라이딩함")
    }
}


위의 사진과 같이 추상클래스 Car를 만들고, CarExam클래스에서 Car를 참조하는 객체를 만드려고 한다면, 오류가 발생한다.
Car는 추상클래스이기 때문에 인스턴스가 될 수 없다.
오류를 해결하고 싶으면 추상클래스를 상속받고 있는 클래스를 인스턴스화 해야한다.

Car를 상속받고있긴 한데, 클래스를 만들고 싶지 않으려면 어떻게 해야할까

Car c1 = new Car(){
	@Override
    public void a(){
    	System.out.println("이름없는 객체 a()메소드 오버라이딩);
    }
};
c1.a();
}

인터페이스 예제

생성하자마자 바로 넣어주기

람다식으로 바꾸기

람다 인터페이스 - 메소드를 하나만 가지고있는 인터페이스

  • 람다(lambda) interface는 메소드를 한개 가지고 있다.

  • 람다 인터페이스를 사용하는 람다 표현식은 JDK8에서 추가되었다.

  • JDK8에 추가된 이러한 문법들을 사용할 때 보통 모던 자바라고 한다.

    이름없는 객체는 보통 한번만 사용하고 쓸모 없을때 사용한다.

profile
그래야만 한다
post-custom-banner

0개의 댓글