[Java의 정석]Chapter7.객체지향 프로그래밍2(35~39)

Hello_Wendy·2022년 5월 24일
0

자바의 정석

목록 보기
61/61
post-thumbnail

Chapter 7. 객체지향 프로그래밍 2

35. 인터페이스(interface)

  • 인터페이스 : 일종의 추상클래스

  • 인터페이스는 추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없음

  • 오직 추상메서드상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용하지 않음

  • 추상클래스를 부분적으로 완성된 '미완성 설계도'라고 한다면, 인터페이스는 구현된 것은 아무 것도 없고 밑그림만 그려져 있는 '기본 설계도' 라고 할 수 있음
    ▶ 인터페이스도 추상클래스처럼 불완전한 것이기 때문에 그 자체만으로 사용되기 보다는 다른 클래스를 작성하는데 도움 줄 목적으로 작성

  • 인터페이스를 작성하는 것을 클래스를 작성하는 것과 같지만, 키워드로 class 대신 interface를 사용함
  • interface에도 클래스처럼 접근제어자로 public 또는 default만 사용 가능
interface 인터페이스이름 {
	public static final 타입 상수이름 =;
    public abstract 메서드이름(매개변수목록);
}

▶인터페이스 멤버들의 제약사항

  • 모든 멤버 변수는 public static final이어야 하며, 이를 생략 가능
  • 모든 메서드는 public abstract 이어야 하며, 이를 생략 가능
    (단, static메서드와 디폴트 메서드는 예외-JDK1.8부터)

→ 인터페이스에 정의된 모든 멤버에 예외없이 적용되는 사항이기 때문에 제어자를 생략할 수 있는 것이며, 편의상 생략하는 경우가 많음
→ 생략된 제어자는 컴파일 시에 컴파일러가 자동적으로 추가 해줌

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 getCardKind(); //public abstract String getCardKind();
}

36. 인터페이스의 상속

  • 인터페이스인터페이스로만 상속받을 수 있으며, 클래스와 달리 다중상속, 즉 여러개의 인터페이스로부터 상속을 받는 것이 가능
    → 인터페이스는 클래스와 달리 Object클래스와 같은 최고 조상이 없음
interface Movable {
	/*지정된 위치(x,y)로 이동하는 기능의 메서드*/
    void move(int x, int y)
}
interface Attackable {
	/*지정된 대상(u)을 공격하는 기능의 메서드*/
    void attack(Unit u);
}
interface Fightable extends Movable, Attackable{}
  • 클래스의 상속과 마찬가지로 자손 인터페이스(Fightable)는 조상 인터페이스(Movable, Attackable)에 정의된 멤버를 모두 상속 받음

  • 그래서 Fightable자체에는 정의된 멤버가 하나도 없지만, 조상 인터페이스로부터 상속받은 두 개의 추상메서드, move(int x, int y)와 attack(Unit u)을 멤버로 갖게 됨

37. 인터페이스의 구현

  • 인터페이스도 추상클래스처럼 그 자체로는 인스턴스를 생성할 수 없음

  • 추상클래스가 상속을 통해 추상메서드를 완성하는 것처럼, 인터페이스도 자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야하는데, 그 방법은 추상클래스가 자신을 상속받는 클래스를 정의하는 것과 같음

  • 클래스는 확장한다는 의미의 키워드 extends를 사용하지만 인터페이스는 구현한다는 의미의 키워드 implements를 사용할 뿐

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

class 

profile
안녕 나의 새로운 세상

0개의 댓글