[변역]OOP는 무엇인가?

Calvin Park·2022년 11월 4일

Intro

원본 사이트 FreeCodeCamp

오늘날의 기술 중심사회에서, 컴퓨터 프로그래밍 지식 수준은 높은 수요가 있습니다. 그리고 오늘날의 개발자로서는 다양한 프로그래밍 언어를 알아야 합니다.

수십 년동안, 많은 프로그래밍 언어들이 인기를 얻었습니다. 실시간 언어 인기 차트는 여기서 확인이 가능합니다.

새로운 언어들이 생겨날때마다, 기존에 있었던 언어는 업데이트가 되어서 전보다 더 좋게 만들어 가집니다.

대부분의 프로그래밍 언어들이 약간의 비슷한점을 가지고 있지만, 각각의 언어들은 특정한 규칙과 방법들이 있습니다.

많은 프로그래밍 언어에서 공통적으로 사용되는 한 가지 개념은 객체 지향 프로그래밍입니다. (OOP)입니다.

이번 글에서는 특정 언어에 의존하지 않고 객체지향 프로그래밍(OOP)을 전체적으로 살펴볼 것입니다. 그것이 무엇인지, 왜 그것이 프로그래밍 패러다임으로 인기가 있는지? 구조, 작동 방식, 원리등을 알게 될 것입니다.

근본적인 질문. OOP는 무엇인가?

처음에 객체지향 프로그래밍(OOP)에 대한 인터넷 검색을 하면, OOP는 클래스와 객체의 개념에 의존하는 프로그래밍 패러다임으로 정의된다는 것을 알 수 있습니다.

그러면 신입개발자들에게는 도저히 이해가 안갑니다.(저도 이해가 가지 않았습니다. 처음에는) 하지만 걱정 마세요, 여기서 5살 아이에게 설명하듯이 설명하겠습니다.

5살아이에게 설명하듯이 OOP설명하기

객체지향(Object-oriented)라는 단어는 객체와 지향이라는 두 가지 용어의 조합입니다.

사전적인 의미에서의 객체는 "실제 세계에 존재하는 실체 즉 물건 또는 물체 입니다." 이며, 지향은 "특정 종류의 사물이나 실체에 관심이 있다" 라는 뜻입니다.

더 기본 용어로 OOP는 객체나 엔터티를 중심으로 구축된 프로그래밍 패턴이기 때문에 객체 지향 프로그래밍 이라고 합니다.

개념을 더 이해하기 위해서, 일반적으로 사용하는 소프트웨어 프로그램을 보겠습니다. 문서를 인쇄할 때 프린터를 사용하는 것이 이를 설명하는 좋은 예가 되겠습니다.

  1. 인쇄명령을 클릭 또는 프린터 바로 가기 키를 사용하여 작업을 시작
  2. 프린터를 선택
  3. 프린트가 되었는지 안되었는지 여부를 알려주는 응답일 기다린다.

여기서에 우리가 직접적으로 볼 수 없는것이, 클릭한 명령은 객체(프린터)와 상호 작용하여 인쇄 작업을 수행한다는 것입니다.

여기서 궁금한 점은 OOP는 어떻게 유명하게 되었나 라는 것입니다.

OOP의 구조

만약에 애완동물 가게를 운영하고 있고, 이름, 나이, 출생일, 그리ㅗ 일반적인 관리 세부 사항을 기록한다고 했을때 이를 처리하기 위해 재사용 가능한 소프트웨어를 어떻게 설계하실껀가요?

애완동물 가게에는 품종이 많고 각 품종별로 코드를 작성한다는 것은 번거롭다는 것을 기억해야 합니다. 하지만 더 짧ㅅ고 더 재사용 가능한 코드를 만들 수 있도록 관련 정보를 함께 그룹화할 수 있습니다.

구성 요소는 Class, Objects, Methods and Attributes입니다.

각자 하는게 무엇인지 자세하게 알아 봅시다.

  • Classes: objects, attributes, 그리고 methods의 blueprint(청사진)역할을 하는 사용자 정의 데이터 유형입니다.
  • Ojbects: 정의된 데이터가 있는 Class의 인스턴스입니다.
  • Methods: 객체의 동작을 설명하는 클래스 내에서 정의된 함수입니다. 이 기능은 재사용하거나 한 번에 한 객체내에 기능을 캡슐화 하는데 유용합니다. 코드 재사용은 디버깅할 때 큰 이점이 됩니다.
  • Attributes - 클래스 템플릿에 정의되고 객체의 상태를 나타냅니다. 객체에는 속성 필드에 저장된 데이터가 포함되어 있습니다.

OOP의 원칙

원칙
좋은 OOP code를 작성할려고 하면 4가지의 원칙을 이해를 해야합니다.

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

Encapsulation(캡슐화)

Encapsulation, 캡슐화는 데이터를 함께 묶는 개념입니다. 캡슐화의 기능은 정보를 안전하게 유지를 합니다. 정보가 숨겨져 있는 경우 정보에 대한 집접 액세스는 허용이 되지 않습니다.
만약에 회사의 직원이라고 가정했으면, 이미 캡슐화를 경험해 보았을 것이다.

인사부를 생각해보자. 인사부 담당직원은 회사 직원 관련 데이터를 캡슐화(숨김)합니다. 인사부 담당직원들만이 데이터가 어떻게 사용되고 조작될지를 결정하게합니다. 작업자 데이터에 대한 모든 요청 또는 정보 업데이트 요청은작업자를 통해 라우팅되어야 합니다.

데이터를 캡슐화함으로써 시스템 데이터의 정보를 보다 안전하고 안정적으로 만들 수 있다. 또한 정보에 액세스하는 방법과 정보에 대해 수행되는 작업을 모니터링할 수 있다. 이렇게 하면 프로그램 유지보수가 쉬워지고 디버깅 프로세스가 간소화된다.

class Employee {
  constructor() {
    let name;
    let department;
  }
  getName() {
    return this.name;
  }
  setName(name) {
    this.name = name;
  }
  getDepartment() {
    return this.department;
  }
  setDepartment(department) {
    this.department = department;
  }
}

let emp = new Employee();
emp.setName("Calvin");
emp.setDepartment("Developer");
// Output: Calvin님은 Developer부서 입니다.

즉 간단하게 말해서 캡슐화는 객체의 속성과 메서드를 하나를 묶고 일부를 외부에 감추어 은닉하는 것을 말합니다.

Abstraction(추상화)

Abstraction은 추상화란 중요한 세부 사항만 보여주고 다른 모든것을 숨깁니다.
만약에 자동차 운전을 시작하여 A지점에서 부터 B지접으로 가고 싶을때 중요한 사항은 목적지를 세팅하고 차를 출발한다는 것입니다. 그러면 결국 목적지 까지 도착할 것입니다.

여기서 세부사항을 알 필요가 없는것은, 자동차가 어떻게 만들어지고? 어떻게 정확하게 지시를 따르고, 어떻게 자동차가 최적의 경로를 찾기 위해 다양한 옵션을 걸러내는가 하는 것이다.
OOP도 동일한 개념이 적용됩니다. 사용자가 볼 필요가 없는 세부 정보를 숨김으로써 이 작업을 수행합니다. 추상화를 통해 보다 쉽게 프로젝트를 관리할 수 있다.

더 나아가 추상화란 복잡한 시스템으로부터 핵심적인 개념 또는 기능을 간추려내는 것입니다.

InHeritance(상속성)

상속을 통해 클래스는 다른 클래스의 기능을 상속할 수 있습니다.
예를 들어, 고양이를 네 개의 다리를 가진 것과 같은 공통적인 특징을 가진 것으로 분류를 할 수 있습니다. 그 고양이의 춤종은 크기나 색깔과 같은 공통적인 속성을 가진 하위 그룹으로 분류합니다.

OOP의 상속을 사용하여 일반적인 특성 및 성능에 따라 프로그램의 객체를 분류 할 수 있습니다. 이렇게 하면 일반 특성을 상위 객체로 혼합하고 하위 객체내에서 이러한 특성을 상속할 수 있기 때문에 객체와 프로그래밍을 쉽게 할 수 있다.
즉 상위클래스의 특성을 하위클래스가 이어 받아서 재사용하거나 추가 확장하는 것을 말합니다.

Polymorphism(다향성)

다향성은 한 양식에 응답하는 두 개의 다른 객체입니다. 프로그램은 코드 중복을 줄이기 위해 부모 클래스의 모든 실행에서 어떤 용도가 중요한지 결정이 됩니다.

즉 하나의 method나 클래스가 다양한 방법으로 동작하는 것을 말하고, 대표적으로 오버로딩 오버라이드가 있습니다.

OOP를 사용해야 하는 이유

  • Code Re-usability: 상속성을 사용하여 코드를 재활용이 가능하다. 즉 개발자팀들은 같은 코드를 두번 작성할 필요가 없는것이다.
  • 최신 운영 체제와의 통합이 개선되었습니다.
  • 생산성 향상: 개발자는 여러 라이브러리를 사용하여 쉽고 빠르게 새 프로그램을 구성할 수 있습니다.
  • 다향성을 통해 단일 함수가 배치된 클래스에 적응할 수 있습니다.
  • 업그레이드가 용이하며, 프로그래머는 시스템 기능을 독립적으로 구현할 수도 있습니다.
  • 캡슐화를 통해 객체는 자체 포함될 수 있습니다. 또한 개발 시 문제 해결 및 협업을 보다 쉽게 수행할 수 있습니다.
  • 캡슐화 및 추상화를 사용하면 복잡한 코드가 숨겨지고 소프트웨어 유지보수가 용이하며 인터넷 프로토콜이 보호됩니다.

마무리

이렇게 OOP에대해서 알아 봤습니다. 저도 읽으면서 많이 햇갈리고 번역하기가 너무 복잡하고 해서 구글 번역기에 힘을 쫌 빌려왔습니다. 혹시 제가 잘못 적거나 이해가 안가는 부분 있으면 댓글로 말씀해주시면 감사하겠습니다.

profile
Personal Velog Note

0개의 댓글