구체성(具體性)이 없어서 그 뜻이 분명하지 않은 것
자바에서의 추상도 그 의미와 유사하다. 아직 완성되지 않은 불완전한 클래스와 메서드, 그것을 추상 메서드 그리고 추상 클래스라고 부른다.
메서드 선언만 되어 있고 메서드의 바디 (중괄호 부분) 이 없는 메서드
추상 메서드가 하나 이상 포함되어 있는 클래스
public abstract class Animal {
public abstract void speak();
public void walk() {
System.out.println("동물이 걷습니다.");
}
}
speak()
는 추상 메서드이므로 자식 클래스에서 추상 클래스를 상속받아서 무조건 구현해야한다.walk()
처럼 일반 메서드는 선택적으로 구현해도된다.public class Cat extends Animal {
@Override
public void speak() {
System.out.println("냐옹");
}
}
public class Dog extends Animal {
@Override
public void speak() {
System.out.println("왈왈");
}
}
speak()
를 강제적으로 오버라이딩해서 구현했다.walk()
는 구현하든 말든 크게 상관이 없는 것을 볼 수 있다. 또한 그냥 부모의 것을 바로 사용해도 괜찮다.1. 다형성 구현 목적이 뚜렷해진다.
2. 코드 디자인 패턴 적용
3. 코드 재사용성을 통한 객체지향적 프로그래밍
구현하고자 하는 클래스에 동일한 목적하에 동일한 기능을 수행하게끔 강제하는 클래스의 틀
implements
public static final
로 선언)public interface SmartPhone {
// 상수 선언가능!
public static final int AGE = 10;
// abstract 생략가능!
// 추상 메서드
void information();
}
// 인터페이스끼리 상속이 가능
public interface Aggressive extends Huntable, Wild {
}
// #####################################################################
// Huntable, Wild 인터페이스에서 정의한 추상메서드 모두를 Aggressive에서 사용 가능하게됨
package day10.inter.animal;
// 인터페이스는 클래스에서 다중 상속이 가능
public class Bulldog implements Pet, Aggressive {
// Pet 인터페이스의 추상메서드
@Override
public void handle() {
}
// Pet 인터페이스의 추상메서드
@Override
public boolean inject() {
return false;
}
// Aggressive 인터페이스의 추상메서드 (Huntable의 추상메서드)
@Override
public void hunt(Pet pet) {
}
// Aggressive 인터페이스의 추상메서드 (Wild의 추상메서드)
@Override
public void violent() {
}
}
public abstract class Animal {
protected int age;
}
// #####################################################################
package day10.inter.animal;
// Animal 추상클래스를 상속받아서 Cat 클래스에서 age 필드 사용 가능
public class Cat extends Animal implements Pet, Aggressive {
@Override
public void hunt(Pet pet) {
}
@Override
public void handle() {
}
@Override
public boolean inject() {
return false;
}
@Override
public void violent() {
}
}
1. 인터페이스는 추상 클래스보다 더 추상화된 개념
2. 인터페이스는 동일한 구현 및 동일한 동작을 강제하는데 초점이 맞춰져 있다.
추가)
추상 클래스는 상속이 기본 베이스.
즉, 개념 확장이 주 목적이므로 코드의 재사용성과 확장성을 고려할 때 사용한다.
인터페이스는 구현하고자 하는 객체들에게 동일한 메서드 이름을 강제한다. 나중에 객체 생성 후에 사용 방식을 강제하는 역할로 많이 사용한다.