Interface
- 자바에서의 interface 개념도
- 클래스 개념에서 필수인 생성자가 인터페이스에서는 사용 불가
-
클래스를 다중상속하면 메소드 사용시 모호성이 발생할 수 있어서 인터페이스를 사용한다
class Animal { public void cry() { System.out.println("짖기!"); } } class Cat extends Animal { public void cry() { System.out.println("냐옹냐옹!"); } } class Dog extends Animal { public void cry() { System.out.println("멍멍!"); } } class MyPet extends Cat, Dog {} public class Polymorphism { public static void main(String[] args) { MyPet p = new MyPet(); p.cry(); } }
- 위 코드에서 MyPet 객체가 어떤 부모 클래스의 cry()를 사용해야할지 모호해짐
-
interface를 사용하면 그 안에 들어있는 추상함수를 사용하는 클래스에서 직접 정의해줘야 하므로 모호성이 발생하지 않는다. 또한 인터페이스 끼리는 인터페이스 끼리만 상속이 가능하다.
interface Animal { public abstract void cry(); } interface Cat extends Animal { public abstract void cry(); } // 인터페이스가 인터페이스를 상속한 모습 interface Dog extends Animal { public abstract void cry(); } class MyPet implements Cat, Dog { public void cry() { System.out.println("멍멍! 냐옹냐옹!"); } } public class Polymorphism05 { public static void main(String[] args) { MyPet p = new MyPet(); p.cry(); } }
익명 클래스란?
- 이름이 없는 클래스
- 클래스의 존재 목적은 객체지향적 성격을 가지고 코드의 중복, 복잡해짐을 최소한으로 하기 위함
- 특정 클래스의 객체지향적 특성은 활용하겠지만(상속, 인터페이스 관계등은 유지) 그 기능은 일회성이므로 내가 정하겠다
- 안드로이드의 button listener가 대표적인 예시임. 버튼의 이벤트들은 각 버튼마다 역할이 부여되는 것이므로 재사용 가능성이 매우 적음. 이럴때 익명 클래스 사용
public class Test
{
private int num = 1;
public int getNum(){
return this.num;
}
public void setNum(int num){
this.num = num;
}
}
public class App {
public static void main(String[] args) throws Exception {
Test t1 = new Test(){
private int num = 1000;
@Override
public int getNum() {
return 50000;
};
};
System.out.println(t1.getNum());
}
}
- Test 클래스를 new 연산자를 통해 인스턴스화 하지만 override를 통해 기존 틀에서 벗어난 인스턴스가 만들어짐. 기존에 없던 새로운 클래스를 통해 인스턴스를 생성해냈고 그 클래스의 이름은 없다라고 생각하면 편함
PREVIOUS경제