A class implements an interface.
An interface is an abstract class that only contains method signatures and constant declarations. An interface doesn't contain method definitions and can't be instantiated.
A class extends another class.
The new class inherits all of the members of the base class, except those defined with "private" access modifier. New methods can be added without altering the base class, and methods can be overridden without altering the base class.
These concepts exist in many Object Oriented languages.
An example (simple... maybe not the sort of thing you'd do in the real world, but demonstrates the concept)
Lets make a data store interface (
1 2 3 4 5 | interface DataStore { void SetValue(string key, string value); string GetValue(string key); } |
This interface includes two methods, a set and a get. Now lets use this interface!
1 2 3 4 5 6 7 8 9 10 11 | public class FileDataStore implements DataStore { public void SetValue(string key, string value) { //Store the key/value pair in the file } public string GetValue(string key) { //Retrieve the value for the key from the file } } |
This FileDataStore class would work with a file. Lets say you change your mind later and you think you need a database instead to store your information. All you need to do is make a new class that implements your DataStore interface.
Now lets tackle an example of 'extends' We'll start with our base class
1 2 3 4 5 | public class Person { public string FirstName; public string LastName; } |
This person object has everything we need to know about any person.
1 2 3 4 | public class Employee extends Person { public string JobTitle; } |
Our employee object contains the same members as our Person Object (no point in duplicating code, right?) but it also has their job title.
You could pass an employee object to any piece of code that handles a person object.
class A extends B 라고 하면
A는 B라는 클래스를 상속 받아서 +a 시키겠다는 뜻이구요
class A implements C 라고 하면
A는 C라는 인터페이스를 구현하겠다~ 라는 뜻입니다.
한마디로, 클래스를 상속받느냐... ?
인터페이스를 구현하느냐...? 의 차이입니다.
▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧▧
우선, extends는 일반 클래스와 abstract클래스 상속에 사용되고, implement는 interface상속에 사용됩니다.
그럼, 상속이라는것은? 나의 부모가 부자라면, 내가 부모로부터 상속 받는 다면 나도 부자가 됩니다. 결국, 다른것으로부터 그들의 기능을 빌려다 쓴다고 생각하시면 됩니다. 자바에서의 상속은 2가지 형태가 있습니다.
하나는 extends 이고, 다른 하나는 implements인데, 첫번째는 순수 상속으로 앞에 설명 드린것처럼, 부모로부터 모든 권한과 재산과 능력을 가져 옵니다. 다른 하나는 구현상속, 이라고 합니다. 구현상속 ==> 인터페이스라고 흔히 하죠. 상속이라기 보단. 인터페이스만을 얻어 오는 겁니다. 쉽게 얘기해서, 무언가로 부터 상속은 받되, 그 상속 내용이 란게 비어 있고, 그 비어 있는 것을 내가 꼭 채워서 써야 하는 것을 의미합니다. [소스2]는 childclass2 가 TestInterface을 상속받아서 implement 했다고 생각하시면 됩니다.
다른 비유로 설명한다면, implement(구현 상속)은 조언자로 부터 조언자가 잡은 고기를 얻는게 아니라, 고기를 잡는 방법을 얻어 온다고 생각하시면 됩니다.
그럼 실례로 들어서 생각해 봅시다. 누군가가 나에게 사용자가 입력한 내용을 파일로 저장하는 모듈을 만들어 달라고 했습니다. 파일 저장형식은 1) 엑셀, 2)html, 3)텍스트 세가지의 형식으로 저장 가능하도록 해야 한다고 할때, 개발자는 3가지의 기능이 각기 서로 상이 하므로 서로다른 3개의 모듈을 만들것 입니다. 하지만, 이 모듈을 정작 사용하는 입장에서는 3개의 모듈이 모두 같은 인터페이스를 제공 해주길 바랄것입니다. 결국 자바 클래스관점에서 본다면, 서로 다른 모듈이 하나의 인터페이스로 부터 구현 상속을 받아 야 할것 입니다. 그러면, 사용자는 그 하나의 인터페이스만 보고, 코딩을 하면 될테니까요.
더 쉽게 설명 드리면,
extends: 부모로 부터 상속, implements: 조언자로 부터 상속이라고 보시면 됩니다.
세상의 모든 자식들은 하나의 부모만을 가집니다. 결국, extends을 사용해서, 차일드는 단하나의 부모로 부터 상속 받을 수 있다는거죠. 그럼, 조언자는요? 세상을 살아가는 데 여러 조언자를 만날수 있습니다. 그들은 고기 잡는 법만 알려주죠. 그들이 조언한 방식을 내나름대로 실천하는 게 바로 구현상속(implements)가 되는거죠. 결국, implements을 사용해서, 차일드는 여러 조언자를 만날수 있습니다. 그리고, 조언자는 차일드 윈도우에게 뭔가를 주는 입장이 아니므로, 모두들 interface클래스 이어야 합니다. 즉 방법만 있고, 내용이 없는 거죠.
[소스1]
public interface TestInterface {
public static int num = 8;
public void func1();
public void func2();
}
public class Test {
public void func2() {
System.out.println("func2");
}
}
[소스2]
class childclass1 extends Test{
public void func1() {
System.out.println("fun1.");
}
}
class childclass2 implements TestInterface {
public void func1() {
System.out.println("Class Test1");
}
public void func2() {
System.out.println("Class Test2");
}
}
# 출처: http://gdthink.blogspot.kr/2006/06/extends%EC%99%80-implements%EC%9D%98-%EC%B0%A8%EC%9D%B4.html