Study/TIL(Today I Learned)

24.08.20 CS, 디자인 패턴

에린_1 2024. 8. 20. 21:49
728x90

CS

객체 지향(OOP)

  • 객체 지향 프로그래밍 이란, 많은 객체(Object)들이 모여서 상호 협력하면서 데이터를 처리하는 방식의 프로그래밍 설계 방법을 말한다.
  • 프로그램을 묶음 단위로 잘게 쪼개서, 추후에 가져다 쓰기 편하게 만들어 놓은 프로그램 방식이다. 이처럼 레고 블럭을 조립하듯 컴포넌트를 유연하고 변경이 용이하기 때문에, 현업에서 대규모 소프트웨어 개발에 많이 사용된다.
    • 대표적으로 많이 알려진 Java언어를 포함하여 Ruby Python, C++, Objective-C, C#, Kotlin등이 모두 객체지향 요소를 가진 언어이다.
  • 객체 지향 프로그래밍의 반대 개념으로는, 절차적 프로그래밍(Procedure Programming) 이라는 것이 있다. 함수(function)을 이용해서 정리 정돈하는 프로그래밍 기법이라고 할 수 있다.
    • 대표적인 언어로는 C가 있다.
  • 함수를 이용해서 작은 부품을 만들고 이것을 결합해서 더 큰 프로그램을 만들어가는 테크닉이 바로 절차적 프로그래밍이다. 하지만 기술이 발전됨에 따라, 더 복잡한 어플리케이션에 대한 수요가 증가하면서 절차적 프로그래밍의 한계가 나타나기 시작했다.
  • 그래서 서로 연관된 함수(Method)와 변수(Variable)을 모아서 박스(레고)를 만들고 거기에 이름을 붙여서 정리정돈을 한 수납상자를 만들었는데 이것이 바로 Class이다.
  • 이 클래스를 중심으로 프로그램의 구조를 만들어 나가는 프로그래밍 방법론이 객체 지향 프로그래밍(Object Oriented Programming) 인 것이다.

추상화(Abstraction)

  • 컴퓨터 과학에서도 추상화를 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는것을 말한다.
  • 프로그래밍에서의 추상화는 클래스를 정의할 때 불필요한 부분들을 생략하고 객체의 속성 중 중요한 것에만 중점을 두어 개략화 하는 것을 말한다.
  • 즉, 클래스들의 중요하고 공통된 성질들을 추출하여 부모(슈퍼) 클래스를 선정하는 개념과, 이벤트 발생의 정확한 절차나 방법을 정의하지 않고 대표할 수 있는 표현으로 대체하는 것을 말한다.
  • 객체 지향 프로그래밍의 추상화는 크게 두 가지로 나뉘는데, 객체의 관련 속성 만 표시 - 데이터 추상화 하고, 불필요한 세부 정보는 숨긴다 - 제어 추상화 가 있다.
  • 제어 추상화
    • 제어 추상화는 어떤 클래스의 메소드를 사용하는 사용자에게 해당 메소드의 작동방식과 같은 내부 로직을 숨기는 것을 말한다.
    • 핵심은 보다 프로그래밍을 빠르게 설계하고 구현하기 위해 추상화를 사용하는 것이다.
  • 데이터 추상화
    • 대상을 간단한 개념으로 일반화 하는 과정을 말한다

상속(Inheritance)

  • 객체들 간의 관계를 구축하는 방법을 말한다.
  • 추상화를 통해 분리한 추상 개념 정보들을 서로 이었는데, 이것을 상속이라고 한다. 즉, 상위 클래스의 속성(변수)과 기능(메소드)을 재사용하여(상속) 하위 클래스가 전부 물려 받는 것을 말한다.
  • 중복 속성 제거
    • 상속 기능을 이용하게 되면, 상위 클래스의 특징을 하위 클래스에서 상속받아 코드의 중복 제거, 코드 재사용성 증대효과도 누릴 수 있다.

다형성(Polymorphism)

  • 같은 자료형에 여러가지 타입의 데이터를 대입하여 다양한 결과를 얻어낼 수 있는 성질을 의미한다. 이를 통해 조상 클래스의 참조 변수로 자손 클래스의 참조 변수를 다루거나, 동일한 이름을 같은 여러 형태의 메소드를 만들 수 있다.
  • 오버로딩, 오버라이딩, 인터페이스, 추상메소드, 추상클래스 방법이 속한다고 생각하면 된다.
  • 즉, 다형성은 클래스가 상속 관계에 있을 때 나타나는 다채로운 성질인 것이다.

캡슐화(Encapsulation)

  • 캡슐화란 쉽게 말하면 변수나 메소드들을 캡슐로 감싸서 안보이게 하는 정보 은닉 개념중 하나이다.
  • 이처럼 캡슐화는 객체의 속성(Field)과 행위(Method)를 하나로 묶고, 외부로 부터 내부를 감싸 숨겨 은닉한다. 또한 외부의 잘못된 접근으로 값이 변하는 의도치 않는 동작을 방지하는 보호 효과도 누릴 수 있다.

정보 은닉

  • 정보 은닉은 객체지향 언어적 요소를 활용하여 객체에 대한 구체적인 정보를 노출시키지 않도록 하는 기법을 칭한다.

참조

https://inpa.tistory.com/entry/OOP-캡슐화Encapsulation-정보-은닉의-완벽-이해

https://inpa.tistory.com/entry/OOP-JAVA의-다형성Polymorphism-완벽-이해

https://inpa.tistory.com/entry/OOP-객체-지향-프로그래밍-개념과-추상화-설계의-이해

디자인 패턴

싱글톤 패턴(Singleton Pattern)

  • 싱글톤 패턴이란 단 하나의 유일한 객체를 만들기 위한 코드 패턴이다. 쉽게 말하자면 메모리 절약을 위해, 인스턴스가 필요할 때 똑같은 인스턴스를 새로 만들지 않고 기존의 인스턴스를 가져와 활용하는 기법을 말한다.
  • 우리가 전역 변수라는 걸 만들어 이용하는 이유는, 똑같은 데이터를 메서드마다 지역 변수로 선언해서 사용하면 무의미하지도 않고 낭비이기 때문에, 전역에서 한번만 데이터를 선언하고 가져와 사용하면 효율적이기 때문이다.
  • 이러한 개념을 그대로 클래스에 대입한 것이 싱글톤 패턴이라고 이해하면 된다. 따라서 보통 싱글톤 패턴이 적용된 객체가 필요한 경우는 그 객체가 리소스를 많이 차지하는 역할을 하는 무거운 클래스일때 적합하다.
  • 싱글톤 클래스는 고정된 메모리 영역을 가지고 하나의 인스턴스만 사용하기 때문에 메모리 낭비 방지할 수 있으며, DBCP(Database Connection Pool)처럼 공통된 객체를 여러개 생성해야 하는 상황에서 많이 사용된다.
  • 하지만 싱글톤 패턴은 얻는 이점과 더불어 문제점을 수반하기 떄문에 trade-off를 잘 고려해야 한다.

싱글톤의 문제점

  1. 모듈간 의존성이 높아진다.
    • 대부분의 싱글톤을 이용하는 경우 인터페이스가 아닌 클래스의 객체를 미리 생성하고 정적 메소드를 이용해 사용하기 때문에 클래스 사이에 강한 의존성과 높은 결합이 생기게 된다.
    • 즉, 하나의 싱글톤 클래스를 여러 모듈들이 공유를 하니까, 만일 싱글톤의 인스턴스가 변경되면 이를 참조하는 모듈들도 수정이 필요하게 된다.
    • 또한 클라이언트 코드에서 너무 많은 곳에서 사용하면 클래스 간의 결합도가 높아져 오히려 패턴을 사용 안하느니만 못하게 될 수도 있다.
  2. S.O.L.I.D 원칙에 위배되는 사례가 많다.
    • 싱글톤 인스턴스 자체가 하나만 생성하기 떄문에 여러가지 책임을 지니게 되는 경우가 많아 단일 책임 원칙을 위반하기도 하고, 싱글톤 인스턴스가 혼자 너무 많은 일을 하거나, 많은 데이터를 공유시키면 다른 클래스 간의 결합도가 높아지게 되어 개방-폐쇄 원칙에도 위배된다.
    • 따라서 싱글톤 인스턴스를 너무 많은 곳에서 사용할 경우 잘못된 디자인 형태가 될 수도 있다.
  3. TDD 단위 테스트에 애로사항이 있다.
    • 싱글톤 클래스를 사용하는 모듈을 테스트하기 어렵다.
    • 단위 테스트를 할 때, 단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행 할 수 있어야 하는데, 싱글톤 인스턴스는 자원을 공유하고 있기 떄문에, 테스트가 결함없이 수행되려면 매번 인스턴스의 상태를 초기화시켜주어야 한다.

참조

https://inpa.tistory.com/entry/GOF-💠-싱글톤Singleton-패턴-꼼꼼하게-알아보자

728x90

'Study > TIL(Today I Learned)' 카테고리의 다른 글

24.08.22 CS, C++  (0) 2024.08.22
24.08.21 CS  (0) 2024.08.21
24.08.19 네트워크  (0) 2024.08.19
24.08.16 CS, C#, DEV  (0) 2024.08.16
24.08.14 CS, Dev  (0) 2024.08.14