인터페이스와 추상 클래스
인터페이스와 추상클래스의 차이
추상클래스
추상클래스
: 완성되지 못한 남겨진 설계도 라고 말을 한다.
클래스가 미완성이라는 것은 멤버의 개수에 관계된것이 아니라, 단지 미완성 메서드를 포함하고 있다는 의미한다. 어떤의미일까 ???
추상클래스로 인스턴스는 생성할 수 없다. 추상클래스는 상속을 통해 자손클래스에 의해서만 완성 할 수 있다.
조상 클래스로서의 의미 새로운 클래스를 작성하는데있어서 완전하지는 않아도 틀을 갖춘 상태에서 시작하는 것을 의미
추상클래스
abstract class ClassName{
...
}
추상 메서드
선언부만 작성하고 구현부는 작성하지 않은채로 남겨 둔것
그러기 때문에 미완성 메서드라고 말할 수 있다.
- 선언부( O )
- 구현부( X )
상속받는 클래스에 따라 달라질 수 있기 때문에 조상클래스에서는 선언부만 작성
abstract returnType methodName();
메서드의 이름과 메서드의 작업에 필요한 매개변수, 메서드의 반환값을 결정하는 것은 쉽지 않기 때문에 선언부만 작성해도 반이상 완성이 된것
추상클래스로 부터 상속받는 자손 클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 전부 구현해주어야한다.
- 추상화 : 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
- 구체화 : 상속을 통해 클래스를 구현하고, 확장하는 작업
추상클래스 예제
Unit 이라는 추상클레스에는 move 라는 기능을 선언해두고 이것을 상속받는 Marine, Tank, Marine, DropShip 을 구현하였다 .
java의 다형성에 따라서 Marine, Tank, Marine, DropShip는 전부 Unit이라는 것을 로 나타낼 수 있기 때문에
Unit [] group = new Unit[4];
에 전부 담을수 있다. 그리고 move 라는 메서드를 가지고 있기 때문에
group[i].move(100,200) 을 통하여 전부 구현이 가능하다.
모든 클래스의 Object로도 전부 담을수 있지만 move의 기능이 없기 때문에 move 부분을 호출할 수가 없다.
인터페이스(Interface)
일종의 추상클래스, 추상메서드를 갖지만 추상화 정도가 높아서 몸통을 갖춘일반 메서드 또는 멤버변수를 가질수 없다.
추상클래스 : 미완성 설계도
인터페이스 : 구현된것은 아무것도 없고 밑그림만 그려져 있는 기본 설계도
인터페이스 작성
interface에도 클래스 같이 접근 제어자로 public 또는 default 사용
interface interFaceName{
public static final 타입_상수이름 = value;
public abstract methodName(매개변수);
}
일반적인 클래스의 멤버와 인터페이스 멤버와의 다른점
- 모든 멤버변수는 public static final 이여야하며, 생략 가증
- 모든 베서드는 public abstract이어야하며, 이를 생략 할 수 있다
단 static메서드와 default메서드는 예외(JDK1.8 부터)
아래와 같이 맴버변수와 메서드를 정의하면 컴파일시에 주석과같이 자동으로 붙여준다.
interface PlayingCard{
public static final int SPADE = 4;
final int DIAMOND = 3; // public static final int
static int HEART = 2;// public static final int
int CLOVER = 1; // public static final int
String getCardKind() // public abstract String getCardKind();
}
1.8부터는 static메서드와 default 메서드의 추가를 허용하는 방향으로 변경됨
인터페이스 상속
클래스와 달리 다중 상속이가능하다.
여러개의 인터페이스를 상속 받으면 인터페이스들의 멤버로 갖게 된다.
다중 상속에서 인터페이스의 메서드 일부만 구현한다면, abstract를 붙여서 추상클래스로 선언해야함
abstract class Fighter implements Fightable
인터페이스 장점
- 개발시간 단축
- 표준화가 가능
- 서로 관계없는 클래스에게 관계를 맺어 줄수 있다.
- 독립적인 프로그래밍이 가능하다.
class Unit{}
GroundUnit extends Unit{}
AirUnit extends Unit{}
Marine extends GroundUnit{}
SCV extends GroundUnit{}
Tank extends GroundUnit{}
Dropship extends AirUnit{}
위와 같은 클래스들이 있다면 기계화 유닛으로 수리에 대한 기능을 만들고 싶지만 scv, tank와 dropship 는 Unit이라는 공통의 조상을 가지고 있지만, Unit에 marine 이라는 클래스에도 영향을 받기 때문에 repair() 기능을 추가하지 못한다.
이러할 경우 인터페이스를 사용해서 클래스들에게 관계를 맺어 줄수 있다.
SCV extends GroundUnit implements Repairable{}
Tank extends GroundUnit implements Repairable{}
Dropship extends AirUnit implements Repairable{}
Repairable 인터페이스를 생성 해준다면
SCV, tank, Dropship의 instanceof(type 검사) 는 repairable로 나타낼 수 있다.
이러할 경우, SCV 클래스에
class SCV extends Units implements Repairable {
...
void repair( Repairable r){
if(r instanceof Unit){
while( u.hitPoint!=u.MAX_HP){
u.hitPoint++;
}
System.out.println( u.toString() + "수리가 끝남");
}
}
}
으로 구현이 가능하다.
scv.repair(tank);
scv.repair(scv);
scv.repair(dropship);
이렇게 지상유닛과 공중 유닛에 대한 관계없는 클래스들에게 관게를 맺어 줄수 있다는 장점이 있다.
'ProgramLanguage > Java' 카테고리의 다른 글
Java 와 객체 지향 (0) | 2019.12.03 |
---|---|
Java jar파일 만들기 (0) | 2019.08.04 |
람다 식 Lambda Expression (1) (0) | 2019.06.09 |
익명클래스(Anonymous Class) (0) | 2019.06.08 |
Java OutOfMemoryError (0) | 2017.12.18 |