인터페이스
인터페이스 (interface)
- 바깥에 있으니 public 이다
- 추상메서드의집합 < 프로그래밍의 관점
- 구현된것이 전혀없는 설계도 . 껍데기
- 인터페이스의 모든 멤버는 public 이다
인터페이스의 접근제어자를 명시하지않을때 defalut 값이 다른패키지에서도 가능한이유
- 인터페이스의 모든 멤버는 public 이기때문에 접근제어자를 명시하지않아도 public static final 이다
- default 로 들어가지만 default 또한 인터페이스 밑의 멤버 이기때문에 public 으로 변경된다
- 그래서 다른패키지에서도 접근이 가능하다
- 인터페이스는 모든 변수는 상수이다 public static final 이다 < 생략가능
-
인터페이스의 모든 메서드는 추상화메서드 이다 public abstract 이다 생략가능 <
- 일반적인 default (같은패키지만 접근 )
- 인터페이스의 defalut는 public 이기때문에 (다른패키지에서도 접근가능)
- 접근제어자생략시 > 인터페이스내의 default 변경 하지만 default가 가진값은 > default(public static final) 이것이다 (다른패키지 읽기가능 읽기인이유는 상수이기때문))
- 일반적인 default(같은패키지내에서만)) 접근제어자랑은 다르다 . 이유는 인터페이스내의 default 또한 인터페이스 내의 멤버메소드이므로 public으로 선언되어야하기때문에 .
기본 인터페이스의 선언 <
interface 인터페이스이름 {
public static final 타입 상수이름 : 값; < 상수
public abstract 메서드이름 (매개변수목록); < 추상메서드
}
interface PlayingCard{
public static final int SPADE = 4;
final int DIAMOND = 3; // 접근제어자생략시 > 인터페이스내의 default 변경 하지만 default가 가진값은 > default(public static final) 이것이다 (다른패키지 읽기가능 읽기인이유는 상수이기때문))
// 일반적인 default 접근제어자랑은 다르다 . 이유는 인터페이스내의 default 또한 인터페이스 내의 멤버메소드이므로 public으로 선언되어야하기때문에 .
//public static final int DIAMOND = 3;
static int HEART = 2; // public statc final int HEAT = 2;
int CLOVER = 1; // public static final int CLOVER = 1;
public abstract String getCardNumber();
String getCardKind(); // public abstract String getCardKind();
}
추상클래스와 인터페이스가 차이점
추상클래스는 클래스와 추상메서드를 가지고있지만
추상메서드는 클래스대신 인터페이스 를들고있다 몸통이없이 구현된게없는 메서드이다
- 인터페이스는 추상 메서드만 가질수있따 iv 를 가질수없다 (상수,static메서드 ,default메서드 가능)
- 인터페이스는 구현된게 전혀없고 껍데기만있다 .
추상 클래스와 인터페이스의 공통점
- 추상메서드를 가지고있다 몸통{} 없는 미완성설계도
인터페이스의 상속
- 인터페이스의 조상은 인터페이스만 가능 (Object 가 최고조상이아니다)
- 다중 상속 이 가능하다 (추상메서드는 충돌해도 문제없음)
- 자바는 단일상속 이다 그런데 인터페이스가
-
다중상속이 가능한이유는 추상화메서드내의 {} 몸통 아무것도 구현된게없으니상관없다
interface Fightable extends Movable, Attackable {} interface Movable { //지정된 위치 (x,y)로 이동하는 기능의메서드 void move(int x , int y); } interface Attackable { // 지정된 대상 (u)로 공격하는 기능의 메서드 void attack(Unit u); }
인터페이스의 구현
- 인터페이스에 정의된 추상 메서드를 완성하는것
- 몸통{} 만들기 ( 미완성 설계도 완성하기 )
기본 인터페이스의 선언
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서드를 모두 구현해야한다
}
Fighter 클래스는 Fightable 인터페이스를 구현했다
interface Fightable { // 인터페이스
void move(int x, int y);
void attack(Unit u);
}
class Fighter implements Fightable{ // 모두 구현했으니 앞의 abstract 생략
public void move(int x, int y){ // 내용생략 }
public void attack(Unit u){ // 내용생략}
}
AuidoPlayer 클래스가 Player 추상 클래스를 구현했다
abstract class Player { // 추상클래스 (미완성 설계도)
abstract void play(int pos); // 추상메서드
abstract void stop(); // 추상메서드
}
class AudioPlayer extends Player{
void play(int pos) { // 코드 생략 } // 추상메서드를 구현
void stop() { // 코드 내용 생략 } // 추상메서드를구현
}
인터페이스를 이용한 다형성
- 인터페이스도 구현 클래스의 부모 ?
- 인터페이스 타입 매개변수는 인터페이스 구현한클래스의 객체만 가능
- 인터페이스를 메서드의 리턴타입으로 지정할수있다
중요
인터페이스의 반환타입은 > 인터페이스를 구현한 클래스(객체)를 반환한다
허나 리턴에서 인터페이스명 반환타입이 맞춰야하니 형변환이 생략된다
Fightable 인터페이스를 구현한(implements) 클래스의 인스터스만 가능 (반환)
interface Fightable {
void move(int x , int y);
void attack(Fighable f); // Fightable :인터페이스타입 ,리턴타입 ,반환타입 <
}
Fightable method(){ // 인터페이스를 구현한 클래스를갖다준다 <
Fighter f = new Fighter();
return f; //클래스 Fighter 지만 형변환이생략되어서 Fightable 인터페이스로 반환되었다 반환타입이 일치해야하니까
//return (Fightable)f;실제는이것이다 중요
}
이두문장을 한문장으로바꾸면
return new Fighter();
Fightable f = method(); 형변환이생략되었다
앞에있는 반환타입을 중요시봐야한다
Fightable f = new Fighter(); 자손이 조상을 가리키면 형변환 코드 생략가능하다 앞에있는 반환타입을 중요시봐야한다
class Fighter exetends Unit implemnets Fightable {
public void move(int x , int y); { // 코드 내용생략 }
public void attack(Fighable f); { // 코드 내용생략 }
}
Unit u = new Fighter();
Fightable f = new Fighter();
f.move(100,200);
f.attack(new Fighter());
B 클래스의 선언과 구현을 분리 <
디폴트 메서드와 static 메서드
- 인터페이스에 디폴트 메서드, static 메서드 추가가능 (jdk 1.8부터)
- 인터페이스에 새로운 메서드(추상메서드를 추가하기어렵다) 추상메서드를 추가하는순간 인터페이스를 구현한 여러 클래스에서도 추가한 {};< 를 새로 기능을넣어줘야하기때문이다 복잡해진다
-디폴트 메서드는 인스턴스메서드 (인터페이스 원칙 위반 ) 예외 .
interface MyInterface {
void method(); //추상메서드
void newMethod(); //
}
interface MyInterface {
void method();
default void newMethod(){}; // default {}; 만 입력안하면된다
}
디폴트메서드가 기존메서드와 충돌할떄 해결책
- 여러 인터페이스의 디폴트메서드간의 충돌 -인터페이스를 구현한 클래스 내에서 디폴트메서드를 오버라이딩해야한다.
- 디폴트 메서드와 조상클래스의메서드 간의 충돌
- 조상클래스메서드가 우선시되고 , 디폴트메서드는 무시된다
결론적으로 오버라이딩직접하면 쉽다 혹은 default {}; 바디만 안적으면 public abstract 바디가없는 추상메서드로간주된다
매개변수 :
- 파라미터 ,매개변수 > 대입 이라생각
Leave a comment