[내배캠] 객체지향이란?

Sungchan Ahn(안성찬)·2024년 10월 15일

내일배움캠프

목록 보기
43/104

객체지향이란?

객체(Object), 클래스(Class), 인스턴스(Instance)

객체

  • 세상에 존재하는 모든 개념

클래스

  • 객체를 설명하거나 표현하기 위한 문법

인스턴스

  • 메모리에 할당되어 있는 클래스
  • 클래스를 이용해 실제로 메모리에 생성(표현)된 객체

객체지향 프로그래밍(Object Oriented Programming, OOP)의 4가지 특징

캡슐화 (Encapsulation)

  • 객체를 설명하거나 표현할 수 있는 변수와 메서드를 하나의 단위(클래스)로 묶는 것
  • 정보를 은닉하고, 외부로부터의 직접적인 접근을 제한

추상화 (Abstraction)

  • 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
  • 공통된 부분을 클래스로 모델링
  • 불필요한 세부적인 구현을 생략하고 객체의 중요한 부분에 집중하여 핵심적인 역할만 수행

상속 (Inheritance)

  • 기존의 클래스를 활용하여 새로운 클래스를 만드는 메커니즘
  • 부모 클래스(상위 클래스, 슈퍼 클래스)의 상태와 동작을 자식 클래스(하위 클래스, 서브 클래스)가 이어 받아 재사용
  • 클래스 간 계층 구조를 구성하여 코드를 구조화

다형성 (Polymorphism)

  • 어떤 객체의 속성이나 기능이 상황에 따라 다른 역할을 수행할 수 있도록 다양한 방식으로 구현하거나 사용할 수 있는 능력
  • 동일한 이름을 가진 메서드가 여러 객체에서 다르게 동작할 수 있도록 하는 것
  • 오버로딩과 오버라이딩을 통해 구현

OOP의 5가지 원칙 (SOLID 원칙)

객체지향 설계의 핵심은 낮은 결합도와 높은 응집도
결합이 강해지면 하나를 변경할 때 연결된 다른 부분도 변경할 가능성이 높아진다.

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

  • 하나의 클래스 - 하나의 책임
  • 하나의 클래스는 최소한의 기능(하나의 기능)만을 가져야 한다.
  • 만약 클래스가 수행하는 기능이 여러 개라면 메서드 간, 클래스 간의 강한 결합을 가질 가능성이 높아진다.

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

  • 확장에는 개방(Open), 변경(수정)에는 폐쇄(Closed)
  • 확장(추가)할 때 기존의 코드를 변경하지 않아도 되게 끔 프로그램을 작성해야 한다.
  • 상속이나 인터페이스 활용

리스코프 치환 원칙 (LSP : Liskov’s Substitution Principle)

  • 자식 타입 객체는 부모 타입 객체에서 가능한 행위를 수행할 수 있어야 한다.
  • 자식 타입 객체는 부모 타입 객체로 언제든 대체할 수 있어야 한다.
  • 업캐스팅된 상태(부모 타입으로 선언 - 자식 타입의 인스턴스를 받음)에서 부모의 메서드를 수행할 수 있어야 한다.
  • 결국 Override를 잘 활용해야 한다.

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

  • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
  • 인터페이스에 변경이 발생해도 다른 인터페이스는 영향을 받지 않도록 세부적인 인터페이스로 나눈다.
  • 인터페이스를 사용하는 클라이언트를 기준으로 분리함으로써, 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공

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

  • 구체화(자주 변하는 것)에 의존하면 안 된다. 추상화(변하기 어려운 것)에 의존해라.
  • 구현 클래스에 의존하지 말고, 추상클래스나 인터페이스에 의존
  • 어떤 Class를 참조해서 사용해야하는 상황이 생긴다면, 그 Class를 직접 참조하는 것이 아니라 그 대상의 상위 요소(추상 클래스 or 인터페이스)로 참조

[참고자료] https://inpa.tistory.com/entry/OOP-💠-객체-지향-설계의-5가지-원칙-SOLID [Inpa Dev 👨‍💻:티스토리]

profile
게임 개발 기록

0개의 댓글