인터페이스는 명세를 정의하고, 구현체는 명세를 구현한다.
사용자의 입장에선 세부 구현을 몰라도, 인터페이스만 알면 사용할 수 있다.
인터페이스 구현은 implements 키워드를 사용한다.
public interface Mouse {
void leftClick(); // 좌클릭
void rightClick(); // 우클릭
void scrollWheel(); // 스크롤휠
}
public class LogitechMouse implements Mouse {
@Override
public void leftClick() {
// 로지텍 마우스 좌클릭 로직 구현
}
@Override
public void rightClick() {
// 로지텍 마우스 우클릭 로직 구현
}
@Override
public void scrollWheel() {
// 로지텍 마우스 스크롤휠 로직 구현
}
}
추상 클래스는 자식 클래스가 반드시 구현해야 할 메서드를 포함하는 클래스이다.
추상 클래스 자체는 객체를 가질 수 없다.
public abstract class SchoolMember {
private final String name;
public SchoolMember(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract String getRoleName(); // 자식 클래스가 반드시 구현해야 함
public String getIntro() {
return getRoleName() + ": " + name;
}
}
public class Student extends SchoolMember {
public Student(String name) {
super(name);
}
@Override
public String getRoleName() {
return "학생";
}
}
OOP의 핵심 개념 중 하나로, 하나의 객체가 여러 타입으로 동작할 수 있는 성질이다.
인터페이스나 추상 클래스를 통해 다형성이 구현된다.
final 키워드를 통해 상속을 제한할 수 있다.
final 변수는 한 번 설정된 값을 변경할 수 없다. 참조 타입의 경우 객체의 필드를 바꿀 수는 있다. (C#의 readonly와 유사)
final 메서드는 자식 클래스에서 오버라이드 할 수 없다.
final 클래스는 다른 클래스가 상속받을 수 없다. (C#의 sealed와 유사)