정의
추상 클래스(Abstract Class)
인터페이스(Interface)
클래스는 크게 일반 클래스와 추상 클래스로 나뉜다. 그 중 추상 클래스는 클래스 내 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우를 말한다.
Animal 는 breath와 feed라는 함수를 가지고 있다. 모든 동물은 숨을 쉬기 때문에 공통으로 고정된 기능이라고 할 수 있다. feed의 경우 모든 동물이 먹이를 먹으나 먹이의 종류가 다양하므로 변화를 줄 수 있는 추상메소드여야 한다. 따라서 추상 클래스로 선언하기 적합하다.
public abstract class Animal { public abstract void feed(); public void breath(){ System.out.println("들숨, 날숨"); } }
Animal 는 breath와 feed라는 함수를 가지고 있다. 모든 동물은 숨을 쉬기 때문에 공통으로 고정된 기능이라고 할 수 있다. feed의 경우 모든 동물이 먹이를 먹으나 먹이의 종류가 다양하므로 변화를 줄 수 있는 추상메소드여야 한다. 따라서 추상 클래스로 선언하기 적합하다.
인터페이스(Interface)
인터페이스는 모든 메소드가 추상 메소드인 경우를 말한다. 모든 메소드가 추상 메소드이기 때문에 인터페이스를 implements 할 경우, 반드시 추상 메소드를 구현해야 하는 성질을 가진다.
BirdBehavior 는 새가 가져야 하는 기능을 나타낸다. 모든 새는 반드시 날개를 사용하고 알을 낳는 기능이 있어야 하므로 강제성을 가져야 한다. 하지만 날개가 있으나 날지 못하는 새가 있고, 낳는 알의 크기나 개수, 알을 낳는 장소 등이 다양하므로 변화를 줄 수 있는 추상 메소드가 적합하다. 따라서 인터페이스로 선언하기에 적합하다.
public interface BirdBehavior { public abstract void wings(); public abstract void layEgg(); }
BirdBehavior 는 새가 가져야 하는 기능을 나타낸다. 모든 새는 반드시 날개를 사용하고 알을 낳는 기능이 있어야 하므로 강제성을 가져야 한다. 하지만 날개가 있으나 날지 못하는 새가 있고, 낳는 알의 크기나 개수, 알을 낳는 장소 등이 다양하므로 변화를 줄 수 있는 추상 메소드가 적합하다. 따라서 인터페이스로 선언하기에 적합하다.
차이
추상 클래스와 인터페이스는 존재 목적이 달라 쓰임새도 다르다.
추상 클래스
인터페이스
차이가 생기게 된 이유
추상 클래스
추상 클래스의 경우 추상 클래스를 상속 받아 기능을 이용하고, 확장시키는 목적을 가지고 있다.
위의 Animal 추상 클래스를 상속 받아 Sparrow 클래스를 선언해보자.
Sparrow가 Animal을 상속함으로써 Animal 클래스의 함수인 breath와 feed를 사용할 수 있게 되었다. 또한, feed를 변형시켜 Sparrow만의 feed 기능을 구현할 수 있다.
인터페이스의 경우 함수의 이름만 선언되어 있는데 이는 그 함수의 구현을 강제하기 위해서이다. 구현을 강제함으로써 구현 객체의 같은 동작을 보장하는 것이 목적이다.
위의 코드에 선언된 BirdBehavior은 새의 행동을 모아둔 인터페이스이다. 모든 새는 BirdBehavior이 가지는 함수를 가진다.
위의 Animal 추상 클래스를 상속 받아 Sparrow 클래스를 선언해보자.
public class Sparrow extends Animal { ... }
Sparrow가 Animal을 상속함으로써 Animal 클래스의 함수인 breath와 feed를 사용할 수 있게 되었다. 또한, feed를 변형시켜 Sparrow만의 feed 기능을 구현할 수 있다.
public class Sparrow extends Animal { ... public void feed(){ System.out.println("곤충, 식물을 먹음") } }
인터페이스의 경우 함수의 이름만 선언되어 있는데 이는 그 함수의 구현을 강제하기 위해서이다. 구현을 강제함으로써 구현 객체의 같은 동작을 보장하는 것이 목적이다.
위의 코드에 선언된 BirdBehavior은 새의 행동을 모아둔 인터페이스이다. 모든 새는 BirdBehavior이 가지는 함수를 가진다.
인터페이스
인터페이스의 경우 함수의 이름만 선언되어 있는데 이는 그 함수의 구현을 강제하기 위해서이다. 구현을 강제함으로써 구현 객체의 같은 동작을 보장하는 것이 목적이다.
Sparrow 클래스에 BirdBehavior 인터페이스를 implements 해보자.
Sparrow 클래스에 BirdBehavior 인터페이스를 implements 해보자.
public class Sparrow extends Animal implements BirdBehavior{ ... }
Sparrow는 BirdBehavior의 함수인 wings와 layEgg 기능을 반드시 구현해야 하므로 BirdBehavior이 가지는 모든 기능을 반드시 가지게 된다. 또한, Sparrow만의 wings와 layEgg 기능을 구현할 수 있게 된다.
public class Sparrow extends Animal implements BirdBehavior{ ... public void wings(){ System.out.println("난다!"); } public void layEgg(){ System.out.println("4-8개의 알을 낳는다."); } }
차이가 생기게 된 이유
자바는 다중 상속을 지원하지 않기 때문에 추상 클래스와 인터페이스라는 개념을 만들었다.
다중 상속이란 여러 개의 슈퍼 클래스를 두는 것을 말한다. 다중 상속은 모호성이라는 단점을 가진다. 모호성이란 애매한 것, 헷갈리는 것을 말하는데 다중 상속의 모호성은 다음과 같은 상황에서 볼 수 있다.
아래와 같이 여러 개의 슈퍼 클래스를 상속하는 Son 클래스가 있다고 가정해보자. Son 클래스는 다음과 같은 Mother과 Father 클래스를 다중 상속한다.
Son 클래스는 Mother과 Father가 가진 모든 함수를 사용할 수 있다. 이 때, Son이 hobby 함수를 사용한다면 '수영하기'가 출력될까? '축구하기'가 출력될까?
위와 같은 상황이 다중 상속의 모호성이다. 이 다중 상속의 모호성 때문에 자바는 막아놓았다.
대신 인터페이스를 만들어 여러 개의 인터페이스를 구현하여 다중 상속처럼 사용할 수 있도록 하였다.
다중 상속이란 여러 개의 슈퍼 클래스를 두는 것을 말한다. 다중 상속은 모호성이라는 단점을 가진다. 모호성이란 애매한 것, 헷갈리는 것을 말하는데 다중 상속의 모호성은 다음과 같은 상황에서 볼 수 있다.
아래와 같이 여러 개의 슈퍼 클래스를 상속하는 Son 클래스가 있다고 가정해보자. Son 클래스는 다음과 같은 Mother과 Father 클래스를 다중 상속한다.
public class Mother { public void hobby() { System.out.println("수영하기"); } } public class Father { public void hobby() { System.out.println("축구하기"); } } public class Son extends Mother, Father { ... }
Son 클래스는 Mother과 Father가 가진 모든 함수를 사용할 수 있다. 이 때, Son이 hobby 함수를 사용한다면 '수영하기'가 출력될까? '축구하기'가 출력될까?
위와 같은 상황이 다중 상속의 모호성이다. 이 다중 상속의 모호성 때문에 자바는 막아놓았다.
대신 인터페이스를 만들어 여러 개의 인터페이스를 구현하여 다중 상속처럼 사용할 수 있도록 하였다.
public class Son implements Mother, Father { public void hobby(){ } }
상속과 인터페이스 UML
상속 UML
인터페이스 UML
인터페이스 UML
댓글 없음:
댓글 쓰기