[JAVA] 객체 지향 프로그래밍 Ⅱ 정리 - (5) : 인터페이스

DongGyu Jung·2022년 1월 28일
0

자바(JAVA)

목록 보기
16/60
post-thumbnail

🏃‍♂️ 들어가기 앞서..

본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕

*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.



이번에 인터페이스를 알아보기 전에 추상클래스를 다시 살펴보자.

📑 인터페이스 (inerface)

" 추상 메서드의 집합 "

추상클래스처럼
추상메서드를 갖지만

추상클래스보다
추상화 정도가 높다.
( 추상 클래스가 8~90% 정도는 완성된 "미완성 설계도"라 하면
인터페이스는 틀만 있는 "기본 설계도"라고 생각하면 된다.)

위에서 말했듯
틀만 있다는 표현처럼
모든 멤버public이다.

추상화 정도가 높다는 것은
추상클래스와 달리

★★★
일반 메서드멤버변수도 가질 수 없고
추상 메서드상수만 가질 수 있다.

※ 인터페이스 멤버조건

  • 모든 멤버변수는 항상 public static final이어야 함
  • 모든 메서드는 항상 public abstract이어야 함.

중요한건
당연히 지켜져야할
위 조건들이 있기 때문에
제어자 생략가능하다.

interface PlayingCard {
    public static final int SPADE = 4; // 기본 조건
    final int DIAMOND = 3 ; // public & static 생략 가능
    static int HEART = 2 ; // public & final 생략 가능
    int CLOVER = 1 ; // 아예 생략 가능

    public abstract String getCardNum() ; // 기본 조건
    String getCardKind() ; // 생략 가능
}

(단, static / default 메서드는 예외)

※ 선언

interface (인터페이스 명) {
    // 모두 public 접근제어자 (default도 사용 가능)
    public static final (타입) (상수명) = () ;
    
    public abstract (메서드 명 (매개변수..)) ; // 추상메서드
}

📚 상속

인터페이스의 조상은 " 인터페이스만 " 가능
( Object가 최고 조상으로 설정되지 않는다. )

인터페이스끼리의 상속은
(클래스와는 달리) " 다중상속 "이 가능하다.

  • 여러 개의 인터페이스로부터 상속
  • <조상(일반 상속) & 인터페이스> 상속

즉,
여러 개의 인터페이스로부터 상속 받는 것이 가능하다는 것이다.

interface Movable {
    void move(int x, int y) ;
}
interface Attackable {
    void attack(Unit u) ;
}

interface Fightable extends Movable, Attackable { }// 다중 상속 가능
// move 추상 메서드와 attack 추상 메서드 모두 멤버로 갖게된다.

본래 자바의 특징 중 하나가
단일 상속인데
이는
" 선언부가 같고 내용이 다른 경우 "같은
'충돌'을 방지하기 위한 기능이지만

추상메서드는
구현부가 없기 때문에
선언부가 같더라도
충돌해도 문제가 발생되지 않는다.

// 메서드를 모두 완성했다는 가정 하
class Fighter extends Unit implements Fightable {
    public void move(int x, int y) {..}
    public void attack(Fightable f)
}

📝 구현

추상클래스와 비슷한 점이 많은만큼
구현 또한 상당히 비슷한데

당연히 추상 클래스보다 추상화 정도가 심한
빈 통 그 자체인 인터페이스이기 때문에

당연히
" 그 자체로는 인스턴스 생성이 불가능하다. "

완성 또한
추상 클래스처럼
"자신에게 정의된 추상메서드의 구현부를 완성시키면 된다. "

다만
추상 클래스의 extentds 키워드가 아닌
" implements " 키워드를 사용한다.

class (클래스명) implements (인터페이스명) {
    ...
    .. // 인터페이스에 정의된 추상메서드 완성
}
// ▼▼▼▼▼▼▼
class Fighter implements Fightable {
    public void move(int x, int y) {
        ...
    }
    public void attack(Unit u) {
        ...
    }
}

만약 인터페이스의 메서드 중 일부만 구현하려면
추상클래스 때와 동일하게
abstract를 붙여서 완성하면 된다.

abstract class Fighter implements Fightable {
    public void move(int x, int y) {
        ...
    }
}

상속구현동시에 할 수 있다.

class Fighter extends Unit implements Fightable {
   public void move(int x, int y) {
       ...
   }
   public void attack(Unit u) {
       ...
   }
}


📌 다형성

이전에 다형성에 대해 알아보았을 때,

<자손 클래스 타입 인스턴스>를
" 조상타입의 참조변수참조 가능 " 하다는 것을 알 수 있었다.

여기서
나름 인터페이스도
<구현을 완성한 클래스> 의 조상이기 때문에

위처럼
<자손 인스턴스> 를 " 참조변수로 참조 "할 수 있고
" 인터페이스(조상) 타입으로의 형변환 "도 가능하다

Fightable f = (Fightable)new Fighter() ; 
// OR
Fightable f = new Fighter() ; 

또한 당연히
" 메서드의 매개변수 타입 "으로도 사용될 수 있다.
( 오버라이딩하는 경우이기 때문에 public void 생략하면 에러 : 오버라이딩 조건 참고)

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() ; // 

이 경우에는
" Fightable인터페이스를 구현한 클래스의 인스턴스 "만 가능하다.
(ex. attack(new Fighter()) )

상단에 Fightable f = new Fighter();
여기서 Fighter(자손) 객체를 만들어
Fightable(인터페이스) 타입 참조변수에 참조시켰는데

이렇게 생성하게 되면
이 객체의
별도로 멤버가 아무리 많아도

" 사용할 수 있는 메서드 "는
'move()' 와 'attack()' 밖에 없다.

++
위에서 " 메서드의 매개변수 타입 "으로 인터페이스를 쓸 수 있다고 했는데

" 리턴타입을 인터페이스로 지정 "하는 것도 가능하다.

Fightable method() {
    ...
    // Fighter 클래스는 Fightable 인터페이스를 완성한 클래스
    Fighter f = new Fighter();
    return f ;
    // return new Fighter() ;
    // 다형성의 특징으로 Fighter 객체를 반환할 수 있다.
}

Fightable f = method(); == Fightable f = new Fighter(); 인 것이다.
( method의 반환 타입 == 참조변수 타입 " 일치 ")

★" 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다 "★



👍 장점

『인터페이스 (Interface)』 : 두 대상간의 연결 / 대화 / 소통을 돕는 " 중간 역할 " 수행

자바에서의 인터페이스는
두 객체간의 연결을 돕는 역할이며

중간 역할로서
두 객체간 직접적인 관계를 간접적인 관계로 관리하기 때문에
수정/변경하는 것에 유리하고 유연하다

" < 선언 - 구현 > 을 분리시킬 수 있다. "
: 구현에 있어서 " 독립적인 프로그래밍 "이 가능해진다.
( 서로 다른 클래스간에 서로 영향을 끼치지 않는다. )


하나의 인터페이스를 공통적으로 구현한 서로 다른 관계없는 클래스들끼리 " 관계를 맺어줄 수 있다. "
: 해당 장점이 다른 클래스로의 수정/변경에 유리한 유연한 구조로 만들어준다.
또한
" 서로 다른 조상 클래스를 가진 자손 클래스들
새로운 관계 형성 "을 인터페이스를 통해 구현할 수 있다.


개발시간을 단축할 수 있다.
: 당연히 無에서 有를 창조하는 것보다 이 있으면 훨씬 작업이 빠른 것처럼
" 추상 메서드들의 집합(선언부)"이 있기 때문에
"구현만" 완성하면 되기 때문에 개발시간 단축이 가능하다.


" 표준화 "가 가능하다.
: 프로젝트에 사용되는 '기본틀'인터페이스로 작성해서
일관되고 정형화된 개발이 가능하다.
(더 확장해서 보면 JDBC라는 자바 표준 인터페이스를 통해 DB등을 제공하는 회사측과 자바를 활용하여 개발하는 개발자들간의 불일치와 갈등을 줄일 수 있다.)

0개의 댓글