* interface
* abstract는 class가 가진 것 모두 가질수 있다.
* 인터페이스는 컴파일 시점에 오로지 부모 타입의 역할만 하지만 abstract는 메소드도 만들어 사용도 가능하다.
* interface(기본적으로 abstract와 같으나 부모의 역할만 하고 type의 역할만하고 객체를 생성할수는 없으나(abstract), interface는 추상메소드와 static final 변수만 가질 수 있다. 생성자도 없고, 구현된 메소드없고 타입 역할만 하는 것이다. )
- interface : 완벽히 추상화된 구조.
- 역할 : 상위 Type으로서의 역할 - 자식(하위)클래스에 대한 type과 template을 위한 구조.
- 구문 : [접근제한자] interface 이름[extends 인터페이스,...] <- 인터페이스만 상속받을 수 있고, 인터페이스 끼리는 다중 상속이 된다.
{
구현 : [ public static final ] 변수 = 값; //[]안에 내용은 생략가능 자동으로 컴파일러가 넣어준다. 무조건 있어야 하므로
[ public abstract ] 메소드 선언;
}
-> 접근제한자에는 : publc과 package friendly만 올 수 있다. (인터페이스는 누구든 접근 가능해야 하므로 대부분 public 을 쓴다.)
* interface
- class에서 interface 상속 - 다중상속 가능
- 구문
[제한자] class 이름 extends class명 implements interface명, interface명, ....
{
}
public class A extends B implements interfaceA, interfaceB, interfaceC{
}
* uml
B <<interface>> <<interface>>
interfaceA interfaceB
^
| ^ ^
| |
A----------------------------------------
* 기본적으로 자바에서 단일 상속을 지원하는 이유
A B
---- ----
go() go()
^ ^
| |
|--------------
C
----
go()
* interface는 상위 클래스에는 추상화 된 구문만 받아오므로 아래 C에서 go()를 불러도 오버라이딩 된 C의 메소드가 불릴 것이기 때문에 다중 상속이 가능하다.
C A<<interface>>
-------- ---------------
+void go(){} -----------------> void go();
+void come(){}
|
|
V
B<<interface>>
----------------
+void come();
* class에서 interface 상속 - 다중상속가능
class ->(가 class를 상속할때) class : extends, 단일 상속
interface -> interface : extends, 다중상속
class -> interface : implements, 다중상속
- 역할 : 상위 type - 하위 class가 정의할 메소드 선언(추상)(반드시 오버라이딩하게 만들어 둠)
- 다형성에서 하위 객체를 대입할 변수의 type
- public static final 변수 = 값; (여러 곳에서 사용할 수 있는 코드값, 불변의 값을 만들때 사용)
- program의 다른 class들에서 사용할 상수값 선언->코드값, 불변의 값
- 크게 관계 없는 class들을 하나의 type으로 묶을 때 사용.
ex : 수퍼히어로
이동수단 Flyer ^
^ |
^ | --------------------------------------
| |----------------| | |
------------------------------------------- 슈퍼맨 스파이더맨 배트맨
| | |
자동차 배 비행기
* 공통적인 동작을 뽑아서 만든 인터페이스에는 Able을 뒤에 붙인다. (ex : FlyerAble)
*
project : day18
package : interfacetest
class : InterfaceTest
interface : InterfaceA
interface : InterfaceB <- InterfaceA를 상속
interface : interfaceC
package interfacetest;
public class InterfaceTest {
public static void main(String[] args) {
SubClass1 s1 = new SubClass1();
InterfaceA s2 = new SubClass1();
InterfaceB s3 = new SubClass1();
s2.methodA();
//s2.methodB();
s3.methodA();
s3.methodB();
}
}
--------
package interfacetest;
public interface InterfaceA {
public static final int CONST_A = 10;
//int CONST_A = 10;//public static final을 생략하면 컴파일러가 자동으로 만들어 준다. 위 아래 두개가 같은식이다.
public abstract void methodA();
//void methodA(); //public abstract를 생략하면 컴파일러가 자동으로 만들어 준다. 위 아래 두개가 같은식이다.(컴파일러가 자동 생성해 주는 이유는 무조건 필요하기 때문이다.
}
---------
package interfacetest;
public interface InterfaceB extends InterfaceA {
public abstract void methodB();
}
------
package interfacetest;
public interface InterfaceC {
public abstract void methodC();
}
-----
package interfacetest;
public class SubClass1 implements InterfaceB {
@Override
public void methodA() {
System.out.println("SubClass1.methodA()");
}
@Override
public void methodB() {
System.out.println("SubClass1.methodB()");
}
}
--------
================================================================================================
* interface는 class가 아니고 타입의 역할만 하는 거다. 객체화 되지 않는다.
* 추상화class는 class 되고 객체화 되고, 타입의 역할도 한다.
package interfacetest;
public class InterfaceTest {
public static void main(String[] args) {
SubClass1 s1 = new SubClass1();
InterfaceA s2 = new SubClass1();
InterfaceB s3 = new SubClass1();
s2.methodA();
//s2.methodB(); //InterfaceB에 선언된 메소드 이므로 컴파일 에러
s3.methodA();
s3.methodB();
SubClass2 su1 = new SubClass2();
InterfaceA su2 = new SubClass2();
InterfaceB su3 = new SubClass2();
InterfaceC su4 = new SubClass2();
}
}
---------
package interfacetest;
public class SubClass1 implements InterfaceB {
@Override
public void methodA() {
System.out.println("SubClass1.methodA()");
}
@Override
public void methodB() {
System.out.println("SubClass1.methodB()");
}
}
--------
package interfacetest;
public class SubClass2 implements InterfaceB, InterfaceC {
@Override
public void methodA() {
// TODO Auto-generated method stub
}
@Override
public void methodC() {
// TODO Auto-generated method stub
}
@Override
public void methodB() {
// TODO Auto-generated method stub
}
}
--------
package interfacetest;
public interface InterfaceA {
public static final int CONST_A = 10;
//int CONST_A = 10;//public static final을 생략하면 컴파일러가 자동으로 만들어 준다. 위 아래 두개가 같은식이다.
public abstract void methodA();
//void methodA(); //public abstract를 생략하면 컴파일러가 자동으로 만들어 준다. 위 아래 두개가 같은식이다.(컴파일러가 자동 생성해 주는 이유는 무조건 필요하기 때문이다.
}
-------
package interfacetest;
public interface InterfaceB extends InterfaceA {
public abstract void methodB();
}
--------
package interfacetest;
public interface InterfaceC {
public abstract void methodC();
}
'프로그래밍 > JAVA프로그래밍' 카테고리의 다른 글
5개의 로또번호 출력하기 - collection실습 (0) | 2012.07.28 |
---|---|
컬렉션(collection) (0) | 2012.07.28 |
추상화(abstract) (0) | 2012.07.28 |
다형성 - 실습 (0) | 2012.07.28 |
다형성(polymorephism) (0) | 2012.07.28 |