본문 바로가기
자바

객체지향적으로 개발해야 하는 이유

by 이상한나라의개발자 2023. 12. 11.
  • 객체지향 프로그래밍이란 절차지향적인 개발 방법에서 발생하던 여러가지 문제점들을 해결하기 위해 등장한 패러다임 
  • 객체지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용합니다.
     
    • 레고 블럭 조립하듯이
    • 키보드, 마우스 갈아 끼우듯이
    • 컴퓨터 부품 갈아 끼우듯이
    • 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법

  • 객체지향 프로그래밍은 컴퓨터의 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것입니다. 객체는 메시지를 주고 받고, 데이터를 처리할 수 있습니다(협력)

    • 실세계와 객체 지향을 1:1로 매칭 x
    • 그래도 실세계의 비유로 이해하기에는 좋음
    • 역할과 구현으로 세상을 분리

 

캡슐화는 데이터(변수)와 해당 데이터를 처리하는 코드(메서드)를 하나의 객체로 결합 하는 과정을 의미합니다.

이로인해, 클래스 내부의 데이터는 보호되며 객체의 잘못된 변경이나 접근으로 부터 보호 하며 응집력이 높아집니다.

 

코드를 보고 비교 해봅시다.

 

public class Product {
    
    public String name;
    public Integer price;
    public Integer amount;
}

class ProductFunction {
    public static Integer getTotalAmount(Product product) {
        return product.price * product.amount;
    }
}

class SomeClass {
    public void someMethod(Product product) {
        Integer totalAmount = ProductFunction.getTotalAmount(product);
        // 추가 로직
    }
    
    public void anotherMethod(Product product) {
        Integer totalAmount = ProductFunction.getTotalAmount(product);
        // 추가 로직
    }
}

 

public class ProductCorrect {
    
    private String name;
    private Integer price;
    private Integer amount;
    
    public Integer getTotalAmount() {
        return price * amount;
    }
}
class ProductFunctionCorrect {
    public void someMethod(ProductCorrect product) {
        Integer totalAmount = product.getTotalAmount();
        // 추가로직
    }
    public void anotherMethod(ProductCorrect product) {
        Integer totalAmount = product.getTotalAmount()
        // 추가 로직
    }
}

 

아래 코드는 어떤 메시지를 보내는 기능을 구현 했다고 합시다. 

소스 코드를 보면 Client 클래스에서 객체를 생성하고 있습니다. 만약, 우리가 테스트 환경에서 메시지를 보내야 하는 경우 어떻게 해야 할까요? Client 클래스의 객체 생성 부분을 FakeMessageSender 로 변경 하여야 합니다. 

 

public class WithInterfaceExampleMain {
    public static void main(String[] args) {
        Client client = new Client();
        client.doMethod();
    }
}

public class Client {

    public void doSomething() {
    	RealMessageSender realMessageSender = new RealMessageSender();
        realMessageSender.send();
    }
}


public class RealMessageSender {
    public void send() {
        System.out.println("real send message");
    }
}

public class FakeMessageSender {
    public void send() {
        System.out.println("fake send message");
    }
}

 

아래처럼 코드를 변경하면 Main 메서드에서 주입되는 객체를 변경하면 됩니다. 물론 Real, Fake 사용하려면 소스를 고쳐야 하는거 아니냐는 의문이 드실 수 있는데요. 저희가 주목해야 할 점은 Client 클래스는 변경되지 않는다는 것 입니다.

Spring와 같은 프레임워크를 사용하면 객체에 대한 주입은 프레임워크가 대신 처리하니까요. 

 

public class WithInterfaceExampleMain {
    public static void main(String[] args) {
        MessageSender messageSender = new FakeMessageSender();
        Client client = new Client(messageSender);
        client.doSomething();
    }
}

public interface MessageSender {
    void send();
}

public class Client {

    private final MessageSender messageSender;

    public Client(MessageSender messageSender) {
        this.messageSender = messageSender;
    }

    public void doSomething() {
        messageSender.send();
    }
}

public class RealMessageSender implements MessageSender {
    @Override
    public void send() {
        System.out.println("real send message");
    }
}

public class FakeMessageSender implements MessageSender {
    @Override
    public void send() {
        System.out.println("fake send message");
    }
}
 

'자바' 카테고리의 다른 글

예외  (0) 2023.12.11
캡슐화  (0) 2023.12.11
추상클래스와 인터페이스  (0) 2023.12.11
상속과 다형성 기본  (0) 2023.12.11
동시성 이슈  (2) 2023.12.11