OOP 에 대한 이해

임수현·2021년 7월 26일
0
post-thumbnail

프로그래밍에 있어서 객체지향 프로그래밍(이하 OOP)는 매우 중요한 주제입니다.
OOP를 할 줄 알게 되면, 코드를 더 효율적이고, 가독성 있게 짤 수 있게 되기 때문이죠. 오늘은 OOP에 대해 공부하면서 OOP를 좀 더 깊이 이해할 수 있는 시간을 가져보도록 하겠습니다.

OOP란 무엇인가?

OOP (Object-Oriented Programming)이란 객체 지향적인 프로그래밍. 즉, C언어같은 절차 지향적인 프로그래밍이 아닌, 객체의 관점에서 프로그래밍을 한다는 것을 의미합니다.

OOP는 객체를 기준으로 코드를 구현합니다. 대표적인 클래스 기반의 프로그래밍 언어인 자바의 경우 그 구성 부분 단위가 클래스(객체)입니다. 도대체 객체(클래스)가 뭐길래 하나의 프로그래밍 언어의 패러다임을 결정할 정도로 강력한 것일까요?

객체 지향 프로그래밍은 기능별로 묶어서 모듈화 및 재사용 → 하드웨어의 중복 연산을 방지하여 성능 개선

Classes
Class는 객체를 생성하기 위한 템플릿입니다. 클래스는 데이터와 이를 조작하는 코드를 하나로 추상화합니다. 자바스크립트에서 클래스는 프로토타입을 이용해서 만들어졌지만 ES5의 클래스 의미와는 다른 문법과 의미를 가집니다.
// 출처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes

Class 정의
Class는 사실 "특별한 함수"입니다. 함수를 함수 표현식과 함수 선언으로 정의할 수 있듯이 class 문법도 class 표현식 and class 선언 두 가지 방법을 제공합니다.
// 출처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Classes

이렇게만 듣는다면 도대체 클래스가 뭔지에 대해 감이 잘 안오실 것이라고 생각합니다. 추후 계속된 OOP 관련 포스팅을 통해 독자분들에게 좀 더 잘 이해할 수 있는 콘텐츠를 제공하겠습니다.

클래스의 특징

클래스의 특징을 알아보며, 클래스가 어떤 것인지에 대해 좀 더 알아보도록 하겠습니다.

캡슐화

캡슐화란 하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메소드를 하나로 묶는 것을 의미합니다. 쉽게 말해서 데이터를 포장하는 것이라고 생각하시면 됩니다. 데이터를 포장함으로써 사용하는 개발자 입장에서 여러 데이터를 한 데 묶어 쉽게 사용할 수 있도록 합니다.

그리고 캡슐화를 함에 있어 가장 중요한 개념 중의 하나가 바로 정보은닉입니다. 만약 캡슐화 되어 있는 정보가 모두에게 오픈되어 있다면, 다른 사용자가 해당 정보를 마음대로 바꿔 오류를 발생시킬 수 있습니다.
이런 불상사를 피하기 위해, 꼭 지켜야만 하는 정보는 은닉화하여 불의의 오류를 막기 위해 대비합니다. 이는 getter와 setter를 통해서 셋팅할 수 있습니다.

추상화

추상화는 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념입니다. 어떤 설명에서는 '세상에 있는 것을 본따 클래스를 만들고 그 클래스의 상태와 행동을 부여한다'고도 설명합니다.

쉽게 말해서 추상화는 '카테고리화' 한다고 생각하시면 됩니다. '포유류', '파충류', '조류' 등으로 카테고리화 함으로써 어떤 특정 부류를 추상적으로 분류하는 작업입니다. 이 과정에서는 공통적인 요소나 특징을 추출함으로써 그 분류에 해당하는 요소들이 공통적인 속성을 가질 수 있도록 합니다.

예를들어. 벤츠, 아우디, 티코 등등 우리가 생각하는 여러 종류의 자동차의 경우, 이것을 다 클래스화하고 변수와 메서드 등을 개별적으로 만드는 것은 너무 비효율적인 일입니다.

따라서 방금 나열한 자동차들의 공통적인 요소나 특징을 추출하는 과정인 추상화를 거쳐 요소를 끄집어 내면 바퀴, 핸들, 차문, 유리창 등 필수적인 부품이 존재합니다.

바퀴가 굴러가고, 차문이 열려야 하듯이, 공통적인 행동, 즉 어떤 차든 필수적으로 필요한 메서드(행동)가 추출됩니다.

이러한 과정이 추상화 과정입니다.

상속

상속은 기존 상위 클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념입니다.

기존 클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어 줍니다.

OOP에서 상위 클래스를 부모 클래스, 하위 클래스를 자식클래스라고 표현합니다.

예를들어, 고양이 클래스와 강아지 클래스가 있다고 했을때, 고양이와 강아지는 모두 포유류에 해당합니다. 포유류는 여러 속성들이 정의되어 있는데 고양이와 강아지는 포유류의 이런 속성들을 갖고 있습니다. 하지만 아주 많은 속성이 다르기 때문에 좀 더 디테일하게 고양이, 강아지로 종을 나눈 것입니다.

즉, 포유류라는 클래스는 고양이와 강아지 클래스에 속성들을 물려주는데, 이것을 상속이라고 하고, 포유류와 고양이 포유류와 강아지 클래스는 상속 관계에 있다고 말할 수 있습니다.

이러한 상속이 필요한 이유는 코드의 중복을 없애기 위함입니다. 매번 강아지나 고양이를 정의할 때마다, 포유류를 정의하는 것은 매우 번거로운 일일 것입니다. 하지만, 상속을 통해 포유류라는 클래스를 상속해준다면, 일일이 그러한 특성을 정의하지 않아도 됩니다. 이는 코드를 작성하는 것 뿐만이 아니라, 유지 보수 측면에서도 큰 강점을 가진다고 할 수 있습니다.

다형성

다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해주는 것을 의미합니다. 다형성은 형태가 같은데 다른 기능을 하는 것을 의미한다고 보시면 됩니다. 이를 통해 코드의 재사용, 코드 길이 감소가 되어 유지보수가 용이하도록 도와줍니다.

예를 들어, 고양이 클래스에는 울음이라는 속성이 정의되어 있다고 하면,
사자는 고양이 과이기 때문에 사자 클래스는 고양이 클래스를 상속 받는다고 하면, 사자 클래스에도 "울음"이라는 속성이 자동으로 추가됩니다.
이것을 상속이라고 합니다.

그런데 고양이와 사자의 울음소리는 다르죠. 같은 "울음" 속성임에도 실제 울음소리는 다른 경우입니다.

이것이 바로 다형성의 예시 입니다.

한 줄로 정리하자면, 같은 행위를 하지만 용도와 목적에 부함하여 다양한 기능 수행과 처리, 결과를 낳는 것이 다형성이라고 할 수 있습니다.

다형성을 사용할 때의 장점은, 이와 같이, 같은 속성을 공유함으로써, 속성을 사용하기 위한 인터페이스를 유지하고, 메서드 이름을 낭비하지 않는다는 것입니다. API가 많아질수록 복잡성은 증가하기 때문에 다형성은 매우 유용하다고 할 수 있습니다.

정리

OOP

객체들이 서로 유기적으로 동작하는 프로그래밍 이론
코드의 재사용성과 중복제거가 가장 큰 목적

추상화

목적과 관련이 없는 부분을 제외해서 필요한 부분을 포착하는 기법
객체의 공통된 속성들 중 필요한 부분을 포착해서 클래스로 정의하는 설계 기법

캡슐화

외부에 노출할 필요가 없는 정보들은 은닉 (정보은닉)

상속

상속 관계에 있는 두 클래스에 대해, 부모 클래스가 자손 클래스에게 속성을 물려주는 것
코드의 재사용이 목적

다형성

같은 형태이지만 다른 기능을 하는 것
오버라이딩은 이와 관련된 기능임

profile
상상을 구현하고픈 프론트엔드 개발자입니다.

0개의 댓글