추상(abstract)는 실체 간에 공통되는 특성을 추출한 것을 말한다. 고양이, 개, 새 등의 실체에서 공통되는 특성은 동물이며, 동물은 구체적인 실체라기보다 실체들의 공통되는 특성을 갖고 있는 추상적인 것이라고 볼 수 있다.
new 연산자로 직접 생성자를 호출할 수 없고, 자식 객체가 생성될 때 super()
를 호출하여 추상 클래스 객체를 생성하므로 추상 클래스에서도 생성자가 반드시 필요하다.
public abstract class <클래스 이름> {
// fields
// constructor
// methods
}
메소드의 선언만 공통적으로 갖고, 그 실행 내용은 실체 클래스마다 다시 정의해야할 때가 있다. 이런 경우를 위해 추상 클래스에서는 추상 메소드를 선언할 수 있다. 추상 메소드는 abstract
키워드와 함께 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 {}가 없는 메소드를 말한다.
[public | protected] abstract <리턴 타입> <메소드 이름>(매개변수);
package ...;
public abstract class Animal { // 추상 클래스
public String kind;
public void walk() {
System.out.println("걸어다닙니다.");
}
public abstract void sound(); // 추상 메서드
}
package ...;
public class Dog extends Animal {
public Dog() {
this.kind = "포유류";
}
// 추상 메서드 재정의
@override
public void sound() {
System.out.println("멍멍");
}
}
인터페이스는 객체의 사용 방법을 정의한 타입이며, 개발 코드와 객체가 서로 통신하는 접점 역할을 해준다. 인터페이스를 통해 다양한 객체를 동일한 사용 방법으로 이용할 수 있다.
인터페이스는 객체로 생성할 수 없으므로 생성자를 가질 수 없으며 인터페이스는 상수 필드와 추상 메소드만을 구성 멤버로 가진다.
[public] interface <인터페이스 이름> {
// 상수
타입 상수이름 = 값;
// 추상 메소드
타입 메소드이름(매개변수,);
}
인터페이스에 고정된 값으로 실행 시에 데이터를 바꿀수 없다.
인터페이스에 선언된 필드는 모두 public static final
의 특성을 갖고 생략하더라도 컴파일 과정에서 자동으로 붙게 된다.
[public static final] 타입 상수이름 = 값;
인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행된다. 그러므로 인터페이스의 메소드는 실행 블록이 필요 없는 추상 메소드로 선언한다.(public abstract
를 생략하더라도 컴파일 과정에서 자동으로 붙음)
[public abstract] 리턴타입 메소드이름(매개변수,);
개발 코드가 인터페이스 메소드를 호출하면 인터페이스 객체의 메소드를 호출한다. 객체는 인터페이스에서 정의된 추상 메소드와 동일한 이름, 매개 타입, 리턴 타입을 가진 실체 메소드를 갖고 있어야 한다. 이러한 객체를 인터페이스의 구현 객채라 하고 구현 객체를 생성하는 클래스를 구현 클래스라고 한다.
기존 클래스와 달리 클래스 선언부에 implements
키워드를 추가하고 인터페이스 이름을 명시해야 한다.
public class <구현클래스이름> implements <인터페이스이름> {
// 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
}
public class <구현클래스이름> implements <인터페이스1>, <인터페이스2> {
// 인터페이스1에 선언된 추상 메소드의 실체 메소드 선언
// 인터페이스2에 선언된 추상 메소드의 실체 메소드 선언
}