[CS] 객체 지향 프로그래밍

객체 지향 프로그래밍

📌 컴퓨터 프로그래밍의 패러다임 중 하나로 모든 것이 객체로 이루어져 있다는 원리를 기반으로 함. 즉, 프로그래밍에서 필요한 데이터를 모두 추상화시켜 상태와 행위를 가진 객체를 만들고, 그 객체들이 서로 맞물려 기능함.

 

🎱 특징

1️⃣ 추상화(Abstraction)

  • 객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출해내는 작업
  • 불필요한 정보는 숨기고, 중요한 정보만을 표현함으로써 프로그램을 간단하게 만드는 것

2️⃣ 캡슐화(Encapsulation)

  • 정보 은닉화를 통해 높은 응집도, 낮은 결합도를 유지할 수 있도록 설계하는 것
    → 한 곳에서 변화가 일어나도 다른 곳에 미치는 사이드이펙트를 최소화시키는 것을 의미
  • 외부에서 접근할 필요가 없는 것들은 접근 지정자 private을 사용하여 접근을 제한

** 결합도 : 어떤 기능을 실행할 때, 다른 클래스나 모듈에 얼마나 의존적인지를 나타내는 지표

3️⃣ 상속

  • 클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것
    → 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종
  • 새로운 클래스가 기존의 클래스의 데이터와 연산을 이용할 수 있게 하는 기능
  • 장점
    • 자식 클래스를 캡슐화해두면 외부에선 개별적인 자식 클래스들과 무관하게 개발 가능
    • 상위 클래스의 구현을 활용함으로써 코드 재사용성이 용이
  • 단점
    • 부모 클래스의 변경이 어려움 → 의존하는 자식 클래스들이 영향을 받음
    • 불필요한 클래스의 증가
    • 잘못된 상속 사용 → 상속받는 클래스가 부모클래스와 IS-A 관계가 아닐 때 발생
    IS-A관계 (is a relationship, inheritance) : 일반적인 개념과 구체적인 개념의 관계. 즉, 일반클래스를 구체화 하는 상황
    ex. 사람은 동물이다.

4️⃣ 다형성(Polymorphism)

  • 서로 다른 클래스의 객체가 같은 동작을 수행할 때, 각자의 특성에 맞는 방식으로 동작하는것
  • 객체 지향 프로그래밍은 하나의 클래스 내부에 같은 이름의 행위를 여러 개 정의하거나, 상위클래스 행위를 하위 클래스에서 재정의하여 사용할 수 있음

🎱 5가지 설계원칙, SOLID

1️⃣ 단일 책임 원칙(SRP, Single Responsibility Principle)

  • 클래스는 단 한개의 책임을 가져야하며, 클래스를 변경하는 이유는 단 하나의 이유여야 함
    → 한 기능의 변경에 의해 다른 기능과 관련된 코드에 영향을 미칠 수 있음

2️⃣ 개방-폐쇄 원칙(OCP, Open-Closed Principle)

  • 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 함→ 추상화와 상속을 통해 구현 가능
    → 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계

3️⃣ 리스코프 치환 원칙(LSP, Liskov Substitution Principle)

  • 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야함
    → 상속 관계가 아닌 경우 클래스들을 상속 관계로 설정하면 원칙에 위해됨
    → 상속 관계에서는 일반화 관계가 성립해야 함
  • 리스코프 치환 원칙을 지키지 않으면 OCP를 위반하게 됨

4️⃣ 인터페이스 분리 원칙(ISP, Interface Segregation Principle)

  • 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 함
    → 각 클라이언트가 필요로 하는 인터페이스들을 분리하여 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야됨

5️⃣ 의존 역전 원칙(DIP, Dependency Inversion Principle)

  • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안됨
    → 구체화된 클래스에 의존하기 보다는 추상 클래스나 인터페이스에 의존해야 함

🎱 장점

  • 이미 작성한 코드에 대한 재사용성이 높음 → 자주 사용하는 코드를 라이브러리로 만들어두면 개발 생산성이 높아짐
  • 중복되는 코드의 양이 줄어듦
  • 객체 단위로 코드가 나눠져 작성되기 때문에 디버깅이 쉽고 유지보수에 용이함.

🎱 단점

  • 처리속도가 상대적으로 느림
  • 객체가 많아지면 저장공간을 많이 차지

'CS > Software Engineering' 카테고리의 다른 글

[CS] DevOps  (0) 2024.03.04
[CS] MSA(마이크로 서비스 아키텍처)  (0) 2023.12.16
[CS] 함수형 프로그래밍  (0) 2023.12.15
[CS] 애자일(Agile) 방법론  (1) 2023.12.06
[CS] TDD :: 테스트 주도 개발  (1) 2023.12.06