Programming/Java

Java Abstract methods and Classes ( 추상메소드 , 클래스 )

besforyou999 2021. 9. 8. 22:19

 

안녕하세요 besforyou입니다

 

이 번 글에서는 Abstract Methods, Classes에 대해 소개하겠습니다

 

출처 오라클

https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

 

Abstract Methods and Classes (The Java™ Tutorials > Learning the Java Language > Interfaces and Inheritanc

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com


Abstract Class, Methods 가 뭔가요?

 

직역하면 추상 클래스, 혹은 추상 메소드로 아직 구현되지 않은 클래스 혹은 메소드라고 생각하면 됩니다.

 

추상 클래스 예시

1
2
3
4
5
public abstract class GraphicObject {
   // declare fields
   // declare nonabstract methods
   abstract void draw();
}
cs

 

추상 메소드 예시

1
abstract void moveTo(double deltaX, double deltaY);
cs

 

어떻게 쓰나요?

 

구현하지 않은 추상 클래스, 추상 메소드를 사용하려면 extends 명령어로 상속을 받고, 상속받은 클래스 혹은 메소드 내에서

 

구현해야 합니다.

 

 

예시

 

 

 

위와 같은 클래스 다이어그램이 있다고 가정하고

 

Rectangle, Line, Bezier, Circle 객체 모두 moveTo, resize, draw 기능이 필요하다고 합시다.

 

여기서 moveTo 기능은 모든 객체에서 똑같은 코드로 사용 가능하지만,

 

resize, draw 기능은 객체에 따라서 코드를 다르게 하여 사용해야 한다고 하면

 

moveTo 메소드는 GraphicObject 클래스 내부에서 구현을 하고 resize, draw는 abstract method으로 선언해두어 

 

Rectangle, Line , Bezier, Circle 모두 GraphicObject 클래스를 상속받아 구현을 할 때 abstract method 도 같이 구현

 

해주면 코드의 재사용성을 높일 수 있습니다.

 

 

코드와 같이 설명

 

1. GraphicObject class

 

1
2
3
4
5
6
7
8
9
abstract class GraphicObject {
    int x, y;
    ...
    void moveTo(int newX, int newY) {
        ...
    }
    abstract void draw();
    abstract void resize();
}
cs

 

moveTo 메소드는 모든 객체에서 같은 코드로 사용가능하므로 GraphicObject class 내부에서 구현을 하고

 

draw, resize 메소드는 객체마다 다른 코드로 사용해야 하므로 abstract method으로 선언해둡니다.

 

 

2. 상속

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Circle extends GraphicObject {
    void draw() {
        ...
    }
    void resize() {
        ...
    }
}
class Rectangle extends GraphicObject {
    void draw() {
        ...
    }
    void resize() {
        ...
    }
}
cs

 

상속(inheritance)은 extends 키워드로 super class를 상속받을 수 있습니다.

 

상속을 받고 클래스에 따라서 abstract method인 draw(), resize()를 다르게 구현하면 됩니다.

 

만약 상속받은 super class의 추상 메서드를 사용하고 싶지 않다면 super class와 마찬가지로 해당 메

 

소드를 abstract method으로 선언해주면 됩니다.

 

위 코드를 예시로 들어보겠습니다.

 

위 코드의 Rectangle 클래스가 resize() 메서드를 쓰고 싶지 않다면

 

1
2
3
4
5
6
7
 
class Rectangle extends GraphicObject {
    void draw() {
        ...
    }
       abstract void resize();
}
cs

 

super class인 GraphicObject와 마찬가지로 resize 메서드를 추상 메소드로 선언하면 됩니다.

 

 

 

이 귀찮은 걸 왜?

 

코드 재사용성(reusablility)을 높이고 유지보수가 용이하게 합니다.

 

추상 클래스, 추상 메소드를 사용한 코드는 새로운 객체를 추가하거나, 새로운 기능을 확장하기가 매우 용이합니다.

 

또한 다른 사람이 코드를 이해하기 쉽게 만들어 협업에도 좋고 작성한 코드의 재사용성을 높입니다.

 

 

아무렇게나 짠 코드는 자기가 짠 코드라고 하더라도 몇 달 뒤면 전혀 이해 안 되는 경우가 있습니다. 하지만 abstract class, 

 

method를 활용하면 다른 사람 + 자기 자신도 코드를 이해하기 쉬워져 유지보수가 편해지기 때문에 abstract를 사용합니다.