인터페이스

인터페이스 (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 {}; 만 입력안하면된다 
}

디폴트메서드가 기존메서드와 충돌할떄 해결책

  1. 여러 인터페이스의 디폴트메서드간의 충돌 -인터페이스를 구현한 클래스 내에서 디폴트메서드를 오버라이딩해야한다.
  2. 디폴트 메서드와 조상클래스의메서드 간의 충돌
    • 조상클래스메서드가 우선시되고 , 디폴트메서드는 무시된다

결론적으로 오버라이딩직접하면 쉽다 혹은 default {}; 바디만 안적으면 public abstract 바디가없는 추상메서드로간주된다

매개변수 :

  • 파라미터 ,매개변수 > 대입 이라생각

Categories:

Updated:

Leave a comment