[JAVA] 추상화 : 추상 클래스와 인터페이스
객체지향 프로그래밍의 특징인 추상화를 대표하는 기능으로 추상 클래스와 인터페이스가 있다.
추상화
- 클래스간의 공통점을 찾아 공통의 조상(클래스)를 만드는 작업
추상 클래스(abstract class)
- 미완성 설계도
- 생성자 그리고 일반 메서드나 멤버변수를 가지지만 추상 메서드를 포함하고 있는 클래스
- 추상 클래스는 반드시 상속받은 자식 클래스에서 추상 메서드를 구현해야 한다.
- 추상 클래스는 추상 메서드를 가지므로 인스턴스를 생성할 수 없다.
- 추상 메서드에 abstract를 붙이는 이유는 반드시 해당 메서드를 자식 클래스에서 구현하도록 하기 위함이다.
[추상 클래스 작성]
abstract class 추상클래스{
...
}
- 추상 메서드는 선언부(함수명, 매개변수, 리턴 타입)만 정의하고 구현부를 정의하지 않은 채 남겨둔다.
- 구현부를 정의하지 않는 이유는 자식 클래스마다 메서드 내용을 다르게 구현하기 위해서이다.
- 구현부가 없기 때문에 괄호 {}가 없다.
[추상 메서드 작성]
abstract 리턴타입 추상메서드명();
[예시]
abstract class Car {
abstract void run();
}
public class Hyundai extends Car {
void run() {
System.out.println("부왕!");
}
}
public class Audi extends Car {
void run() {
System.out.println("부릉~");
}
}
public class CarExam {
public static void main(String[] args) {
// Car c = new Car(); // 추상 클래스는 인스턴스를 생성할 수 없음.
Hyundai c1 = new Hyundai();
Audi c2 = new Audi();
c1.run();
c2.run();
}
}
인터페이스(interface)
- 기본 설계도
- 추상 메서드와 달리 일반 메서드나 멤버 변수를 가질 수 없고 상수와 추상 메서드만 멤버로 가질 수 있다.
(추상 클래스보다 인터페이스가 추상화 정도가 더 높다)
- 키워드로 class 대신 interface를 사용한다.
[인터페이스 작성]
interface 인터페이스명{
public static final 상수명 = 값;
public abstract 추상메서드명();
}
- 상속이 아닌 구현이라는 용어를 사용한다.
- 모든 멤버변수는 public static final 이어야 하고, 이를 생략할 수 있다.
- 모든 메서드는 public abstract 이어야 하고, 이를 생략할 수 있다.
- 인터페이스는 인터페이스로부터만 상속(extends)받을 수 있고 여러 개의 인터페이스를 상속받을 수 있다.
(다중 상속)
- final
'최종'이라는 뜻을 가진 final 키워드는 필드, 지역 변수, 클래스 앞에 위치할 수 있다.
클래스 앞인 경우 변경∙확장∙상속 불가, 메서드 앞인 경우는 오버라이딩 불가, 변수 앞인 경우는 값 변경이 불가하다.
final class Final {
final int a = 100;
final void run() {
final int x = 3;
return x;
}
}
Final 클래스는 변경∙확장∙상속이 안 되고, int a는 변경할 수 없고, run() 메서드는 오버라이딩이 불가하다.
[인터페이스 상속]
interface 인터페이스명 extends 인터페이스1, 인터페이스2{
...
}
[인터페이스 구현]
class 클래스명 implements 인터페이스명{
// 인터페이스에 구현된 추상 클래스를 구현해야 한다.
...
}
- 인터페이스를 구현할 때 인터페이스의 추상 메서드 중 일부만 구현할 경우
abstract 키워드를 붙여서 추상 클래스로 선언해야 한다.
abstract class 클래스명 implements 인터페이스명 { ...}
- 상속(extends)과 구현(implements)을 동시에 할 수 있다.
[예시]
public interface Dog {
public int age = 4;
public void bark();
// public void sleep() {}; // 불가능
}
public class Chiwawa implements Dog{
public void bark() {
System.out.println("와르르!");
}
}
public class Poodle implements Dog{
public void bark() {
System.out.println("멍멍!");
}
}