Post

Java 5, 추상화

Java의 특징, 세번째.

특징 : 추상화

어쩌면 Java에서 가장 중요하다고도 할 수 있는 ‘추상화’에 대해 정리해보겠습니다.

추상화.

Java에서의 추상화에 대해 알아보기전,
‘추상’이라는 단어의 사전적 의미를 살펴보겠습니다.
사물이나 표상(表象)을 어떤 성질·공통성·본질에 착안하여 그것을 추출(抽出)하여 파악하는 것.
Google에 검색해보니 이렇게 정의하고 있습니다.
쉽게 생각하자면 주변에 있는 사물, 혹은 어떤 개념들의 공통점들을 뽑아낸다,
즉, 공통점을 추출하는 것이라고 생각하면 편할 것 같습니다.

이번 Java에서의 ‘추상화’역시 마찬가지 입니다.
지난번 포스팅 중 제가 언급했던 말중, Java 중복되는 걸 싫어한다.
라고 작성한 적이 있습니다.
코드로 예시를 들어보자면.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Car {
    private String carName;
    private String makeCompany;
    private String color;
    private String price;

    void moveForward() {
        ...
    }

    void moveLeft() {
        ...
    }

    void moveBack() {
        ...
    }
}

이제는 익숙해진 Car클래스에.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Bike {
    private String BikeName;
    private String makeCompany;
    private String color;
    private String price;

    void moveForward() {
        ...
    }

    void moveLeft() {
        ...
    }

    void moveBack() {
        ...
    }
}

새롭게 만든 Bike클래스입니다.
제가 복사 붙여넣기로 이름만 바꿨다지만, 이미 Car클래스와 Bike클래스에
중복되는 부분이 많아보이죠?
moveForwar() 전진 기능, moveLeft() 좌회전 기능,
makeComapny, color와 같이 중복되는 속성과 기능이 많습니다.


Java는 이런 코드를 아주 싫어합니다.
이유는 쓸데 없이 리소스를 차지하기 때문이죠.
그럴 때 해결책이 오늘의 핵심인 추상화입니다.
일단 두 클래스에 겹치는 부분을 코드로 임시 작성해보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
....
private String makeCompany;
    private String color;
    private String price;

    void moveForward() {
        ...
    }

    void moveLeft() {
        ...
    }

    void moveBack() {
        ...
    }

중복되는 부분만 추출하여 코드로 작성해보았습니다.
이러면 ‘추상화’의 90%는 완성된 것입니다.
나머지 10%는 위 코드에서도 보이는 Class를 지정해주는 것입니다.

1
2
3
4
5
6
7
8
9
abstract class Vehicle {
    private String color;
    private String price;

    public abstract void moveForward();
    public abstract void moveBack();

    ....
}

이제 공통된 속성, 기능들을 묶어주는 틀 Class를 작성했습니다.
그러나 일반적인 Class처럼 접근 지정자, public 혹은 private이 아닌
abstract이 작성되어있습니다.
abstract추상 클래스를 생성할 때 사용하는 문구입니다.
단어 뜻 자체가 ‘추상적인’이라는 뜻이죠.
abstract로 선언한 클래스가 추상 클래스로 선언되는 것입니다.

그리고 자세히 보시면.

1
    public abstract void moveForward();

이 부분에서 무언가 이상한 점을 찾으셨나요?
moveForward()는 기능, 함수입니다.
하지만 저희는 함수는 항상 {} 대괄호와 같이 쓰는 걸로 알고 있습니다.
그런데 {} 가 보이지가 않네요.

그 이유는 abstract가 붙은 메소드는 추상화 메소드로 선언되기 때문입니다.
‘추상화 메소드’는 return도 메소드의 내용을 정의하는 field에도 내용을 작성할 수 없습니다.
‘어? 그럼 굳이 작성할 필요가 없는 게 아닌가?’ 라고 생각하실 수 있습니다.
‘추상화 클래스’와 ‘추상화 메소드’를 사용하는 이유는 코드로 보여드리겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
abstract class Vehicle {
    private String color;
    private String price;

    abstract void moveForward();
    abstract void moveBack();

    ....
}

public class Bike extends Vehicle {
    private String BikeName;

    public void moveForward() {
        System.out.println("This is on Bike Class!");
    }

    public void moveBack() {
        System.out.println("This is on Bike Class!");
    }
    
}

public class Car extends Vehicle{
    private String carName;

    public void moveForward() {
        System.out.println("This is on Car Class!");
    }

    public void moveBack() {
        System.out.println("This is on Car Class!");
    }
    

}

제 블로그에서 가장 긴 코드가 나왔네요 ㅎㅎ.
당황하지 말고 부분적으로 차근 차근 확인해보겠습니다.

1
2
3
4
5
6
7
8
public class Bike extends Vehicle {
    private String BikeName;

    public void moveForward() {
        System.out.println("This is on Bike Class!");
    }
    ...
}

Bike클래스부터 살펴보면 지난 번 포스팅에 나왔던 extends가 쓰였습니다.
Vehicle클래스까지 Bike클래스가 확장하겠다고 선언한 것이죠.
그런데 확장한단고 선언한 클래스 ‘추상 클래스’입니다.
추상 클래스를 확장할 땐 추상 클래스에 작성되어있는 method를 무조건 사용해야합니다.
그래서 public void moveForward() 필드에 내용이 추가되었죠.
이런 식으로 사용하는 게 추상 클래스입니다.


리턴도, 기능의 내용을 작성하는 것도 불가능하지만, 역으로 관리가 편리해
자주쓰이는 방식인 abstract 클래스와 메소드로 추상화를 작성해봤습니다.
interface도 있긴 하지만, 그건 다음에 정리해보겠습니다.

This post is licensed under CC BY 4.0 by the author.