[Interface] absract 클래스와 interface
추상 클래스와 인터페이스
1. 추상화
추상화는 중요한 특징을 찾아낸 후 간단하게 표현하는 것이다.
필요한 부분, 중요한 부분을 통합하여 하나로 만드는 것을 말한다.
추상화는 여러가지 요소들을 하나로 통합하는 방향성을 가지고 있다. (한 가지 문제를 여러가지로 쪼개서 나눠보는 '문제 분할'과 반대의 개념)
추상화를 이용하여 핵심적인 것만을 남겨 표현하게 되면, 복잡한 내용도 한 눈에 알아볼 수 있어 이해하기 쉽다는 장점이 있다.
Example
그림과 같이 다른 종류의 트럭과 자동차가 있다. 색깔과 모양, 엔진 유형 및 용도가 다르므로 다른 느낌을 준다.
그러나 이 개체들은 모두 타이어와 엔진, 기어와 같은 공통적인 특성과 동작을 가지고 있다.
차량은 자동차 또는 트럭의 일반적인 아이디어로, 특정 자동차 또는 트럭의 다른 특성을 제거한 일반적인 차량의 속성과 행동에 대한 정보만으로 표현된다.
트럭과 자동차의 두 가지 주요 범주로 분류할 수 있고, 트럭과 자동차의 공통속성과 동작을 포함하는 추상클래스 Vehicle을 추가하여 트럭 및 자동차 카테고리에 대한 추상화를 추가로 만들 수 있다.
2. 추상 클래스(Abstract class)
특징
추상 클래스는 클래스 내 추상 메소드가 하나 이상 포함되거나, abstract로 정의된 경우를 말한다.
abstract class al
추상 클래스는 개념이며, 하위 클래스에 의해 구현된다.
추상 클래스 혼자로는 class의 역할을 다 못하지만, 새로운 class를 작성하는데 있어 그 바탕이 되는 부모클래스(Super class)로서 중요한 의미를 갖는다.
추상 클래스는 자체적으로 객체화 할 수 없는 클래스이기 때문에 상속되어야한다.
추상 클래스의 일부 또는 모든 멤버가 구현되지 않을 수 있고, 구현은 상속 클래스의 몫이다.
구현된 추상 클래스 멤버는 상속 클래스에 의해 재정의 될 수 있고, 상속하는 클래스(추상 클래스)는 계속 추가 인터페이스나 기타 기능을 구현할 수 있다.
Example
Checking Account 와 Saving Acount 두 클래스 사이의 공통적인 특성은owner와 balance이고, 동작은 deposit과 withdraw이 있다.
따라서 두 개체의 추상 클래스는 Bank Account가 된다.
추상 클래스를 언제 사용 할까?
추상 클래스는 그 추상 클래스를 상속 받아서 기능을 이용하고 확장시키는데 있다.
기본 동작을 제공하려면 추상 클래스를 사용한다. (코드 재사용 가능성)
추상 클래스는 해당 하위 클래스에 대한 공용 인터페이스를 정의한다.
추상 클래스는 구체적인 메소드 구현에 앞서 미리 구성요소를 만들어 둘 때 유용하다.
예제 코드
package abstract_interface;
public class ExamAbstract {
/**
* 추상클래스 & 추상메서드 abstract 사용하기 추상클래스는
* 말그대로 약간 추상적인 의미를 가진 클래스여야 하며
* 비추상적인 클래스에서 이를 상속받아 사용합니다.
*/
public static void main(String [] ar){
Tiger tiger = new Tiger("Hodol");
tiger.cry();
tiger.behavior();
System.out.println("사자의 이름은 :" + tiger.animal_name);
Dog dog = new Dog("Mikey"); dog.cry();
dog.behavior();
System.out.println("개의 이름은 :" + dog.animal_name);
}
}
abstract class Animal {
String animal_name;
Animal(String name) {
animal_name = name;
}
public abstract void cry();
public abstract void behavior();
}
class Tiger extends Animal {
public Tiger(String name) {
super(name);
}
public void cry() {
// TODO Auto-generated method stub
System.out.println("어흥");
}
public void behavior() {
// TODO Auto-generated method stub
System.out.println("우측으로 빠르게 움직인다.");
}
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
public void cry() {
// TODO Auto-generated method stub
System.out.println("멍멍");
}
public void behavior() {
// TODO Auto-generated method stub
System.out.println("왼쪽으로 느리게 달린다");
}
}
출처: http://commin.tistory.com/106 [Commin의 일상코딩]
3. 인터페이스(Interface)
모든 메소드가 추상 메소드인 경우 인터페이스이다.
인터페이스는 함수의 껍데기만 있는데, 그 이유는 그 함수의 구현을 강제하기 위해서이다. 구현을 강제함으로써 인터페이스를 구현한 객체들에 대해서 같은 동작을 보장할 수 있다.
추상 메소드는 아직 구현되어 있지 않은 abstract로 정의된 메소드를 말한다.
추상 클래스가 미완성된 설계도라면, 인터페이스는 밑그림만 있는 기본 설계도이다. 즉 뼈대를 기반으로 구현하는 것이다.
인터페이스를 추가하여 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제한다.
인터페이스는 여러개의 인터페이스를 구현할 수 있다.
class al implements a, b, c ...
Example
위 그림의 동물들은 모두 포유류이며 모피나 털을 가지고 있고, 우유로 새끼에게 영양을 주는 공통된 행동과 특성을 공유한다.
그러나 박쥐는 포유류임에도 불구하고 박쥐만이 가지는 날 수 있는 특별한 행동을 한다.
새 또한 날 수있는 조류에 속하는데, 박쥐와 새는 각각 다른 범주에 속하지만 공통된 행동을 하므로 Flyable 인터페이스를 생성하고 박쥐와 새 클래스가 이 인터페이스를 구현할 수 있다.
예제 코드
package abstract_interface;
public class ExamInterface {
/**
* 인터페이스는 추상클래스의 일종이지만 보다 더 극단적인경우입니다.
* 추상메서드로만 구성되며 abstract와다르게 메서드만 정의가 가능합니다.
* 공동 작업을 할때 메서드의 표준화를 시키기 위하여 많이 사용되며,
* 서로 다른 클래스를 연결할 때도 사용됩니다.
*/
public static void main(String[] ar) {
Door door = new Door();
door.open();
door.close();
door.Red();
door.Blue();
Bottle bottle = new Bottle();
bottle.open();
bottle.close();
}
}
interface OpenCloseIf{
public void open();
public void close();
}
interface PaintIf{
public void Red();
public void Blue();
}
/**
* Interface 는 implements 로 상속받으며 * extends 상속과는 다르게 다중 상속이 가능합니다.
*/
class Door implements OpenCloseIf , PaintIf{
public void open() {
// TODO Auto-generated method stub
System.out.println("Door Open");
}
public void close() {
// TODO Auto-generated method stub
System.out.println("Door Close");
}
public void Red() {
// TODO Auto-generated method stub
System.out.println("Paint the door red");
}
public void Blue() {
// TODO Auto-generated method stub
System.out.println("Paint the door blue");
}
}
class Bottle implements OpenCloseIf {
public void open() {
// TODO Auto-generated method stub
System.out.println("Bottle Open");
}
public void close() {
// TODO Auto-generated method stub
System.out.println("Bottle Close");
}
}
출처: http://commin.tistory.com/106 [Commin의 일상코딩]
4. 추상 클래스와 인터페이스의 차이
추상 클래스는 그 추상 클래스를 상속받아서 기능을 이용하고, 확장시키는데 있다.
인터페이스는 함수의 껍데기만 있는데, 그 이유는 그함수의 구현을 강제하기 위해서이다. 구현을 강제함으로써 인터페이스를 구현한 객체들에 대해서 같은 동작을 보장할 수 있다.
추상클래스는 메소드를 구현하지만, 모든 메소드를 구현하지 않는 불완전하게 정의된 클래스이다.
인터페이스는 클래스와 별도로 일련의 연관된 메소드를 정의한다.
** 공통점 : 선언부만 있는 멤버는 하위 클래스에서 반드시 구현 필수
추상 클래스는 클래스 이지만,
인터페이스는 클래스가 아니다.
추상 클래스는 일반적으로 베이스 클래스로 상속해서 더 구체적인 클래스를 만들 때 쓰기 좋다. (기능 확장)
인터페이스는 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 때 용이하다. 예) 새와 박쥐
추상 클래스는 한 개의 클래스에 여러 개를 사용할 수 없다. (단일 상속)
인터페이스는 한 개의 클래스에 여러 개의 인터페이스를 구현할 수 있다. (다중 구현 가능)
** 출처
https://www.slideshare.net/HarisBinZahid/abstract-class-and-interface-49451395