본문 바로가기
  • 저희는 평생 개발할 운명이걸랑요
Tech.log/개발 상식

[객체 지향 프로그래밍(Object Oriented Programming)]

by SpaciousKitchen 2021. 4. 27.

객체 지향 프로그래밍은 인간 중심적 프로그램 패러다임이라고 할 수 있다.

현실 세계의 사물들을 Object로 보고  사물들로 부터 개발하고 자 하는 특징을 뽑아와 프로그래밍하는 것이다.

 

OOP방식으로의 코드는 재사용성이 높고  에러 또한 잘 잡아낼 수 있다.객체 단위로의 나눠진 코드는 디버깅이 쉽고 유지보수에 용이하다.

 

 

 

객체 지향적 설계 원칙

SRP(Single Responsibility Principle): 단일 책임의 원칙

 

- 클래스는 단 하나의 책임을 가져야하며, 클래스가 제공하는 모든 서비스는 하나의 책임만을 위해

존재하야한다. 책임을 분리함으로서 코드의 가독성,유지보수의 용이라는 이점이 따라온다.

하지만 모두 분리를 적용하라는 말이 아니다. 개체간의 응집력이 있다면, 병합을 결합력이 있다면, 분리를 적용해야한다.

 

출처: 넥스트리소프트

 

SerialNumber은 변화 요소라 할 수 없고 단지 고유 정보이다. 하지만 다른 항목은 특성 정보이기때문에 변경이 발생 할수있다.

만일 이러한 상황에서 특정 정보에 변화가 발생한다면, 항상 해당 클래스를 변경해야한다.

출처:넥스트리소프트

위 그림은 SRP를 적용한 것이다. 만일 특성 정보에 변경이 생긴다면 GuitarSpec만 변경하면 된다.

 

 

OCP(Open-Closed Principle): 개방 폐쇄의 원칙

-  확장은 용이하되 변경는 닫혀있어야한다.이는 요구사항 변경 및 추가에는 용이하다. 기존 구성요소의 변경은 없도록 하는 것이다.

구성요소의 확장을 통해 재사용 가능한 코드를 만드는 기반을 마련해야한다.

 

 

 1.변경 과 변하지 않을  것을 업격하게 구분한다.

2. 이 모듈이 만나는 지점에서 인터페이스를 정의한다.

3.구현에 의존하기 보다는 인터페이스에 의존하도록 한다.

출처:넥스트리소프트

위에서 다루었던 클래스이다.하지만 기타가 아닌 바이올린,비올라 첼로 같은 요소를 다루워야한다면 ??

 

이를 해결하기 위해 OCP를 적용해보자. 먼저 다른 악기들을 추상화 하는 작업이 필요하다.

모든 공통화 요소를 다룰 수 있는 추상화 작업을 진행한다.(StringInstrument 인터페이스를 사용)

 

출처:넥스트리소프트

새로운 악기가 추가되면서 발생하는 변경 부분을 추상화 하여 불리하였다. 이를 통해 수정은 최소화, 경합도는 줄이고 응집력을 높이는 효과를 볼 수 있다.

 

 

 

LSP(Liskov Substitution Principle): 리스코프 치환 원칙

- 자식 클래스는 최소한의 자신의 부모 클래스에서 가능항 행위를 수행할 수 있어야한다. 재정의, 오버로드를 하지 않는것이다. 자식 클래스는 부모의 책임을 재정의 및 무시하지 않고 확장만 수행한다.

 

 

public class Guitar {
    private int price;
    
    public void setPrice(int price){
        this.price = price;
    }
    
    public int getPrice() {
        return price;
    }
}

이와 같은 Guitar 클라스가 있다고 생각해보자

 

setPrice():가격 설정

getPrice():가격 조회

 

public class DiscountedGuitar extends Guitar{
    private double discountedRage = 0;
    
    public void setDiscounted(double discountedRate) {
        this.discountedRage = discountedRate;
    }
    
    public void applyDiscount(int price) {
        super.setPrice(price - (int)(discountedRage * price));
    }
}

DiscountedGuita 클라스는 Guitar클라스를 상속하는

 

setPricesetDiscounted():할인가 설정

applyDiscount():할인가조회

 

Guitar에서 추가로 할인가 설정 및 조회 되는 기능이 추가되었다. 기존의 Guitar 클래스에 오버로이드, 재정의 되지 않고 그대로 상속 받은 것에 추가 정의 하였다.

 

 

 

ISP(Interface Segregation Principle): 인터페이스 분리 원칙

- 인터페이스는 클라이언트 기준으로 분리해야한다. 클라이언트가 사용하는 인터페이스를 만들어야한다.

인터페이스가 지나치게 범용적으로 구현된다면, 상속받은 클라스는 자신이 사용하지 않는 인터페이스까지 구현해야하기 때문이다.

 

 

 

 

해당 인터페이스를 확인해보자.이런 상황에서 복합이는 매우 커지고, 필요에 따라 특정 기능만 사용할 것이다.

 

 

 

복합기를 사용하는 객체들마다 관심있는 메서드들만 인터페이스를 제공 받도록 설계 하였다. 이로 인해  클라이언트는 자신이 사용하지 않는 메서드의 생긴 변화에 영향을 받지 않게 되었다.

 

 

 

 

DIP(Dependency Inversion Principle): 의존 역전의 원칙

- 어떤 클라스를 참조해야하는 상황이 생긴하면, 직접 참조하기보다는 그 대상의 추상 클래스를 만들어 사용하는 원칙이다.

의존 역전의 원칙을 만족하면, 설계는 변화에 유연하다.

 

 

이 말은 의존 관계를 맺을때, 변화가 쉬운것보다 변화가 어려운 것에 의존하라는 것이다.

 

 

 

 

위 그림을 보면 Weapon은 변하기 어려운 것이고 그 하위 항목들은 변화기 쉬운 것이다.

 

인터페이스 = 변하지 않는 것
구체 클래스 = 변하기 쉬운 것

을 만족하여 설계한다. 이를 코드로 옮겨보자.

 

public class Main {

    public static void main(String[] args) {
        Person person = new Person();
        person.setWeapon(new Sword());
        person.attack();

        person.setWeapon(new Axe());
        person.attack();
    }
}

 

 


//사람이 무기를 장착

public class Person {

    private Weapon weapon;

    public void setWeapon(Weapon weapon) {
        this.weapon = weapon;
    }

    public void attack() {
        weapon.attack();
    }
}

 

//무기 공격
public interface Weapon {

    public void attack();
}

 

//무기에 따른 특징

public class Sword implements Weapon {

    @Override
    public void attack() {
        System.out.println("검으로 휘두르다.");
    }
}

public class Axe implements Weapon {

    @Override
    public void attack() {
        System.out.println("도끼로 휘두르다");
    }

}

public class Spear implements Weapon {

    @Override
    public void attack() {
        System.out.println("창으로 찌르다");
    }

}

 

 

객체 지향 프로그래밍의 단점은 함수형 프로그래밍 패러다임의 등장이다. 

 

to be continued...

 

 

 

'Tech.log > 개발 상식' 카테고리의 다른 글

[MVC 패턴이란?]  (0) 2021.05.19
[함수형 프로그래밍]  (0) 2021.05.19
[RESTFul API]  (0) 2021.05.19

댓글