JAVA_39_인터페이스
인터페이스 (interface)
정의
- ✨✨✨추상메소드의 집합
- 구현된 것이 전혀 없는 설계도
- iv도 뭐도 없다!
- 껍데기
요소
- 모든 멤버가 ✨
public
- 요소 : static메소드, 디폴트메소드, 상수
- ✨
public abstract 메소드명(매개변수..)
public static abstract 메소드명(매개변수..)
- ✨
public static final 타입 상수명
- 제어자들은 일부 또는 전부 생략 가능
interface 인터페이스명 {
public static final 타입 상수명 = 값;
public abstract 메소드명(매개변수..);
}
인터페이스의 상속
- 인터페이스의 조상은 인터페이스만 가능
Object
가 최고 조상 아님!
- 다중 상속 가능 - 추상메소드는 충돌해도 문제 없음
인터페이스의 구현
- 인터페이스에 정의된 추상메소드를 클래스가 완성하는 것
- 미완성 설계도 완성
implements
- 일부만 구현할 경우 : 클래스 앞에
abstract
을 붙인다.
class 클래스명 implements 인터페이스명 {
//인터페이스에 정의된 모든 추상메소드를 구현해야 함!!
}
추상클래스와 인터페이스 비교
공통점
- 추상메소드를 가지고 있다.
차이점
- 인터페이스 : ✨iv를 가질 수 없다. (생성자, 인스턴스메소드도 마찬가지)
인터페이스를 이용한 다형성
-
👀 인터페이스도 구현 클래스의 부모? : YES (엄밀히 말하면 아니랍니다)
-
✨✨✨ 인터페이스 타입 매개변수는 인터페이스 구현 클래스의 객체만 가능하다 ??
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(); //인터페이스 다형성
u.move(100, 200);
f.attack(new Fighter()); //******중요
-
Fighter
클래스는 Unit
클래스를 상속받고, Fightable
인터페이스를 구현한다.
-
Fightable f
매개변수 : ✨👀✨Fightable
인터페이스를 구현한 클래스의 인스턴스만 가능
- ✨✨인터페이스를 메소드의 반환타입으로 지정할 수 있다.
Fightable method() {
//...
return new Fighter();
//정확히는 return (Fightable)new Fighter(); 형변환!!
}
class Fighter extends Unit implements Fightable {
public void move(int x, int y) { }
public void attack(Fightable f) { }
}
...
Fightable f = method();
-
✨👀✨Fightable
인터페이스를 구현한 클래스의 인스턴스를 반환하는 method()
-
✨✨✨호출한 쪽, 즉 method();
을 받아 저장하는 변수도 Fightable
인터페이스 타입의 참조변수 f
!!
-
위 둘의 타입이 일치
abstract class Unit2{
int x, y;
abstract void move(int x, int y);
void stop() {
System.out.println("멈춥니다.");
};
}
interface Fightable{
void move(int x, int y); //public abstract 생략
void attack(Fightable f); //마찬가지
}
class Fighter extends Unit2 implements Fightable{
//오버라이딩 규칙 : 제어자가 조상(public)보다 범위가 좁으면 안된다!!
public void move(int x, int y) {
System.out.printf("[%d, %d]로 이동%n", x, y);
}
public void attack(Fightable f) {
System.out.println(f+"를 공격"); //toString()
}
//싸울 수 있는 상대를 불러온다.
Fightable getFightable() {
return (Fightable)new Fighter(); //Fighter를 생성해서 반환
//***메소드 반환타입Fightable과 일치!
//Fighter f = new Fighter(); return (Fightable)f;
//Fightable f = new Fighter(); return f; 둘다 가능!
}
}
public class FighterTest {
public static void main(String[] args) {
Fighter f = new Fighter();
f.move(100, 200);
f.attack(new Fighter());
f.stop();
Fightable ff = f.getFightable(); //***메소드 반환타입Fightable과 일치!!
System.out.println(ff+"와/과 싸웁니다.");
System.out.println();
Unit2 u = new Fighter();
u.move(100, 200);
// u.attack(new Fighter()); //Unit2에는 attack()이 없으므로 에러
u.stop();
// Fightable uu = u.getFightable(); //Unit2에는 getFightable()이 없으므로 에러
System.out.println();
Fightable f2 = new Fighter();
f2.move(100, 200);
f2.attack(f2);
// f2.stop(); //Fightable에는 stop()이 없으므로 에러
// Fightable ff2 = f2.getFightable(); //Fightable에는 getFightable()이 없으므로 에러
}
}
[100, 200]로 이동
Fighter@41629346를 공격
멈춥니다.
Fighter@404b9385와/과 싸웁니다.
[100, 200]로 이동
멈춥니다.
[100, 200]로 이동
Fighter@6d311334를 공격
인터페이스의 장점
-
두 대상(객체) 간의 연결, 대화, 소통을 돕는 중간역할을 한다.
-
자판기의 껍데기! 컴퓨터의 GUI!
-
선언(설계, 껍데기)과 구현(알맹이)을 분리
-
느슨한 결합 : 인터페이스 덕분에 B가 변경되어도 A는 바꾸지 않아도 된다.
public
public abstract 메소드명(매개변수..)
public static abstract 메소드명(매개변수..)
public static final 타입 상수명
interface 인터페이스명 {
public static final 타입 상수명 = 값;
public abstract 메소드명(매개변수..);
}
Object
가 최고 조상 아님!implements
abstract
을 붙인다.
class 클래스명 implements 인터페이스명 {
//인터페이스에 정의된 모든 추상메소드를 구현해야 함!!
}
👀 인터페이스도 구현 클래스의 부모? : YES (엄밀히 말하면 아니랍니다)
✨✨✨ 인터페이스 타입 매개변수는 인터페이스 구현 클래스의 객체만 가능하다 ??
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(); //인터페이스 다형성
u.move(100, 200);
f.attack(new Fighter()); //******중요
Fighter
클래스는 Unit
클래스를 상속받고, Fightable
인터페이스를 구현한다.
Fightable f
매개변수 : ✨👀✨Fightable
인터페이스를 구현한 클래스의 인스턴스만 가능
Fightable method() {
//...
return new Fighter();
//정확히는 return (Fightable)new Fighter(); 형변환!!
}
class Fighter extends Unit implements Fightable {
public void move(int x, int y) { }
public void attack(Fightable f) { }
}
...
Fightable f = method();
✨👀✨Fightable
인터페이스를 구현한 클래스의 인스턴스를 반환하는 method()
✨✨✨호출한 쪽, 즉 method();
을 받아 저장하는 변수도 Fightable
인터페이스 타입의 참조변수 f
!!
위 둘의 타입이 일치
abstract class Unit2{
int x, y;
abstract void move(int x, int y);
void stop() {
System.out.println("멈춥니다.");
};
}
interface Fightable{
void move(int x, int y); //public abstract 생략
void attack(Fightable f); //마찬가지
}
class Fighter extends Unit2 implements Fightable{
//오버라이딩 규칙 : 제어자가 조상(public)보다 범위가 좁으면 안된다!!
public void move(int x, int y) {
System.out.printf("[%d, %d]로 이동%n", x, y);
}
public void attack(Fightable f) {
System.out.println(f+"를 공격"); //toString()
}
//싸울 수 있는 상대를 불러온다.
Fightable getFightable() {
return (Fightable)new Fighter(); //Fighter를 생성해서 반환
//***메소드 반환타입Fightable과 일치!
//Fighter f = new Fighter(); return (Fightable)f;
//Fightable f = new Fighter(); return f; 둘다 가능!
}
}
public class FighterTest {
public static void main(String[] args) {
Fighter f = new Fighter();
f.move(100, 200);
f.attack(new Fighter());
f.stop();
Fightable ff = f.getFightable(); //***메소드 반환타입Fightable과 일치!!
System.out.println(ff+"와/과 싸웁니다.");
System.out.println();
Unit2 u = new Fighter();
u.move(100, 200);
// u.attack(new Fighter()); //Unit2에는 attack()이 없으므로 에러
u.stop();
// Fightable uu = u.getFightable(); //Unit2에는 getFightable()이 없으므로 에러
System.out.println();
Fightable f2 = new Fighter();
f2.move(100, 200);
f2.attack(f2);
// f2.stop(); //Fightable에는 stop()이 없으므로 에러
// Fightable ff2 = f2.getFightable(); //Fightable에는 getFightable()이 없으므로 에러
}
}
[100, 200]로 이동
Fighter@41629346를 공격
멈춥니다.
Fighter@404b9385와/과 싸웁니다.
[100, 200]로 이동
멈춥니다.
[100, 200]로 이동
Fighter@6d311334를 공격
두 대상(객체) 간의 연결, 대화, 소통을 돕는 중간역할을 한다.
자판기의 껍데기! 컴퓨터의 GUI!
선언(설계, 껍데기)과 구현(알맹이)을 분리
느슨한 결합 : 인터페이스 덕분에 B가 변경되어도 A는 바꾸지 않아도 된다.
Ref
Author And Source
이 문제에 관하여(JAVA_39_인터페이스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lecharl/JAVA39저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)