👾 추상 클래스 (abstract class)
완전하게 구현되어 있지 않은 메서드를 가지고 있는 클래스를 의미한다.
메서드가 미완성 되어 있으므로 주로 상속 계층에서 추상적인 개념을 나타내기 위한 용도로
사용된다.
추상 클래스는 미완성된 클래스로, 직접 객체를 생성할 수 없다.
다른 클래스들이 공통적으로 가져야 하는 속성이나 메서드를 정의하는데 사용된다.
👾 추상 클래스의 특징
- 메서드가 미완성이므로 추상 클래스로는 객체를 생성 할 수 없다. 따라서 new 를 할 수 없다.
- 추상 메서드를 쓸 수 있으므로 강제성이 부여 된다.
- 추상 메서드로 만들면 이름이 똑같기를 원한다. —> 동적 바인딩을 원하니까!
- 똑같은 이름이 안되면 OCP 설계가 안된다.
👾 추상 메서드 (abstract method)
추상 메서드는 메서드의 선언만 있고, 구현이 없는 메서드이다.
추상 클래스 내에서 선언되며 하위 클래스에서 반드시 구현되어야 한다.
추상 클래스의 개념

우리가 동물을 Animal 클래스로 정의 할 수는 있지만 약간의 문제가 있다.
동물의 추상적인 개념은 알고 있지만 구체적으로 어떤 동물인지 알 수 없으므로 구체적으로 동작을
구현하기는 어렵다. 예를 들어 동물을 move() 라는 메서드를 작성했을때 동물이 움직인 다는 것은
알지만 구체적으로 날아다니는지 기어 다니는지 알 수 없다.
즉 Animal 클래스 move() 라는 메서드를 완전하게 작성 할 수 없는 것이다.
왜냐하면 각각의 움직이는 방식이 다르기 때문이다.
이런 경우 Animal 은 추상 클래스로 정의 되고, 포유류, 어류, 조류 클래스들도 마찬가지로
추상 클래스로 정의 된다.
그림을 코트로 정리해보면
자바에서는 추상 클래스를 만들기 위해 클래스 선언시!
클래스명과 메서드명 앞에 abstract 를 붙임으로써 컴파일러에게
추상 클래스와 추상 메서드임을 알려주게 된다.
추상 메서드는 작동 로직은 없고 이름만 껍데기만 있는 메서드라고 보면 된다.
즉, 메서드의 선언부만 작성하고 구현부는 미완성인 채로 남겨둔 메서드인 것이다.
(메서드의 구현부인 중괄호가 없는 형태) 보통 문법적인 측면으로 하나 이상의
추상 메서드를 포함하는 클래스를 가리켜 추상 클래스라고 정의 하기도 한다.
추상 클래스 문법 예제
// 추상 클래스 abstract class Animal{ public abstract void move(); // 추상 메서드 정의 (항상 ;으로 종료) } class Lion extends Animal{ public void move() { // 상속 받은 부모(추상) 메서드를 직접 구현 System.out.println("사자의 move() 메서드입니다."); } } public class AnimalTest { public static void main(String[] args) { Animal a = new Lion(); a.move(); // 부모(추상) 클래스로 부터 상속받은 추상 메서드를 직접 구현한 메소드를 실행 } }
추상 클래스를 상속받는 자식 클래스는 반드시 추상 메서드를 재정의 해야한다.
만약 재정의 하지 않으면 오류가 발생한다.
따라서 Lion 클래스에는 반드시 move() 메서드의 몸체를 구현해야한다.
추상 메서드 예제
package codding; abstract class Shape { int x, y; public void translate(int x, int y) { this.x = x; this.y = y; } public abstract void draw(); // 추상 메서드 선언 }
이 예제에서도 Rectangle , Circle 도형을 Shape 로 묶어서 추상화 시킨것이다.
draw() 그림을 그리다라는 메서드인데 도형들을 그림을 그릴때 동그랗게 , 세모?, 네모?
모르겠으니까 추상화를 시킨 것이다.
Shape 부모 클래스에 abstract 붙이는 이유는 DIP 시킬려고 나중에 의존을 하나에만 하면 되니까
하나에만 의존해서 호출을 편하게 한다.
class Rectangle extends Shape { int width, height; public void draw() { // 추상 메서드니까 반드시 구현 System.out.println("사각형 그리기 메소드"); } } class Circle extends Shape { int radius; public void draw() { // 추상 메서드니까 반드시 구현 System.out.println("원 그리기 메소드"); } }
public class AbstractTest { public static void main(String[] args) { //Shape s1 = new Shape(); // 추상 메서드로 객체를 생성할수 없다. Shape s2 = new Circle(); s2.draw(); } }
new Shape() —> 추상 메서드로 객체를 생성할 수 없다.
자식 클래스의 Rectangle, Circle 보면 추상 메서드니까 draw() 반드시 들어온다.
추상 메서드니까 반드시 구현해야한다.
// 실행 값 원 그리기 메소드
Share article