본문 바로가기

Computer Science/etc.

< OOP > 객체 지향 프로그래밍이란?

1. 객체 지향 프로그래밍이란

* OOP란

 - 객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나로, 프로그램을 '객체'의 모임으로 파악하고자 하는 것이다. 객체 지향 프로그래밍은 유연하고 변경이 용이할 뿐만 아니라 유지 보수가 쉽기 때문에 대규모 SW개발에서 자주 사용된다.

 

* 구성 요소

 - 클래스(Class)

    같은 종류의 집단에 속하는 속성과 행위를 정의한 것이다. 위의 예시에서 스마트폰에 해당한다. 객체지향 프로그램의 기본적인 사용자 정의 데이터형이다. 클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인하여야 한다.

 

 쉽게 말해 클래스는 비슷한 구조를 계속 만들어 내기위한 일종의 틀이다. 내부에 속성이나 메서드들이 정의되어 있다.

 

 - 객체(Object)

  객체는 구현된 모든 대상을 의미한다. 클래스의 설계로 구현된 대상들을 포함하며, 추상적이고 포괄적인 개념이다.

 

  객체는 자신 고유의 속성을 가진다. 위의 예시에서 "안드로이드폰은 안드로이드OS를 탑재하였다.", "아이폰은 충전단자로 라이트닝 8핀을 사용한다." 등이 있다. 객체의 행위는 클래스에 정의된 행위에 대한 정의를 공유함으로써 메모리를 경제적으로 사용한다. 스마트폰에서 충전이 필요하다, 사각형이다 등을 공유받을 것이다.

 

 - 인스턴스(Instance)

 관게를 나타낼 때 주로 사용하는 명칭이다. 예를 들어 삼성폰클래스로 구현된 객체가 있다면 그 객체는 삼성폰의 인스턴스이다.

 

 인스턴스는 객체가 메모리에 할당되어 실제 사용되고 있음을 의미한다.

 

 - 메서드(Method)

 클래스로부터 생성된 객체를 사용하는 방법으로서 객체에 명령을 내리는 메시지이다. 전원버튼을 꾹 누르면 로고와 함께 폰이 종료된다 등을 가질 수 있다.

 

class SmartPhone {
  constructor(logo) {
    this.battery = 0;
    this.logo = logo;
  }

  charge() {
    if (this.battery < 100) {
      this.battery ++
      alert(`${this.battery}% 충전됨`);
    } else {
      alert('충전완료');
    }
  }

  onButton() {
    alert(`${this.logo}`);
    alert('Good Bye');
  }

}

class AndroidPhone extends SmartPhone {
  constructor(logo) {
    super(logo);
    this.os = 'android'
  }
  
  show() {
    alert(`${this.os}`);
  }

  onButton() {
    super.onButton(); // 부모 클래스의 onButton을 호출
    this.show(); // 안드로이드 로고를 보여줌
  }
}

let myPhone = new AndroidPhone("안드폰");

myPhone.charge(); // 1% 충전됨
myPhone.charge(); // 2% 충전됨
myPhone.charge(); // 3% 충전됨
myPhone.onButton(); 
// 안드폰
// Good Bye
// android

 

2. 특징

 대표적인 객체지향 프로그래밍 언어인 Java, C++, Ruby, Python 등은 모두 클래스 기반의 언어이다. 이들 모두 클래스로 객체의 자료구조와 기능을 정의하여 객체지향 프로그래밍 언어로 불린다. 그러나 자바스크립트도 프로토타입 기반 언어이지만 이를 활용하여 객체지향 언어를 구현한다. 최근 ES6 이상의 문법에서는 Class 가 도입되었다. 내부적으로는 프로토 타입기반이지만 객체지향 언어의 특징을 활용할 수 있다는 점에서 의미가 있다. 위의 코드는 자바스크립트를 이용하여 클래스를 사용한 예시이다. 

 

* 추상화

  불필요한 정보는 숨기고 중요한 정보만을 표현하는 것을 의미한다. 위의 예시의 경우, 공통되는 특징들을 묶어서 스마트폰이라는 추상화가 이루어졌다.

* 캡슐화

 프로그램 코드에서 변수와 함수는 분산되어 있기 때문에 재활용이 불편하다. 그러나 객체지향에서 기능과 특성을 클래스에 모으면 관련된 기능을 사용하기 용이해진다. 

* 상속

 객체지향프로그래밍에서 상속은 어떤 클래스를 확장하여 클래스를 만들 수 있음을 의미한다. 상위 클래스(Super Class)의 모든 속성과 메서드를 하위클래스로 물려줄 수 있다. 이 때 물려받은 것들을 그대로 사용할 수도 있고, 커스텀할 수도 있다.

 

 위 코드에서 AndroidPhone은 기존의 SmartPhone을 상속 받은 예시이다. 상속받은 charge메서드를 정의없이 사용할 수 있을 뿐만 아니라 super을 이용해서 일부 변경하여 확장도 하였다.

 

* 다형성

  하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것을 의미한다. 즉 오버라이딩과 오버로딩이 가능하다는 얘기이다. 위에서도 onButton이 부모 클래스와 다르게 동작함을 알 수 있다.

 

 - 오버라이딩(OverRiding) : 부모 클래스의 메서드와 같은 이름, 매개 변수를 재정의 하는 것.

 - 오버로딩(OverLoading) : 같은 이름의 함수를 여러개 정의하고, 매개변수에 따라 다르게 호출할 수 있게 하는 것.

 

 하위클래스가 물려받은 메서드를 오버라이드하여 커스텀하는 것은 매우 중요한 의미를 가진다. 이를 통해 같은 이름의 메서드임에도 상황에 맞는 다른 실행결과를 보여줄 수 있다. 

 

 다형성을 통해 유사한 클래스가 추가될 경우 유지보수가 용이하고 각 자료형마다 다른 메서드를 호출할 필요가 없으므로 조건문도 효율적으로 줄일 수 있다.

 

3. 장단점

* 장점

 - 코드의 재사용성이 증가한다. 위의 코드에서 봤듯이 부모 클래스를 이용하여 상속하고 확장이 가능하다.

 

 - 유지 보수가 용이하다. 객체 지향 프로그래밍에서는 수정해야 할 부분이 현저하게 줄어든다.

 

* 단점

 - 설계에 시간과 비용이 많이 들 수 있다.

 

 - 객체가 많아지면 용량이 커지고, 처리속도가 상대적으로 느리다.

 

 


 

 

참고

 

 

 

객체 지향 프로그래밍 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목

ko.wikipedia.org

 

 

클래스와 기본 문법

 

ko.javascript.info

 

 

Object-Oriented Programming | PoiemaWeb

오늘날 많은 유명한 프로그래밍 언어(Java, C++, C#, Python, PHP, Ruby, Object-C)는 객체지향 프로그래밍을 지원한다.

poiemaweb.com

 

 

객체 지향 프로그래밍(OOP : Object Oriented Programming) 개념 및 활용 정리

객체 지향 프로그래밍(OOP)이란? 객체 지향 프로그래밍(이하 OOP)는 컴퓨터 프로그램을 “객체(Object)"들의 모임으로 파악하고자 하는 프로그래밍의 패러다임 중에 하나이다. 각 “객체(Object)" 들은

velog.io

 

 

객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP)

객체 지향 프로그래밍(Object Oriented Programming) 여러 SW기업 신입사원 기술면접에서 워밍업느낌으로 면접자들 긴장을 풀어줄 겸 처음으로 자주 나오는 질문이다. "객체 지향 프로그래밍에 대해 설

jeong-pro.tistory.com

 

 

파이썬 클래스(class) 객체 인스턴스 이해하기

파이썬 class 포스팅을 시작합니다 이번 파이썬 포스팅에서는 파이썬을 공부할 때 꼭 알아야 할, 클래스(class)·객체·인스턴스에 대해서 알아보겠습니다. 포스팅의 초반이지만 클래스(class)와 객

www.itple.co.kr

 

 

상속(Inheritance)과 다형성(Polymorphism)

OOP에서 상속(Inheritance)와 다형성(Polymorphism) 는 무엇일까?

loustler.io

 

 

[Java] 상속과 다형성 - 다형성

다형성은 하나의 코드가 여러 자료형으로 구현되어 실행되는 것을 뜻하며 이는 같은 코드에서 여러 실행 결과가 나올 수 있는 것을 말합니다.정보은닉, 상속과 더불어 객체지향 프로그래밍의

velog.io

 

'Computer Science > etc.' 카테고리의 다른 글

< FP > 함수형 프로그래밍이란?  (0) 2021.08.18