객체지향
Object-Oriented Programming
공부했던 내용과 질문 받았던 내용들을 정리해보자.
Q. 객체지향이란 무엇인가?
현실 세계의 사물이나 개념을 '객체'로 보며 상태와 행위를 갖춘 상태로 다른 객체와 협력하며 문제를 해결하는 방식을 의미합니다. 다른 객체와 협력하는 과정에서 메시지를 통해 요청/응답을 하며 이러한 메시지를 처리하기 위해 메서드를 통해 처리하게 됩니다.
또한, 객체는 협력적이어야 하며, 충분히 자율적이어야 합니다.
객체는 다른 객체의 요청에 응답할 뿐이며 어떻게 응답할 것인지는 스스로 판단하고 결정한다.
손님은 음료를 주문할 때 직원은 어떻게 바리스타에게 전달할지 스스로 결정한다.
Q. 더 쉽게 설명할 수는 없을까요?
카페를 예로 들어보겠습니다:
1. 손님은 “아메리카노 한 잔 주세요”라고 주문합니다(요청).
2. 직원은 이 요청을 듣고, 아메리카노를 만들어 손님에게 제공합니다(응답).
여기서:
손님과 직원은 각각 객체입니다.
손님은 요청을 하고, 직원은 요청을 처리합니다.
직원이 어떻게 커피를 만드는지는 손님이 알 필요가 없습니다(캡슐화).
직원은 자신의 역할에 맞게 일을 처리하며, 손님에게 요청에 대한 결과를 반환합니다(자율성).
Q. 객체(Object)란 무엇인가요?
상태가 있고 행동을 하는 실체를 객체라고 합니다.
'사람'도 객체라고 볼 수 있는데, 이름, 나이같은 상태가 있고 걷기, 먹기 등 다양한 행동을 할 수 있습니다.
Q. 클래스(Class)는 무엇인가요?
어떠한 속성이 있고 어떠한 행동하는지를 기술한 설계도를 말합니다.
차의 설계도는 차가 아니지만, 이를 기반으로 차를 만들 수 있습니다.
객체의 설계도(클래스)도 객체가 아니지만, 이를 기반으로 객체를 만들 수 있습니다.
// Car 클래스
public class Car {
private String name;
private double speed;
public void start() { ... }
public void stop() { ... }
}
// 클래스의 인스턴스(객체)를 만든다.
Car myCar = new Car("tesla");
Car yourCar = new Car("Benz");
Q. 유틸리티 클래스는 객체지향인가?
public class NumberUtils {
private NumberUtils() {
throw new UnsupportedOperationException("Utility class");
}
public static String formatWithCommas(int number) {
// 숫자를 천 단위로 쉼표를 찍어주는 메서드
}
}
위처럼 유틸리티 클래스는 인스턴스화를 할 수 없으며 정적 메서드만을 가지고 있으며 상태를 가지고 있지 않는 구조이다. 이러한 유틸리티 클래스는 DRY(Don't Repeat Yourself) 원칙을 잘 따르고 중복을 피하는 장점이 있는 것이다. 하지만, 객체지향적인 프로그래밍 방법이 맞는 것일까?
이러한 방식을 사용할 경우, 해당 유틸리티 클래스에 강한 결합도가 생기게 된다. 이러한 결합도를 해결할 수 있는 방법은 무엇일까? 위의 코드에서 숫자를 천 단위로 쉼표를 찍는다고 하였는데, 만 단위, 십만 단위로 변경이 된다 할 경우라면?..
정리해보자면, 유틸리티 클래스는 객체지향적이지 않다. 객체지향 패러다임은 객체를 인스턴스화하여 행위를 구현해야 하는데 그렇지도 않으며, 객체라는 것은 식별 가능하다는 특징이 있어야 하는데 new 키워드를 통해 인스턴스화 된 객체처럼 '식별자'가 없다는 점도 이상하다.
Q. 유틸리티 클래스와 비슷한 싱글톤은 객체지향적인가?
싱글톤 패턴은 1개의 객체 공유해서 사용하는 특징을 가진다. 즉, 객체를 가지고 다른 객체와 협력을 한다. 스프링의 서비스 레이어를 예시로 들자면, 컨트롤러의 요청을 받아 처리한 후 응답을 하는 협력적인 존재이다.
하지만, 의문이 드는 것은 객체지향에서의 객체는 상태(state)를 가지는데, 싱글톤 객체가 상태를 가지는 것은 멀티 스레드 환경에서 적합한 상황인가? 또한, 이는 유틸리티 클래스와 비슷하게 식별자가 없는 존재인 것이다.
스프링 IoC 컨테이너는 스프링 빈 스코프를 싱글톤을 통해 사용한다. 스프링의 목적은 좋은 객체지향 애플리케이션을 만드는 것을 도와주는 것이다. 이러한 관점에서 조금 이상하다고 생각이 드는데..
Reference
Last updated