추상클래스는 말그대로 추상적인 클래스이다. 클래스의 객체를 생성하지 못하게 하면서 오버라이딩을 이용할때나 작업레벨을
분할할때 (대상의 범주를 잡아줄때 사용한다고 생각하면 된다.) abstract class 클래스명{}으로 표현되며 추상메소드와 일반맴
버변수, 일반 메소드로 구성이 된다. 객체 생성이 불가능 하기 때문에 다른 클래스에 상속이 되어 사용되어 진다. 객체 생성이
불가능한 이유는 불완전한 추상메소드를 포함하기 때문이다. 객체 생성이 불가능하지만 생성자까지 생성하는것이 불가능하지
는 않다.
인터페이스는 interface 인터페이스명{}으로 선언되며 추상메소드와 public static final로 표현된 맴버변수밖에 올 수가 없다.
인터페이스를 사용하는 이유는 공동작업에 대한 내용이 있을 때 사용되어 진다. 그리고 단일상속만 가능한 클래스와는 다르게
다중상속을 지원한다. 인터페이스는 추상클래스와 같이 객체 생성이 불가능하고 생성자도 생성이 불가능하다. 인터페이스에
쓰이는 추상메소드는 public abstract를 암시적으로 나타내기때문에 생략이 가능하고 맴버변수 또한 public static fanal 을 생략
할 수 있다.
아래는 간단한 예제 소스.
interface InterfaceTest1 {
// abstract public void Print(){추상메소드가 몸체를 가질경우 Error
//
// }
public abstract void Interface1_Print();
public static final int INTERFACE_1 = 10;
// public InterfaceTest1() {//인터페이스는 생성자 생성 불가능
//
// }
}
interface InterfaceTest2 {
void Interface2_Print();// 인터페이스에서 만들어지는 메소드는 public abstract을 생략하고있다.
int INTERFACE_2 = 20;// 인터페이스에서 만들어지는 변수는 public static Final을 생략하고있다.
}
interface InterfaceTest3 extends InterfaceTest1, InterfaceTest2 {// 인터페이스끼리 상속
// 가능...
@Override
public void Interface1_Print();
@Override
public void Interface2_Print();
}
abstract class AbstractClass implements InterfaceTest3 {
private int aaa = 10;
public void test(){
}
abstract public int Sum(int a, int b);
}
final class AbstractPrint extends AbstractClass implements InterfaceTest1,
InterfaceTest2 {
@Override
public int Sum(int a, int b) {
// TODO Auto-generated method stub
a = InterfaceTest1.INTERFACE_1;
b = InterfaceTest2.INTERFACE_2;
System.out.println("최종 클래스");
return a + b;
}
@Override
public void Interface1_Print() {// 인터페이스에서 상속받은 메소드 오버라이딩
// TODO Auto-generated method stub
System.out.println("<<<<<<<<<<최종 클래스에서 오버라이딩>>>>>>>>>>");
System.out.println("-----------------------------");
System.out.println("Interface1 Override");
System.out.println(InterfaceTest1.INTERFACE_1);
System.out.println("-----------------------------");
}
@Override
public void Interface2_Print() {
// TODO Auto-generated method stub
System.out.println("<<<<<<<<<<최종 클래스에서 오버라이딩>>>>>>>>>>");
System.out.println("-----------------------------");
System.out.println("Interface2 Override");
System.out.println(InterfaceTest2.INTERFACE_2);
System.out.println("-----------------------------");
// InterfaceTest2.INTERFACE_2 = 30;//static final로 지정되있기 때문에 한번 초기화하면
// 변경할 수 없다.
}
}
public class AbstractTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 0;
int b = 0;
AbstractClass abstractPrint = new AbstractPrint();// 최종클래스 인스턴스
System.out.println("<<<<<<<<<<최종 클래스에서 메소드 오버라이딩>>>>>>>>>>");
System.out.println("-----------------------------");
System.out.println(abstractPrint.Sum(a, b));
abstractPrint.Interface1_Print();
abstractPrint.Interface2_Print();
System.out.println("-----------------------------");
// AbstractClass abstractClass = new AbstractClass();//객체 생성 불가능
AbstractClass acstractClass = new AbstractClass() {// 추상클래스
@Override
public int Sum(int a, int b) {
// TODO Auto-generated method stub
a = 30;
b = 40;
System.out.println("<<<<<<<<<<추상클래스>>>>>>>>>>");
System.out.println("-----------------------------");
System.out.println(a + b);
System.out.println("-----------------------------");
return 0;
}
@Override
public void Interface1_Print() {// Interfac3의 오버라이드
// TODO Auto-generated method stub
System.out.println("-----------------------------");
System.out.println("Interface3에서 Override ");
System.out.println("-----------------------------");
}
@Override
public void Interface2_Print() {
// TODO Auto-generated method stub
System.out.println("-----------------------------");
System.out.println("Interface3에서 Override ");
System.out.println("-----------------------------");
}
};
acstractClass.Sum(a, b);
acstractClass.Interface1_Print();
acstractClass.Interface2_Print();
InterfaceTest1 interfaceTest1 = new InterfaceTest1() {
@Override
public void Interface1_Print() {
// TODO Auto-generated method stub
System.out.println("-----------------------------");
System.out.println("인터페이스1 override");
System.out.println("-----------------------------");
}
};
interfaceTest1.Interface1_Print();
new InterfaceTest1() {
@Override
public void Interface1_Print() {
// TODO Auto-generated method stub
System.out.println("-----------------------------");
System.out.println("인터페이스1 override");
System.out.println("-----------------------------");
}
}.Interface1_Print();
InterfaceTest2 interfaceTest2 = new InterfaceTest2() {
@Override
public void Interface2_Print() {
// TODO Auto-generated method stub
System.out.println("-----------------------------");
System.out.println("인터페이스2 override");
System.out.println("-----------------------------");
}
};
interfaceTest2.Interface2_Print();
}
}