자바/스프링 개발자를 위한 실용주의 프로그래밍 : 네이버 도서
네이버 도서 상세정보를 제공합니다.
search.shopping.naver.com
해당 포스팅은 '자바/스프링 개발자를 위한 실용주의 프로그래밍' 책의 CH.01 절차지향과 비교하기 파트에 대해 학습하고 정리한 내용입니다.
이번 포스팅에서는 객체 지향 프로그래밍이 무엇인가에 대한 이야기를 해보고자 한다.
이에 앞서 절차 지향 프로그래밍을 간단히 알아보고 이를 비교하여 객체 지향 프로그래밍이 무엇인지 이야기해 보겠다.
📌 절차 지향 프로그래밍
절차 지향 프로그래밍은 순차적으로 코드를 실행하며 프로그래밍을 하는 것인데, 여기에서 절차는 함수를 말한다.
즉, 함수를 설계하여 프로그래밍을 해나가는 것을 말한다고 이야기할 수 있다.
// 절차 지향적이지 않은 프로그래밍
public class NotProcedure {
public static void main(String[] args) {
int a = 4;
int b = 10;
int bigger = a > b ? a : b;
System.out.println("bigger one is " + bigger);
}
}
// 절차 지향 프로그래밍
public class Calculator {
public static int bigger(int a, int b) {
return a > b ? a : b;
}
}
public class Procedure {
public static void main(String[] args) {
int bigger = Calculator.bigger(4, 10);
System.out.println("bigger one is " + bigger);
큰 숫자를 반환해 주는 함수를 생성하여 함수를 활용한 프로그래밍을 하고 있다.
📌 객체 지향 프로그래밍
객체 지향 프로그래밍은 각 객체가 역할을 갖도록 하여 유지 보수성 높게 프로그래밍을 하는 것을 말한다. 이 문장에는 약간의 오류가 있지만, 이것은 이따 다시 이야기해 보겠다.
아래의 코드는 각 객체가 결제(pay) 기능을 수행하도록 역할을 부여했다. 객체가 역할을 갖도록 하였으니 객체 지향 프로그래밍을 했다고 할 수 있다.
public class CreditCardPayment {
public void pay(int amount) {
System.out.println("신용카드로 " + amount + "원 결제");
}
}
public class BankTransferPayment {
public void pay(int amount) {
System.out.println("계좌 이체로 " + amount + "원 결제");
}
}
// 결제 처리 로직
public class PaymentProcessor {
public void process(String type, int amount) {
if (type.equals("credit")) {
CreditCardPayment payment = new CreditCardPayment();
payment.pay(amount);
} else if (type.equals("bank")) {
BankTransferPayment payment = new BankTransferPayment();
payment.pay(amount);
}
}
}
만약 여기에서 또 다른 결제 방식이 등장한다면 어떻게 될까? CashPayment
라는 결제 방식이 추가된다면, 역할을 부여하기 위해 클래스를 만들어야 할 것이다. 뿐만 아니라, 결제 처리 로직을 담당하는 PaymentProcessor
클래스에서도 cash에 대한 분기문을 처리해줘야 할 것이다.
객체 지향 프로그래밍은 객체에 역할을 부여하여 유지보수성 높은 설계를 하는 것이라 했다.
위의 방식이 유지보수성 높은 설계인가? 누가 대답해도 아니라고 할 것이다.
🤔 그럼 어떤 것이 객체지향적인 프로그래밍일까?
만약 위의 코드를 아래와 같이 변경한다면 어떻게 될까?
public interface Payment {
void pay(int amount);
}
public class CreditCardPayment implements Payment {
@Override
public void pay(int amount) {
System.out.println("신용카드로 " + amount + "원 결제");
}
}
public class BankTransferPayment implements Payment {
@Override
public void pay(int amount) {
System.out.println("계좌 이체로 " + amount + "원 결제");
}
}
public class PaymentProcessor {
private Payment payment;
public PaymentProcessor(Payment payment) {
this.payment = payment;
}
public void process(int amount) {
payment.pay(amount);
}
}
Payment payment = new CreditCardPayment();
PaymentProcessor processor = new PaymentProcessor(payment);
processor.process(10000);
결제라는 행위를 인터페이스로 만들고, 각 객체에서 이를 구현하도록 했다. 만약 여기에서 CashPayment라는 결제 방식이 추가 된다면 어떻게 될까?
CashPayment를 제외하고는 아무것도 바뀌는 것이 없다.
여기까지 확인하고 나면, 객체에게 직접 역할을 부여했을 때와 비교해서 유지보수적인 측면에서 훨씬 큰 이점이 있다는 것을 한눈에 알 수 있다.
이제 위에서 이야기했던 ‘각 객체가 역할을 갖도록 하여 유지 보수성 높게 프로그래밍을 하는 것’ 문장을 수정해보려 한다.
📌 그래서 객체 지향 프로그래밍이 뭘까?
객체 지향 프로그래밍은 객체가 역할을 갖도록 하는 것이 아니라 역할(인터페이스)을 정의하고, 그 역할을 객체가 수행하도록 하는 방식을 말한다.
❗️위에서는 객체에 역할을 부여하는 것이 OOP가 아닌 것처럼 말을 했지만, 이것이 OOP가 아닌 것은 아니라고 확실히 말하고 싶다.
인터페이스를 만들지 않아도 유지보수성이 높은 상황이 충분히 있을 수 있기 때문이다.
다만, 많은 경우에서 위처럼 인터페이스를 만들고, 객체가 이를 구현하도록 하는 방식이 더 높은 유지보수성을 가지게 해주는 OOP 방식이라는 것이다.
🧑💻 마무리
객체 지향 프로그래밍이 무엇일까? 에 대한 생각을 정리해 본 것은 좀 됐지만, 이렇게 글로 작성해보니 생각을 정리하는 데에 도움이 많이 됐다.
객체 지향 언어가 가지는 특징이나 객체 지향 설계의 5가지 원칙인 SOLID를 학습하다 보면 객체 지향 프로그래밍은 결국 유지 보수성을 높이기 위해 만들어진 기법이라는 결론에 다다른다고 생각한다.
물론, 틀린 생각일 수 있지만 높은 유지 보수성과 협업에 좋은 프로그래밍 기법이라는 생각이 든다.
'IT 서적 > 자바&스프링 개발자를 위한 실용주의 프로그래밍' 카테고리의 다른 글
객체 지향적인 클래스 설계 방식 (0) | 2025.03.10 |
---|