CS/CS 정리

[CS] 프로그램 패러다임 (객체지향의 설계원칙 : SOLID)

Bueong_E 2023. 2. 13. 23:12
반응형
SMALL

오늘 변하지 않는 데이터를 동적 스크롤 UI 를 만들때 직렬화 역직렬화 하여 사용하였는데 이때 EventManager 스크립트를  싱클톤 패턴으로 사용해 특정 이밴트가 발생할때  이벤트와 값을 액션을 사용하여 상위 스크립트에게 전달하는 구조를 사용하였다.

 

싱글톤 패턴이 너무 편리하기도 했고 또 정확히 싱글톤 패턴에 대해 부족한 부분을 매꾸고자 싱글톤 패턴이란 무엇인가에 대해 좀 더 알아보던 중 싱글톤 패턴의 단점인 설계원칙인 SOLID 원칙을 위반할수 있다는 내용의 글을 읽었고 이를 좀더 찾아보기위해 검색하며 공부하다보니 프로그래밍 패러다임이란 무엇인가 까지 거슬러 올라가게 되었다;;

 

그런김에 프로그래밍 패러다임이란 무엇인지에 대해 정리해보자.

 


==프로그래밍 패러다임이란?==

 

- 프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 "개발 방법론" 이다.

 

  • 예를 들어 지금 공부중인 C#의 경우 "객체지향" 프로그래밍 언어인데 이는 프로그래머들이 프로그램을 상화작용하는 객체들의 집합으로 볼수있게 해준다.

 

  • 반면 함수형 프로그래밍은 상태값을 지니지 않은 함수값들의 연속 으로 생각할수 있게 해준다.

 

  • 어떤 언어는 여러가지 패러다임을 지원하기도 하는데 이는 C++ 과 파이썬, 그리고 자바스크립트가 대표적이라고 할수 있다.

 

프로그래밍 패러다임은 크게 선언형과 명령형으로 나뉘고 선언형은 함수형이라는 하위 집합을 가진다. 또 명령형은 객체지향, 절차지향으로 나뉜다.


 

==선언형과 함수형==

 

- 선언형 프로그래밍 ( declarative programming )

 

  • 무엇을 풀어내는가에 집중하는 패러다임 프로그램은 함수로이루어진 것이다 라는 명제가 담겨있는 패러다임이기도 하다

- 함수형 프로그래밍( functional programming )

 

  • 선언형 패러다임의 일종
  • 작은 "순수함수" 들을 블록처럼 쌓아 로직을 구현하고 "고차함수" 를 통해 재사용성을 높인 패러다임이다.
    • 여기서 순수함수란? 출력이 입력에만 의존하는것을 의미한다.
    • 그럼 고차함수란? 함수가 함수를 값처럼 매개변수로 받아 로직을 생성할 수 있는것을 말한다.
      • 고차함수를 사용하기 위해서는 해당 언어가 일급 객체라는 특징을 가져야하는데 특징은 아래와 같다
        1. 변수나 메서드에 함수를 할당할수 있어야한다.
        2. 함수 안에 함수를 매개변수로 담을 수 있다.
        3. 함수가 함수를 반환할수 있어야한다
        4. 그 외에도 커링, 불변성 등등의 특징이 있다.

 


 

==객체지향 프로그래밍==

 

- 객체지향 프로그래밍 (OOP : Object-Oriented Programing) 이란?

 

  • 객체들의 집합으로 프로그램의 상호작용을 표현한다.
  • 데이터를 객체로 취급하여 내부에 선언된 메서드를 활용하는 방식이다.
  • 단점으로는 설계에 많은 시간이 소요되고 처리속도가 다른 프로그래밍 패러다임에 비해 상대적으로 느린편이다.

- 객체 지향형 프로그래밍의 특징

 

크게 네가지 특징으로 나눌수 있다

 

  1. 추상화(abstraction) : 복잡한 시스템으로 부터 핵심적인 개념 또는 기능을 간추려 내는 것을 의미한다.
  2. 캡슐화(encapsulation) : 객체의 속성과 메서드를 하나로 묶고 일부를 외부에 감추어 은닉하는것을 의미한다.
  3. 상속성(inheritance) : 상위클래스의 특성을 하위 클래스가 이어받아서 재사용하거나 추가 확장하는것을 말한다. (이는 아래 측면에서 중요하다)
    1. 코드재사용측면
    2. 계층적인 관계생성 및 유지 보수성
  4. 다형성(polymorphism) : 하나의 메서드나 클래스가 다양한 방법으로 동작하는것을 말한다. (오버라이딩과 오버로딩이 대표적이다.

 

 

- 오버로딩(overloading)

 

  • 같은 이름을 가진 메서드를 여러개 두는것, 메서드 타입 매개변수의 유형, 개수등으로 여러개를 둘수 있다
  • 컴파일 중 발생하는 "정적" 다형성이다.

 

- 오버라이딩(overriding)

 

  •  주로 method overriding 을 말하며 상위 클래스로부터 상속받은 메서드를 하위클래스가 재정의 하는 것을 의미한다
  • 런타임 중 발생하는 "동적" 다형성이다.

 

 


 

 

==설계 원칙==

 

 

- 객체지향 프로그래밍을 설계할땐 SOLID 원칙을 지켜주어야한다.

  • S :  단일 책임 원칙
  • O : 개방 - 폐쇄 원칙
  • L :  리스코프 치환 원칙
  • I :  인터페이스 분리 원칙
  • D : 의존 역전 원칙

 

하나하나 정리해보면

 

  •  단일 책임 원칙 (SRP, Single Resposibility Principle)
    • 모든 클래스가 각각 하나의 책임만 가져야하는 원칙
  • 개방-폐쇄 원칙 (OCP, Open Closed Principle)
    • 유지보수할때 코드는 쉽게 확장될수 있어야하고 수정할때는 닫혀 있어야 하는 원칙이다.
    • 쉽게 말해 코드는 잘 변경하지 않으면서도 확장은 쉽게 할수 있어야 한다는 뜻이다.
  • 리스코프 치환 원칙(LSP, Liskov Substitution Principle)
    • 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀수 있어야 한다.
  • 인터페이스 분리 원칙 ( ISP, Interface Segregation Principle)
    • 하나의 인터페이스 보다 구체적인 여러개의 인터페이스를 만들어야 하는 원칙이다.
  • 의존 역전 원칙(DIP, Dependency Inversion Principle)
    • 자신보다 변하기 쉬운것에 의존하던것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운것의 변화에 영향받지 않게 하는 원칙이다.
    • 다른말로는 상위 계층은 하위 계층의 변화에 대한 구현으로부터 독립하여야 한다는 뜻이다.

 


 

 

==절차형 프로그래밍==

 

- 절차형 프로그래밍이란?

 

  • 로직이 수행되어야 할 연속적인 계산 과정으로 이루어져 있다.
  • 일이 진행되는 방식으로 그저 코드를 구현하기만 하면 되기에 가독성이 좋고 실행속도가 빠르다.
  • 대표적으로 포트란 등을 이용한 연산작업 및 머신러닝 배치작업이 있다.
  • 단점으로는 모듈화 하기 어렵고 유지 보수성이 떨어진다.

 

 


 

 

이상 프로그래밍 패러다임에 대해 정리해보았다.

객체지향 언어를 공부중이지만 이렇게 정리하고 보니 생각보다 당연한데도 모르고 있었거나 정리가 되어있지 않았던 부분이 많았던듯 하다.

좀더 정리하고 공부해서 객체 지향 프로그래밍 언어에 맞는 코딩을 지향 해야겠다.

 

 

참고서적 : 면접을 위한 CS 전공지식 노트  저자 : 주홍철

반응형
LIST