프로그래밍 정리 (SOLID 원칙, 객체지향 프로그래밍, 함수형 프로그래밍, 의존성 주입, 스레드 세이프(Thread safe), TDD)

2022. 1. 31. 19:58Android/깨알 개념 정리

SOLID 원칙

컴퓨터 프로그래밍에서 SOLID란 로버트 마틴이 2000년대 초반에 명명한 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙을 마이클 페더스가 두문자어 기억술로 소개한 것이다. 프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 함께 적용할 수 있다. SOLID 원칙들은 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩터링 하여 코드 냄새를 제거하기 위해 적용할 수 있는 지침이다.

 

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

소프트웨어 모듈은 변경의 이유가 단 하나여야만 한다.

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

모듈은 확장에 열려있고, 변경에는 닫혀있어야 한다.

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

서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다

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

사용자가 필요하지 않은 것들에 의존하게 되지 않도록, 인터페이스를 작게 유지하라.

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

고수준 정책을 구현하는 코드는 저수준 세부사항을 구현하는 코드에 절대 의존해서는 안 된다.

 

객체 지향 프로그래밍(OOP : Object-Oriented Programming)

개념

- 컴퓨터 프로그래밍 중 하나로 프로그래밍에서 필요한 데이터를 객체화시켜 상태와 행위를 가질 객체를 만들고 그 객체 간의 유기적인 상호작용을 통해 조직을 구성하는 프로그래밍 방법

- 객체지향 프로그래밍의 경우, 클래스 디자인과 객체들의 관계를 중심으로 코드 작성이 이루어진다. 따러서 상태, 멤버변수, 메서드 등이 긴밀한 관계를 가지고 있다. 특히 멤버변수가 어떤 상태를 가지고 있는가에 따라 결과가 달라짐

장점

- 코드 재사용성에 용이, 유지보수에 용이, 대형 프로젝트에 적합(모듈화 개발)

 

함수형 프로그래밍 (Functional Programming)

개념

- 순수 함수를 작성하여 프로그램으로 가독성을 높이고 유지보수를 용이하게 하여 부작용을 줄이는 프로그래밍 기법 

- 순수 함수 : 함수의 입력이 주어지면, 항상 일관된 출력이 나오며 프로그램 실행에 영향을 미치지 않는 함수 

장점

- 코드에서 프로그램의 실행에 영향을 미치는 영역과 순수한 영역을 최대한 분리함으로써, 코드 가독성 상승, 유지보수에 용이, side effect 없는 안전한 코드 구현 가능 

 

스레드 세이프(Thread safe)

테스크(task)

- 프로그램에서 작업의 단위. 프로그래밍 언어 관점에서는 어떤 작업을 수행하기 위해 순차적으로 진행되는 코드들의 묶음

스레드(thread)

- 하나의 프로세서(CPU)에서 태스크의 실행

프로세스(process)

- 실행중인 하나의 어플리케이션, 다중 프로세스 구현 가능

개념

- Multi Thread 프로그래밍에서 여러 Thread 로부터 어떤 method, variable, object에 동시 접근이 이뤄져도 프로그램 실행에 문제가 없는 것

- 하나의 동작이 한 thread로 부터 호출되어 실행 중일 때, 다른 thread가 동일한 함수를 호출하여 동시에 실행되더라도 각 thread에서 함수의 수행 결과가 바르게 나오는 것

효과 

- mvi 에서 model 이 불변성을 가지므로 다른 스레드로부터 수정하는 사이드 이펙트를 방지할 수 있음 

보장 방법

  • immutable 불변하는 객체는 무조건 Thread safety 하다. ex) String
  • only-read  읽기만 하면 Thread safety 하다.
  • 자바
    - Collections의 synchronizedXXX 사
  • kotlin
    val 키워드 사용하여 변수나 클래스 멤버 선언

    - immutable collections ex) List
    - data class 선언 후 copy() 메소드 사용
  •  

TDD (Test Driven Development)

개념

- 테스트 주도 개발 즉, 반복 테스트를 이용한 소프트 웨어 방법론으로 코드의 재사용성을 보장함

- 작은 단위의 테스트 케이스 작성 -> 테스트 진행 -> 이를 통과하는 코드 추가하는 과정을 반복하여 구현 

장점 

  •  코드 재사용 보장을 명시하므로 철저한 모듈화가 이러진다 따라서 보다 튼튼한 객체 지향적인 코드 생산
  •  개발의 목표를 명확히 하고 설계 과정에서 다양한 예외를 미리 생각 후 예방하므로 재설계 시간의 단축 
  •  TDD의 경우 자동화 된 유닛 테스팅을 전재하므로 어느 영역에서의 버그인지 명확해 지므로 디버깅 시간의 단축
  •  테스트 문서의 대체 가능 
  •  TDD의 경우 자동화된 유닛 테스팅을 전재하므로 추가 구현의 용이함

단점

  • 생산성 저하