Java의 기본 개념 중 Interface를 활용하는 방법에 대해 알아보자.
interface Tiger {
void f1();
}
위와 같은 코드가 있다고 할 때, interface Tiger를 이용하는 방법 3가지를 알아보자.
첫번째 방법은, Tiger를 implement하는 Lion class를 이용하는 것이다.
class Lion implements Tiger {
@Override
public void f1() {
System.out.println(1);
}
}
public class hello {
public static void main(String[] args) {
Lion obj = new Lion();
obj.f1();
두번째 방법은, 익명 클래스 객체를 생성하는 것이다.
원래 interface는 객체를 생성할 수 없다.
따라서 Tiger obj02 = new Tiger();
이 코드는 성립될 수 없다.
그러나 Tiger obj02 = new Tiger() {}
와 같이 scope를 추가하고 그 안에 interface의 메소드를 구현한다면, 별도의 class를 생성하지 않고도 interface의 객체를 생성할 수 있다.
//Tiger obj02 = new Tiger(); // 인터페이스는 객체를 생성할 수 없다
Tiger obj02 = new Tiger() { // 별도의 class 없이 객체 생성
@Override
public void f1() {
System.out.println(2);
}
};
obj02.f1();
위와 같이 interface안에 있는 f1()에 대한 구현을 한다면, 사용 가능하다.
세번째 방법은, 익명 객체를 사용하는 것이다.
new Tiger() {}
와 같이 scope를 추가하고 그 안에 interface의 메소드를 구현한 후, .f1()을 통해 method를 호출한다면
별도의 객체를 생성하지 않고도 interface를 활용할 수 있다.
//방법 3: 익명 객체를 사용
new Tiger() { // 객체가 없음
@Override
public void f1() {
System.out.println(3);
}
}.f1();
//.f1()을 통해 해결
}
}
interface A {
void f100();
}
class C implements A {
@Override
public void f100() {
System.out.println(1);
}
}
class B {
void f1(A a) {
a.f100();
}
}
위와 같이 interface A, class C implements A, class B
가 있다고 가정해보자.
이 때, 위에서 언급한 것과 같이 new A() {메소드 구현}
을 통해 interface지만 객체를 생성할 수 있다.
public class hello {
public static void main(String[] args) {
B obj = new B();
obj.f1(new C());
obj.f1(new A() {
@Override
public void f100() {
System.out.println(2);
}
});
}
}