OOP, 객체 지향 프로그래밍

Jiwon Yoo·2023년 10월 5일
0

CS

목록 보기
4/6

객체란?

주체(Subject)가 다른 실체를 바로 볼 때, 그 실체가 바로 객체(Object)이다. 한 마디로, 객체는 우리가 보고 느끼고 인지할 수 있는 그 모든 것을 의미한다고 할 수 있다. 그리고 객체는 속성(State)과 동작(Behavior)를 갖고 있다.

  • 속성: 객체의 특징 (Attribute/Property)
  • 동작: 객체가 할 수 있는 동작 또는 기능 (Function/Method)

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

객체 지향 프로그래밍은 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍 패러다임이다. 그렇기 때문에 객체간의 상호작용을 중시한다. 객체 지향 프로그래밍은 절차적 프로그래밍이 갖고 있던 순차적 프로그래밍 방식이라는 한계점을 보완하고자 등장했다.

절차적 프로그래밍과 객체 지향 프로그래밍 비교

자판기에서 음료를 구매하기

  • 절차적 프로그래밍은 전역 변수를 조합해 함수(Procedure)를 만들어 순차적으로 해결하는 하향식 방식
  • 객체 지향 프로그래밍은 속성과 동작의 구조화를 통해 독립적인 객체를 생성하고, 이런 객체의 조합으로 문제를 해결하는 상향식 방식

객체 지향 프로그래밍의 4가지 특징

  • 캡슐화 (Encapsulation)
  • 상속성 (Inheritance)
  • 추상화 (Abstraction)
  • 다형성 (Polymorphism)

캡슐화 (Encapsulation)

캡슐화란 추상화를 목표로 서로 연관있는 속성과 동작들을 하나의 캡슐(Class)로 결합(집합화)하는 것이다. 이를 통해 '정보 은닉'을 활용할 수 있는데, 데이터에 대한 외부 간섭을 차단해 정보를 보호할 수 있다. 사용자 입장에서 중요한 부분은 강조하고 중요하지 않는 부분은 숨기는 것이다.

<레스토랑 예시>

  • 고객은 유통 구조, 레시피 등은 알 필요가 없음 => 고객에게 과한 정보 & 기업의 민감 정보
  • 즉, 고객은 메뉴 이름, 재료, 맛 설명 등 필요 정보만 알면 됨

상속성 (Inheritance)

상속성은 Class의 속성과 동작을 타 Class(하위 Class)가 물려받아 사용하는 것을 의미한다. 이런 특징으로 재사용성과 확장성을 높여준다.

추상화 (Abstraction)

추상화는 인스턴스의 실체화를 위해 공통된 속성과 동작을 추출하고 정의하는 것을 의미한다. Class는 인스턴스(객체)를 만드는 틀로, 객체의 공통된 특징만을 갖고 있다. 그렇기 때문에 불필요한 세부 사항들은 제거해 복잡성을 줄인 단순화를 지향한다.

<자동차 예시>

  • 자동차 설계도(Class) : 추상화(틀) => 공통된 특징을 집합화
    • 속성: 색상, 바퀴, 엔진, 등..
    • 기능: 전진하기, 후진하기, 등..
  • 산출물(실체화) : 인스턴스(객체)
    • Ford Bronco, Jeep Wrangler, etc

다형성 (Polymorphism)

다형성은 기존 Class와는 별도로 상속받은 하위 Class에서 오버라이딩과 오버로딩을 통해 동작을 재정의 하는 것을 말한다.

  • 오버라이딩(Overriding)
    - 상위 Class의 동작을 하위 Class에서 쓰임새에 맞게 재정의 하는 것
  • 오버로딩(Overloading)
    - 동일 이름의 동작이 있는 경우, 매개변수의 차이에 따라 구별되며 다르게 동작함

개체 지향 프로그래밍의 설계 원칙(SOLID)

S: 단일 책임 원칙 (SRP, Single Resposibility Principle)

하나의 Class는 하나의 책임을 가져야한다.

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

확장(상속성 및 다형성)에는 열려 있으나 변경에는 닫혀 있어야 한다.

L: 리스코프 치환 원칙 (LSP, Liskov Substitution Principle)

하위 객체는 상위 객체의 정확성을 방해하지 않아야 한다.

  • 하위 객체의 특징이 변경(치환)되어도, 상위 객체는 정상적으로 동작해야 한다.

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

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

  • 단일 상위 클래스 인터페이스보단 여러개의 상위 클래스로 분리해 활용해야 한다.

D: 의존관계 역전 원칙 (DIP, Dependency Inversion Principle)

실체화가 아닌 추상화, 즉 틀의 중요성을 인지하고 의존해야 한다.

객체 지향 프로그래밍의 장단점

장점

  • 클래스 단위의 추상화, 모듈화를 통해 대규모 SW 개발이 적합
  • 클래스 단위의 수정이 용이해, 유지보수가 편리
  • 상속성 및 다형성 바탕의 높은 재사용성

단점

  • 하위 객체가 증가할 수록, 처리 속도 또한 증가
  • 설계 단계에서 높은 시간비용 발생

참고

https://velog.io/@teo/Javascript%EC%97%90%EC%84%9C%EB%8F%84-SOLID-%EC%9B%90%EC%B9%99%EC%9D%B4-%ED%86%B5%ED%95%A0%EA%B9%8C#d---dip--%EC%9D%98%EC%A1%B4%EA%B4%80%EA%B3%84-%EC%97%AD%EC%A0%84-%EC%9B%90%EC%B9%99
https://iosdevlime.tistory.com/entry/CSBasic-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%84%A4%EA%B3%84%EC%9B%90%EC%B9%99
https://www.codestates.com/blog/content/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8A%B9%EC%A7%95

profile
새싹 개발자 🌱

0개의 댓글