객체지향 어떻게 하는건데

혁콩·2024년 1월 10일
0

객체지향

목록 보기
2/3
post-thumbnail

이전 포스트에서 프로그래밍 패러다임을 다뤘다. 언제 객체 지향 패러다임을 선택해야 하며 선택을 한 이유, 즉 자신만의 원칙을 가져야 한다고 했다. 그렇다면 객체 지향은 뭐고 어떻게 하는 걸까?

먼저, 객체 지향에 대해 다시 알아보자.

사물을 속성과 행위로 표현하며, 각 사물의 유기적인 결합을 통한 프로그램 제작 방법

객체 지향은 사물, 즉 객체를 속성과 행위로 표현한다. 자바에서는 클래스를 이용해서 이러한 것들을 구현한다.
클래스는 속성을 의미하는 변수와 행위를 의미하는 메소드로 구성되며, 객체를 만들기 위한 틀을 의미한다.

클래스라는 틀을 통해 생성된 것을 객체 혹은 인스턴스 라고 한다.

객체 지향의 4가지 특징

객체 지향은 상속, 다형성, 캡슐화, 추상화라는 4가지 특징을 갖는다. 이것들에 대해 간단히 설명하자면 다음과 같다.

상속

클래스가 자신의 속성, 행위를 자식에게 물려주거나, 부모로부터 물려받는 것

다형성

하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있다는 것

캡슐화

서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것

추상화

사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것

객체 지향에 대한 정리는 인터넷에 많기 때문에 굳이 정리하지 않겠다. 코드스테이츠 블로그 - 객체 지향 프로그래밍 특징 을 보면 굉장히 잘 정리된 내용을 볼 수 있다.

선택

이제 객체 지향이 뭔지도 알겠다. 요구 사항을 특징 중 한가지인 상속을 이용해 구현해보자.

음식을 관리하고 싶어. 음료수는 따로 관리할 수 있었으면 좋겠어.

지난 포스트와 동일한 요청이 들어왔다. 별 생각없이 지난번과 동일하게 코드를 작성했다.

public class Food {
    private String name;
    private boolean isSpoiled;

    public Food() {}
    public Food(String name, boolean isSpoiled) {
        this.name = name;
        this.isSpoiled = isSpoiled;
    }

    public String getName() {
        return name;
    }
}

public class Beverage extends Food {
    private boolean isSingle;

    public Beverage(String name, 
    			boolean isSpoiled, boolean isSingle) {
        super(name, isSpoiled);
        this.isSingle = isSingle;
    }
}

기능도 잘 동작하고, 상속을 통해 재사용성을 높였다. 이 때, 동료가 코드를 보더니 묻는다.

왜 상속을 이용한거야?

그야 물론 코드 재사용 때문이지! 왜 이렇게 당연한걸 물어봐?

그리고 야근을 하게 되었다.

이유

코드 재사용을 위해 상속을 했다. 또한, 음식에 관련된 요구 사항이 추가된다면 재사용성은 더더욱 높아질테니 더할나위 없이 좋아보인다. 다만, 상속을 하기 전에 고민해야 할 사항이 여럿 있다.

먼저 상속의 단점에 대해 알아보자.

  • 상위 클래스의 구현이 하위 클래스에 노출될 수 있음
  • 다중 상속이 불가함
  • 불필요한 기능의 구현이 강제될 수 있음

객체 지향은 코드의 재사용 말고도 여러 장점들이 있다. 그 중 하나가 바로 추상화에 의존함으로써 결합도를 낮추고 응집도를 최대화하여 변경 가능성을 최소화 하는 것이다.
결합도란 어떤 모듈이 다른 모듈에 의존하는 정도를 나타낸다. 즉, 낮은 결합도란 서로 의존하지 않는다는 것을 의미한다.

위 예제에선 재사용성을 얻기 위해 상속을 이용했지만, 단점들은 전혀 고려되지 않은 채 구현되었다.

요구 사항이 복잡해지고, 주기적으로 변경된다고 가정해보자. 음료를 제외한 음식에 레시피를 추가하고 싶다와 같은 것들 말이다. 요구에 맞춰 음식 구조를 바꿀 때마다 음료도 같이 바뀐다.

장점만 있는 것 같던 상속은 꽤 큰 단점도 갖고 있었다. 그렇다면 상속은 사용하지 않는게 좋을까?

결론

지난 포스트에서 했던 말이 있다.

처한 상황은 모두 다를 것이고, 동일한 상황이라도 다른 선택을 할 수 있다. 중요한 것은 선택의 이유다.

추후 추가될 클래스들을 위해 상속을 사용하여 재사용성을 높일 수 있다. 아직 추가되지 않은 요구 사항을 위해 클래스와 관계를 구성하는 작업을 하기 싫을수도 있고, 더 유연한 코드를 작성하고 싶을 수도 있다.

위와 같은 상황이라면, 나는 상속을 이용할 것이다. 여러 음식들이 들어올 수 있을 것이라 생각하며, 이 때 상속을 이용한 재사용성은 결코 무시할 수 없을 것이라 생각하기 때문이다. 별다른 행위가 요구되지도 않았으므로 상속의 단점은 크게 작용하지 않을 것이라고 생각된다.

선택 전 선택의 이유에 대해 생각하고, 선택 후 자신을 되돌아보며 좋은 선택을 하기 위한 자신만의 원칙을 세워 나간다면 좋은 개발자로 거듭날 수 있지 않을까 생각해본다.

참고 자료

코드스테이츠 블로그 - 객체 지향 프로그래밍 특징
망나니개발자-코드의 재사용
why-dev - 상속

그림 출처 : lovepik

profile
아는 척 하기 좋아하는 콩

0개의 댓글