본문 바로가기
back-end/JAVA

39) 인터페이스의 선언, 상속, 구현

by 모두의 향연 2021. 6. 17.
728x90
반응형

39) 인터페이스의 선언, 상속, 구현

 

1. 인터페이스(interface)

-추상 메서드의 집합

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

인터페이스(검정색부분)

객체 1이 객체 2의 변수에 접근하기 위해선 객체 2의 메서드를 통해 접근해야한다.

왜? 객체 2의 변수를 보호하기 위해서이다.

그게 '캡슐화'라고 이전 시간에 이야기했다.

(모르시는 분 여기 참고)

https://feastforall.tistory.com/50

 

30) 접근제어자와 캡슐화(encapsulation)

30) 접근제어자와 캡슐화(encapsulation) 1. 접근제어자와 캡슐화 접근제어자를 사용하는 이유? -외부로부터 데이터를 보호하기 위해서 public은 접근 제한이 없다 보니 int의 범위 ±20억 사이에 아무

feastforall.tistory.com

그래서 객체 변수에 접근할 때 t.hour로 접근하지 않고 t.getHour()로 메서드를 통해 접근했었다.

인터페이스는 밖에 노출되어 있어서 접근제어자가 항상 public이다.

 

 

 2. 선언 형식

1
2
3
4
5
6
interface 인터페이스이름{
    public abstract 메서드이름(매개변수목록);
    public static final 타입 상수이름 = 값;
}
cs

인터페이스는 class대신 interface를 작성한다.

제어자는 모두 public으로 써야 한다. 변수 iv나 cv는 절대 올 수 없고 상수만 가능하다. 

메서드는 모두 추상 메서드만 가능하다.  

 

 

 

3. 예시

1
2
3
4
5
6
7
8
9
interface PlayingCard{
    public static final int SPADE = 4;
    final int DIAMOND = 3;//public static final int DIAMOND = 3;
    static int HEART = 2//public static final int HEART = 2; 
    int CLOVER = 1;       //public static final int CLOVER = 1;
    
    public abstract String getCardNumber();
    String getCardNumber();//public abstract String getCardKing();
}
 
cs

위 인터페이스에서 상수와 메서드로 이루어져 있는데,

인터페이스에서 상수 부분은,

인터페이스는 무조건 public이므로 public 생략 가능,

공통적으로 쓰이는 값이라 static을 쓰므로 static 생략 가능,

무조건 상수이므로 fianl 생략 가능이다.

 

인터페이스에서 메서드 부분은,

무조건 public이므로 public 생략 가능,

무조건 추상 메서드이므로 abstract 생략 가능이다.

 

 

4. 인터페이스의 상속

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

 :인터페이스는 인터페이스에서만 상속받기 때문에 Object 같은 건 없다.

 

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

 :이전에는 다중 상속을 하면 어느 클래스의 메서드를 사용하는지 모르기 때문에 다중 상속이 불가능했지만, 추상 메서드는 어차피 추상 메서드기 때문에 어느 것을 써도 상관이 없다.

(모르는 분 여기 참고)

https://feastforall.tistory.com/33

 

22) 단일상속(single inheritance)

22) 단일상속(single inheritance) 1. 정의 -java는 단일(하나의 부모만 상속) 상속만을 허용한다(C++은 다중상속 허용) 2. 에러 예시 class TvDVD extends Tv, DVD{ //에러. 조상은 하나만 허용됨.  … } 3. 왜..

feastforall.tistory.com

1
2
3
4
5
6
7
8
9
interface Fightable extends Movable, Attackable{ }
 
interface Movable{
    void move(int x, int y);
}
 
interface Attackable{
    void attack(Unit u);
}
cs

 

 

5. 인터페이스의 구현

-인터페이스에 정의된 추상 메서드를 완성하는 것

1
2
3
class 클래스이름 implements 인터페이스이름{
  //인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
}
 
cs

상속은 extends를 썼지만 구현은 implements를 쓴다.

1
2
3
4
5
6
7
8
9
interface Fightable{
     void move(int x, int y);//추상메서드(public abstract생략)
     void attack(Unit u);//추상메서드(public abstract생략)
}
 
class Fighter implements Fightable{ //인터페이스구현
    public void move(int x, int y){ /*내용생략*/ } //추상메서드 구현
    public void attack(Unit u){ /*내용생략*/ } //추상메서드 구현
}
 
cs

 

 

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

1
2
3
4
5
6
7
8
interface Fightable{
     void move(int x, int y);//추상메서드
     void attack(Unit u);//추상메서드
}
 
abstract class Fighter implements Fightable{ //인터페이스구현
    public void move(int x, int y){ /*내용생략*/ } //추상메서드 하나만 구현
}
 
cs

 

 

 

6. 정리 퀴즈

Q. 인터페이스란?

A. 추상 메서드의 집합(그냥 외우세요). 그 외에도 상수, static메서드, 디폴트메서드도 있음

 

Q. 인터페이스의 구현이란?

A. 인터페이스의 추상메서드 몸통{} 만들기(미완성 설계도 완성하기)

 

Q. 추상 클래스와 인터페이스의 공통점

A. 추상 메서드를 가지고 있다(미완성 설계도)

 

Q. 추상 클래스와 인터페이스의 차이점

A. 인터페이스는 iv를 가질 수 없다.

 

Q. 추상 클래스의 구현과 인터페이스의 구현의 차이점

A. 추상클래스의 구현은 '추상 클래스'의 추상 메서드를 완성하는 것이고, 인터페이스의 구현은 '인터페이스'의 추상메서드를 완성하는 것이다.

 

 

 

*유튜브 남궁성 선생님의 `자바의 정석`을 참고하여 만들었습니다*
*자세히 보고 싶은 분들은 유튜브 가서 보시면 됩니다*

728x90
반응형