OOP란 무엇이며 특징은?(In JAVASCRIPT)

conape·2020년 9월 9일
1
post-thumbnail

OOP?

맨처음 OOP를 말하기 전에 우리는 객체란 무엇인가를 먼저 알아야한다.

🤔 객체란 무엇인가?

우선 위키피디아에서 말하는 객체가 무엇인지 알아보자.

컴퓨터 프로그래밍에서 말하는 객체는 클래스에서 정의한 것을 토대로 메모리(실제 저장공간)에 할당된 것으로 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며, 변수, 자료 구조, 함수 또는 메소드가 될 수 있다. 프로그래밍 언어는 변수를 이용해 객체에 접근하므로 객체와 변수라는 용어는 종종 함께 사용된다. 그러나 메모리가 할당되기 전까지 객체는 존재하지 않는다.

객체 지향 프로그래밍에서 말하는 객체는 클래스의 인스턴스이다. 클래스 객체는 자료와 그 자료를 다루는 명령의 조합을 포함하여 객체가 메시지를 받고 자료를 처리하며 메시지를 다른 객체로 보낼 수 있도록 한다. 실세계의 비유로 설명하자면, 가령 어떤 사람이 집에서 살기를 원할 때, 그 집의 청사진(집의 설계도)이나 축소 모형 따위는 전혀 필요가 없다. 필요한 것은 설계에 맞는 실제 집이다. 이 비유에서 청사진은 클래스를, 실제 집은 객체를 나타낸다.from 위키피디아

🤔 여기서 명확히 의미가 이해가 안되는 단어들을 생각해보면 클래스? 클래스의 인스턴스 ?
정확히 어떤거지? 라는 의문이 들었다.

예를들어보자

class Student {
  constructor() {
    let name;
    let age;
    let testScore;
  }
  getName() {
    return this.name;
  }
  setName(name) {
    this.name = name;
  }

  getAge() {
    return this.age;
  }
  setAge(age) {
    this.age = age;
  }

  getTestScore() {
    return this.testScore;
  }
  
  setTestScore() {
   this.testScore = testScore; 
  }
  
  sayMyname(){
   return this.name; 
  }

👤 : Student

위와 같이 Student라는 이름의 클래스라는 하나의 틀을만들었다.
해당 Class안에는 name, age, testScore 이 세가지 변수를 받을수있다.

let John = new Student();
John.setName('John');
John.setAge(23);
John.setTestScore(50);

let Mina = new Student();
Mina.setName('Mina');
Mina.setAge(25);
Mina.setTestScore(100);

👮(Student) : John , 👩🏻‍⚕️(Student): Mina

이와 같이 해당 Studuent 클래스를 이용해 John이라는 객체를 생성하였다.
Name은 'John' , age는 23, testScore는 50 이라고.
또 다른 객체는 Mina라고 생성하였다
Name은 'Mina', age는 25, testScore는 100 이라고.

여기서 위에 물음표로 찍은 단어들을 다 찾을수있다.
클래스? 라는것은 객체의 속성들과 기능들을 담은 틀이다.
클래스의 인스턴스는 new Student()라고 쓰여진 새로운 틀을 생성하는것.
객체는 이러한 인스턴스를 변수에 담는것 이라고 생각하면된다.
이러한 객체들을 사용해서 프로그래밍을 하는 방법을 객체 지향 프로그래밍이라고한다.

🤔 그럼 왜 객체 지향 프로그래밍을 사용하는것인가?

나무위키에서는 그이유를 아래와 같이 설명하였다.

객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점을 갖고 있다 from. 나무위키

🤔 왜 대규모 소프트웨어 개발에 많이 사용되며, 유지보수를 간편하게 하며, 직관적인 코드분석이 가능한가?

결론부터 말하자면, OOP의 4가지 특징때문이다.‼️

OOP의 4가지 특징때문이다.

💊 Encapsulation(캡슐화)

캡슐화? 필자는 뭔가 단어를 듣자마자 알약이 생각났다.

속에 많은 성분이있고, 해당 성분이 우리몸에 어떠한 기능들을 갖고있는것을 담고있는 알약처럼

위의 예시처럼 Student가 age, name, testScore라는 성분들을 갖고있고, sayMyname이라는 자기이름을 말하는 기능을 담고있다.

캡슐화란 Class안에 객체의 속성과 메서드들을 하나로 묶고,
실제 구현 내용 일부를 외부에 감추어 은닉하는것이 캡슐화
이다.

만약 캡슐화를 사용하지않고 프로그래밍을 했다면 위의 클래스들은 어떻게 구현했을까?

let John = {
  name: 'John',
  age: 23,
  testScore: 50,
  sayMyname: function () {
    return this.name;
  },
};
let Mina = {
  name: 'Mina',
  age: 25,
  testScore: 100,
  sayMyname: function () {
    return this.name;
  },
};

console.log(John);
console.log(Mina);

이런식으로 계속 생산성이 떨어지는 코딩을 하게될것이고, 외부에서 누군가가 해당 John, 이나 Mina라는 객체의 속성들을 마음대로 바꿀수있을것이다.

👨🏻‍🎨 Abstraction(추상화)

추상화? 필자는 뭔가 추상적으로 그린다 라는 개념이 떠올랐다.
정말 필요한 요소만을 그리는것. 그것이 추상화 라는 개념이다.
그러면 프로그래밍에선 어떻게 쓰일까?

function Vehicle()  
{  
    this.vehicleName= vehicleName;  
    throw new Error("You cannot create an instance of Abstract class");  
  
}  
Vehicle.prototype.display=function()  
{  
    return this.vehicleName;  
}  
var vehicle=new Vehicle();  // Error 발생

// 생성자 함수를 만든다.
function Bike(vehicleName)  
{  
    this.vehicleName=vehicleName;  
}  

// 생성자 함수 사용 없이 객체를 만든다.
Bike.prototype=Object.create(Vehicle.prototype);  
var bike=new Bike("Honda");  
console.log(bike.display()); 

console.log(bike instanceof Vehicle);  // true
console.log(bike instanceof Bike);    // true

해당 Vehicle이라는 함수는 vehicleName이라는 변수를 갖고 display 라는 함수를 갖는다.

Vehicle이라는 함수는 직접 인스턴스를 생성하려고하면 Error를 발생하게끔 만들어놓고,

해당 Vehicle의 특성만을 갖는 Bike라는 인스턴스를 만들어서 사용할수있다.

만약 정말 거대한 프로젝트라면 추상화라는 개념을 어떻게 쓰일까?

2백, 혹은 3백명의 개발자가 하나의 플랫폼을 만든다고하면 , 해당 Vehicle이라는 특징을 갖는 함수를 추상화 해놓으면

Bike를 만들때 아마도 수백명의 개발자들은 해당 Form을 활용해서 일정한 규칙을 갖고 인스턴스를 만들수있을것이다.

👨‍👩‍👦‍👦 Inheritance(상속)

상속? 생각하면 부모님이 나에게 물려준다 라는 느낌을 받았다.

해당 부모 객체에 속한 변수이름 뿐만 아니라 지정되어있는 값까지 사용할수있도록 자식 객체가 물려받는것이다.

해당 내용은 추후에 프로토타입의 체인과 상속에대해서 더 자세히 다룰예정이다.

🚵‍♂️ Polymorphism(다형성)

다형성? 우선 다양하다라는 말밖에는 떠오르지가 않았다.

그럼 그 다양하다라는걸 객체 프로그래밍에서는 어떻게 설명하고있을까? 예제를 보자

class Vehicle {
run() {
console.log( this );
console.log( " Vehicle is running " );
}
}
class Car extends Vehicle {
run() {
console.log( this );
console.log( " Car is running " );
}
}
class Truck extends Vehicle {
}
var v1 = new Vehicle();
var v2 = new Car();
var v3 = new Truck();
var v = [ v1, v2, v3];
v.forEach(function(obj) {
obj.run();
});

Car, Truck이 Vehicle클래스를 물려받았고, Vehicle 클래스의 메서드인 Run()은 Vehicle is runiing이라는 문자를 찍도록 해놨다.
Car는 해당 Run()이라는 것을 물려받았지만, 자기만의 특성으로 바꾸어서 Car is running으로 쓰고, Truck은 Run()이라는 메소드를 생성하지도 않았는데 사용가능한 이유는 Vehicle의 특성인 Run()이라는 메소드를 물려받았기 때문에 그대로 사용이 가능한것이다.

이렇게 해당 Vehicle을 물려받은 객체들은 다양한 메서드들을 사용하고있기떄문에 다형성이 적용되었다 라고 말할수 있다.

정리

  • 객체란 무엇인지 알아보았고, 객체 지향 프로그래밍이 뭔지 알게되었다.
  • OOP의 특징 4가지가 무엇인지 알게되었다.
  • 왜 대규모 소프트웨어 개발에 많이 객체 지향 프로그래밍이 쓰이게 되었는지 알게되었다.

마무으리

생각보다 정리하는게 쉽지 않았고, 해당 개념들을 숙지한 상태로 내 생각을 전달하는 그 과정 자체가 쉽지않았다.

으으으으렵네? 😱 이상 마무으으으리를 한다. 🤩

profile
백종원 대표님 처럼 선한 영향력을 줄수있는 개발자가 되고픈 사람 🧙🏿‍♂️ ⚡️(홍반 탕수육 JMT!👍🏻)

0개의 댓글