본문 바로가기
Back-end

SOLID 원칙, 객체지향 프로그래밍

by 신재권 2023. 8. 22.

SOLID 란?

SOLID 원칙은 소프트웨어 디자인과 개발에서 지켜야 할 다섯 가지 원칙 입니다.

원칙들은 소프트웨어의 유연성, 확장성 및 유지보수성을 높이기 위해 고안되었고, 각 원칙은 객체 지향 프로그래밍(OOP)에 기반하며, 소프트웨어의 구조를 조직화하고 효율적인 코드를 작성하는데 도움을 줍니다.

SRP

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

각 클래스는 단 하나의 책임을 가져야 한다는 원칙입니다.

클래스가 여러가지 역할을 수행하게 되면 코드의 가독성이 떨어지고, 유지보수가 어려워질 수 있습니다.

OCP

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

기존의 코드를 변경하지 않으면서 확장할 수 있어야 합니다.

새로운 기능을 추가할 때 기존 코드를 수정하지 않고 확장 가능한 설계를 유지합니다.

  • 추상화 사용을 통한 관계 구축

LSP

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

하위 클래스는 언제나 상위 클래스를 대체할 수 있어야 합니다.

하위 타입은 상위 타입의 기대되는 동작을 해치지 않아야 합니다.

  • 하위 타입으로 부모의 메서드를 사용해도 동작이 의도대로 되야함

ISP

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

클라이언트는 자신이 사용하지 않는 메서드에 의존하도록 강요받아서는 안됩니다.

인터페이스를 작게 분리하여 필요한 메서드만 사용할 수 있도록 해야합니다.

DIP

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

고수준 모듈은 저수준 모듈에 의존해서는 안되며, 양쪽 모두 추상화에 의존해야 합니다.

상위 수준의 모듈은 하위 수준의 모듈에 의존하면 안되며, 둘 다 모두 추상화된 인터페이스나 클래스에 의존해야 합니다.

즉 직접 참조하는 것이 아닌, 대상의 상위 요소를 참조하라는 원칙입니다.

 

SOLID 원칙의 장점

SOLID 원칙을 적용하면 코드를 확장하고 유지 보수 관리가 더 쉬워지며, 불필요한 복잡성을 제거해, 리팩토링에 소요되는 시간을 줄임으로써 프로젝트 개발의 생산성을 높일 수 있습니다.

객체지향이란?

객체지향은 소프트웨어 개발 패러다임 중 하나로, 현실 세계의 개체를 소프트웨어에서 모델링하여 이들이 상호작용하도록 하는 프로그래밍 스타일 입니다.

객체란?

객체는 현실 세계의 실체를 모델링한 단위로, 상태와 동작을 가집니다. 상태는 변수로 통해 표현되고, 동작은 메서드로 표현할 수 있습니다.

객체지향 vs 절차지향?

절차지향은 프로그램을 프로시저의 연속적인 실행으로 간주합니다. 데이터와 함수가 분리되며, 프로그램의 흐름이 데이터 중심입니다.

객체지향은 프로그램을 객체들의 상호작용으로 간주합니다. 데이터와 함수가 한 단위인 객체에 캡슐화 되며, 객체들 사이의 상호작용으로 프로그램이 구성됩니다.

왜 객체지향이 등장했는가?

객체지향은 복잡한 소프트웨어 시스템을 더 잘 이해하고 구축하기 위해 등장하였습니다.

기존 절차지향 프로그래밍은 큰 프로그램에서 모듈성과 유지보수가 어려웠습니다. 객체지향은 코드를 더 모듈화하고 추상화하여 개발자가 현실 세계와 더 밀접한 모델을 만들 수 있도록 도와주었습니다.

객체지향의 장단점

장점

  • 모듈화 : 객체 단위로 코드를 구성하므로 모듈화와 재사용성이 높아집니다.
  • 유지보수 : 변경이 쉬우며, 한 객체의 수정이 다른 객체에 큰 영향을 미치지 않습니다.
  • 추상화 : 복잡한 시스템을 추상화하여 이해하기 쉽게 만듭니다.
  • 상속과 다형성 : 코드의 재사용성을 높이고 확장성을 강화합니다.

단점

  • 설계의 어려움 : 적절한 객체 분리와 관계 설정을 위해 세심한 설계가 필요합니다.

객체지향의 특징

  • 캡슐화(Encapsulation) : 객체의 데이터와 메서드를 하나로 묶고, 외부에서 직접 접근할 수 없도록 보호합니다.
  • 상속(Inheritance) : 기존 클래스의 특성을 다른 클래스가 상속받아 확장하거나 수정하여 사용할 수 있습니다.
  • 다형성(Polymorphism) : 동일한 이름의 메서드가 서로 다른 클래스에서 다르게 구현될 수 있으며, 실행 시에 어떤 메서드가 호출될지 결정됩니다. 객체기준에서는 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다.
  • 추상화(Abstraction) : 공통된 속성과 동작을 추출하여 객체를 정의하는 것으로, 객체의 복잡성을 감소시켜 이해하기 쉽게 만듭니다. 즉, 클래스들의 공통적인 요소를 뽑아 상위 클래스를 만들어내는 것 입니다.

'Back-end' 카테고리의 다른 글

동기식 vs 비동기식, Blocking vs Non-Blocking  (0) 2023.08.23
2023.08.22 TIL  (0) 2023.08.22
2023.08.21 TIL  (0) 2023.08.21
2023.08.20 TIL  (0) 2023.08.21
2023.08.20 TIL  (0) 2023.08.20