Abstract 추상 클래스 & 메서드
- 해당 클래스/메서드가 추상 클래스/메서드임을 명시하는 예약어
- 추상 메서드(abstract method)
- 선언부만 작성하고 구현부는 작성하지 않은 채 남겨둔 메서드
- 접근제한자와 abstract 키워드의 순서는 상관없음
- 오버라이딩 메서드에는 abstract를 사용하지 않음
- 추상 클래스(abstract class)
- abstract class로 선언된 클래스
- 추상 클래스는 추상 메서드를 선언해 놓고 자식 클래스에서 메서드를 재구현하도록 유도하는 클래스, 미완성 설계도
- 추상 클래스는 추상 메서드를 포함하지 않을 수 있음
- 하지만 추상 메서드를 포함하는 클래스는 반드시 추상 클래스
- 메서드와 내용이 추상적이기에 객체를 생성할 수 없음
- static final이 아닌 필드를 가질 수 있고 public/protected/private
모두 사용 가능
- 여러 개의 추상 클래스를 상속 받을 수 없음(클래스 간 다중 상속x)
- 클래스 간, 인터페이스 간 상속은 extends 키워드 사용
- 추상 클래스의 장점
- 공통 부분을 구현/설계함으로 개발, 유지보수 용이
- 자식 클래스에게 추상 메서드를 반드시 구현하도록 강요함으로 표준화 정도를 높임
// Abstract Class/Method ex)
abstract class Animal { // abstract class로 추상 클래스 선언
int position;
// abstract method => 선언부만 작성
// 접근제한자와 abstract의 순서는 상관x
public abstract void speak();
void run() { // 일반 메서드 작성 가능
position++;
}
}
public class Cat extends Animal { // 추상 클래스를 상속
public void speak() { // 추상 메서드 구현
System.out.println("야옹");
}
}
인터페이스(Interface)
- 추상 클래스와 비슷하게 다른 클래스 작성을 돕는 목적
- 추상 클래스보다 추상화 정도가 높아 일반 메서드/변수 등을 가질 수 없음
- 구현된 것이 아무것도 없는 기본 설계도
- interface로 선언, static final 변수와 추상 메서드의 집합
- 모든 메서드는 public abstract로 선언해야한다.
- 모든 멤버 변수는 public static final로 선언해야한다.
- 둘 다 컴파일 시 자동 생성되므로 생략가능
- 인터페이스는 다중 상속을 지원, implements
- 선 extends 후 implements
- 디폴트 메서드(Default Method)
- 인터페이스에 있는 구현 메서드, default로 선언 + 구현부 존재
- java 8 이후 디폴트 메서드의 등장으로 추상 메서드만 존재할 수 있던 인터페이스에 구현 메서드도 존재
- 객체지향 5대 원칙 중 하나인 개방 폐쇄 원칙(OCP)으로 인해 생겨남
- 인터페이스에 추상 메서드를 추가시 모든 구현체에 구현을 해줘야하는 문제점을 디폴트 메서드를 사용해 추가 변경을 막아줌
=> OCP에서 확장에 개방되어 있고, 변경에 닫혀있는 코드를 설계할 수 있게 됨
// Interface ex)
public interface Person {
// public static final 생략 가능
public static final int eyes = 2;
// public abstract 생략 가능
public abstract void talk();
// default 메서드
default void defaultMethod() {
...
}
}
public class Heebum implements Person { // 인터페이스 상속
public void talk() { // 추상 메서드 구현
...
}
}
Leave a comment