JAVA/자바의 정석

[자바의 정석 - 기초편] 7. (10) 인터페이스 ( 선언 / 상속 / 구현 / 다형성 )

서영22 2023. 12. 1. 02:55
< 추상 클래스 VS 인터페이스 >

추상 클래스 : 추상 메서드를 가진 일반 클래스 (생성자, iv ... 갖고 있음)  /  상속(extends)을 통해 구현

인터페이스 : 추상 메서드 외에 아무것도 갖지 않음 (iv, im, 생성자 X)  /  implements 를 사용해 구현

 

 

 인터페이스 

- 추상 메서드의 집합

 

- 구현된 것이 전혀 없는 설계도 (모든 멤버가 public)

 

interface 인터페이스이름 {
        pubilc ststic final 타입 상수이름 = 값;
        public abstract 메서드이름 (매개변수목록);
}

 

 

인터페이스의 상수 : 항상 public static final생략 가능

인터페이스의 추상메서드 : 항상 public static생략 가능

 

 

 

 인터페이스의 상속 

- 인터페이스의 조상은 인터페이스만 가능 (Object가 최고 조상 아님)

 

- 다중 상속이 가능 (조상이 여러개) - 추상메서드는 충돌해도 문제 없음

 

 

 

 

 인터페이스의  구현 

인터페이스에 정의된 추상 메서드를 완성하는 것 (추상클래스 완성과 동일)

 

- 일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 함

 

class 클래스이름 implements 인터페이스이름 {
        // 인터페이스에 정의된 추상메서드를 모두 구현해야 함
}


Ex)
interface Fightable {
        void move(int x, int y);
        void attack(Unit u);
}

< 경우 1 >
class Fighter implements Fightable {
        public void move(int x, int y) {  /* 내용 생략 */  }
        public void attack(Unit u) {  /* 내용 생략 */  }
}

➔ 'Fighter 클래스는 Fightable 인터페이스를 구현했다'


< 경우 2 >
abstract class Fighter implements Fightable {
        public void move(int x, int y) {  /* 내용 생략 */  }
}

➔ 추상메서드 2개중에 1개만 구현해서 abstract 붙여야 함

 

 

 

 인터페이스를 이용한 다형성 

- 인터페이스 타입 매개변수는 인터페이스를 구현한 클래스의 객체만 가능

 

- 인터페이스를 메서드의 리턴타입으로 지정 가능

 

 

 

interface Fightable {
        void move(int x, int y);
        void attack(Fightable f);  // 인터페이스 타입 매개변수
}

class Fighter extends Unit implements Fightable {
        public void move(int x, int y)   {  /* 내용 생략 */  }
        public void attack(Fightable f) {  /* 내용 생략 */  }
}

Unit          u = new Fighter();
Fightable  f = new Fighter();   // f는 Fightable 인터페이스에 선언된 추상메서드 2가지만 사용 가능

f.move(100, 200);
f.attack(new Fighter());

 

 

 

< 예제 >

 

 

 

 

< 예제 - 메서드 추가 >