위 글은 김성박선생님의 자바 강의를 바탕으로 쓰여졌습니다.
더 자세한 내용은 아래 링크를 통해 알아보실 수 있습니다.
지난 시간 배운, 싱글톤에 대해
저번 시간에 우리는 BeanFactory 클래스에서 싱글톤을 이용해 객체를 만들어 보았다. 내용이 생각 안날 수 있으니 다시 한번 보자.
위와 같이 객체를 2개 생성하지 않고 하나의 객체를 이용해 bf1, bf2를 만들었다.
BeanFactory를 이용해 객체를 생성하기
BeanFactory 클래스에서 Bus()를 호출하는 getBus() 메소드를 만든다.
보통 Bus 객체를 만들때와 같이 직접 객체를 생성했었다.
Bus b3 = new Bus();
하지만 위의 코드는 생성과정을 BeanFactory를 통해 객체를 대신 생성해주고 있다.
클래스 로더를 이용한 인스턴스 생성하기
Class clazz = Class.forName("클래스 풀네임");
Object obj = clazz.newInstance();
지금까지 메소드를 실행시키기 위해서는 메인 메소드에서, 객체를 생성하고 객체명.메소드명() 과 같은 방법으로 호출을 했었다.
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 c1 = new Car(){
@Override
public void a(){
System.out.println("이름없는 객체 a()메소드 오버라이딩);
}
};
c1.a();
}
인터페이스 예제
람다 인터페이스 - 메소드를 하나만 가지고있는 인터페이스
람다(lambda) interface는 메소드를 한개 가지고 있다.
람다 인터페이스를 사용하는 람다 표현식은 JDK8에서 추가되었다.
JDK8에 추가된 이러한 문법들을 사용할 때 보통 모던 자바라고 한다.