📌 01. 추상
추상이란 미완성을 뜻한다.
추상메서드와 추상클래스가 존재하며 각각이 가지는 의미를 알아야 한다.
📖 추상메소드
추상메서드란 미완성의 메서드를 뜻한다.
추상메소드는 선언부만이 존재하고 구현부는 작성되지 않는다.
완성되지 않은 구현부 부분을 자식클래스가 오버라이딩을 통해 자신의 입맛에 맞게 사용한다.
생성자와 달리 메소드이름과 파라미터부분에 제약이 없으며 메소드를 정의할때 추상을 뜻하는
abstract를 표시해줘야 한다.
[문법]
abstract 반환타입 메소드명();
추상메소드의 사용 이유
먼저 알아야 할 것은 추상메소드의 임무이다.
추상메소드가 정의되면 해당 메소드는 자식클래스에서 반드시 재정의(오버라이드)를 해야한다.
이는 선택이 아닌 의무이고 자식클래스에서 재정의되지 않으면 오류가 난다.
즉, 추상메서드의 사용 이유는
추상 메소드가 포함된 클래스를 자식 클래스가 반드시 해당 메서드를 구현하도록 하기 위함이고
이를 통해 자식클래스들의 공통된 부분은 추상메소드를 통해 미리 만들어진 것을 사용하고
각각의 자식클래스에게 필요한 부분만을 재정의하여 사용함으써 생산성과 배포성을 향상시킨다.
📖 추상클래스
추상클래스란 쉽게 추상메소드가 포함되어 있는 클래스를 뜻한다.
메소드와 마찬가지로 클래스를 정의할때 class앞에 추상을 뜻하는 abstract를 표시해줘야 한다.
추상메소드가 포함된 클래스를 추상클래스로 정의하지 않는다면 오류가 난다.
즉, 추상클래스는 추상메소드를 통해 자식클래스들에게 기본적인 틀을 제공하는 것이다.
추상클래스는 미완성된 클래스이기 인스턴스를 가질 수 없다.(단독으로 객체화될 수 없다)
[문법]
abstract class 클래스명 {
abstract 반환타입 메소드명();
}
추상클래스는 추상메소드를 포함하고 있을뿐 일반 클래스와 다를게 없다.
즉, 추상 클래스도 일반 클래스와 마찬가지로 일반 메소드와 생성자 필드 모두 가질 수 있다.
아래코드는 위의 추상메소드가 포함된 추상클래스의 완성이다.
public abstract class AbsParent {
// field
int value = 100;
// constructor
public AbsParent(int value) {
this.value = value;
}
// method
abstract public void setValue( int n );
}
📌 02. 인터페이스
자바는 여러가지 이유로 클래스간의 다중 상속을 지원하지 않는다.
하지만 다중 상속은 그 기능을 사용하지 않기에는 너무 많은 이점을 가지고 있다.
인터페이스는 추상클래스와 마찬가지로 다른 클래스에게 기본적인 틀을 제공하면서 다중 상속을 통하여
클래스 사이의 중개자 역할까지 할 수 있는 클래스이다.
인터페이스는 추상클래스와는 다르게 생성자, 일반메소드 혹은 필드를 정의할 수 없고
오직 상수와 추상메소드만이 정의된다.
📖 인터페이스의 선언
[문법]
접근제어자 interface 인터페이스명 {
public static final 타입 상수명 = ;
public abstract 메소드명();
}
인터페이스에서 접근제어자는 생략이 가능하다.
정의되는 모든 변수가 반드시 상수여야만 하고 모든 메소드가 반드시 추상 메소드여야만 하기 때문이다.
따라서 final 혹은 abstract과 같은 제어자는 생략이 가능하다.
📖 인터페이스의 구현
인터페이스는 상속의 단계에서 상속의 개념은 같으나 해당 클래스를 구현한다는 의미로 extends 대신
implements를 쓴다.
위에 설명했던 대로 다중 구현이 가능하다.
[문법]
class 클래스명 implements 인터페이스1, 인터페이스2 {}
또한 인터페이스끼리 상속이 가능하고 다중 상속 또한 가능하다.
[문법]
접근제어자 interface 인터페이스명 extends 인터페이스1, 인터페이스2 {}
여기서 주의해야할 것은 상속은 인터페이스 끼리만 가능하고
구현은 인터페이스와 클래스사이에서 이루어진다.
📖 인터페이스 예제
인터페이스1
public interface Menu1 {
String jjajang(); // 상수이지만 final제어자가 생략
} // 반드시 추상메소드를 사용해야 하는것은 아니다.
인터페이스2
public interface Menu2 {
String jjambbong();
}
인터페이스3
public interface Menu3 extends Menu1,Menu2{ // 인터페이스간의 다중상속
String boggembab();
}
자식클래스
public class Kitchen implements Menu3{
// 인터페이스간 상속이 없었다면?
// public class Kitchen implements Menu1, Menu2, Menu3
@Override
public String jjajang() {
return "중면 + 춘장소스";
}
@Override
public String jjambbong() {
return "홍합 + 오징어";
}
@Override
public String tangsuyuck() {
return "돼지고기 + 탕수육소스";
}
}
메인클래스
public class Main {
public static void main(String[] args) {
Kitchen k = new Kitchen();
System.out.println(k.jjajang());
System.out.println(k.jjambbong());
System.out.println(k.tangsuyuck());
}
}
출력
중면 + 춘장소스
홍합 + 오징어
돼지고기 + 탕수육소스