🏃♂️ 들어가기 앞서..
본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 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등을 제공하는 회사측과 자바를 활용하여 개발하는 개발자들간의 불일치와 갈등을 줄일 수 있다.)