본문 바로가기
Javascript

javascript Object Oriented Programming

by reo.l 2021. 1. 17.

 

현재의 고급언어는 두 가지 종류로 나눌 수 있다.

(절차 지향 언어, 객체 지향 언어)

절차 지향 언어에는 다양한 게 있지만 대표적으로 C언어가 있다.

절차 지향이란 위에서 아래로 순차적으로 처리하는 것을 말하는데

컴퓨터의 작업 처리 방식과 유사하기에 시간 복잡도 면에서 객체 지향 언어에 비해 강력하다.

그러나 그만큼 단점도 확실하다.

코드를 이해하기 어렵고 변경, 확장 등 유지 보수 측면에서 어렵다. 이러한 이유로 객체 지향 언어가 탄생했다.

객체지향언어는 필요한 부분을 기능별로 묶어 모듈화함으로써 코드의 재활용성을 키웠다. 

이는 중복을 줄여 프로그램의 유지 보수 및 코드를 이해하는데 큰 역할을 했다.

 

Object Oriented Programming

객체지향은 객체를 이해하는 데서 시작한다.

객체지향을 설명할 때 현실 세계와 자주 비교를 한다.

객체 (object)란 현실에서 나, 친구, 가족, 컴퓨터, 음식, 언어, 감정 등 현실 세계를 이루고 있는 모든 것이라 할 수 있다.

현실 세계에서 우리들은 객체들과의 상호작용을 하며 살아간다.

상호작용 없이 살아간다면 인생은 얼마나 복잡하고 힘들 것인가?

이처럼 객체지향은 객체들을 상호작용하게 하여 프로그램을 덜 복잡하고 힘들지 않게 만드는 것이다.

 

객체지향에는 기본적으로 4가지 콘셉트가 있다.

 

1. Encapsulation

캡슐화는 연관 있는 변수와 함수를 묶는 작업이다.

또한 데이터를 직접접근하도록 하지 않고 함수를 통해 접근 시킴으로서 감추고 싶은 정보는 접근을 제한 시킨다.

(java의 public , private와 같이 내부를 은닉화한다.)

let age = 28;
let name = '이유창';

function greeting(age, name) {
  return `안녕하세요 제 나이는 ${age}이고 이름은 ${name}입니다.`
}

//Encapsulation 캡슐화

let reo = {
  age: 28,
  name: '이유창',
  greeting: function () {
    return `안녕하세요 제 나이는 ${this.age}이고 이름은 ${this.name}입니다.`
  }
}

reo.greeting(); // 안녕하세요 제 나이는 28이고 이름은 이유창입니다.

 

2. Inheritance

상속은 부모 클래스의 특성과 기능을 자식 클래스가 그대로 물려 받는다.

상속을 사용하면 자식 클래스에서 재정의를 하지 않고도 상속받아 사용함으로써 코드의 재활용성을 키워준다.

또한 오버라이딩이 가능하여 효율적으로 프로그램을 만들 수 있다.

 


class People {
  constructor() {
    this.age = 100;
    this.food = 'rice';
  }
  eat() {
    return 'Im full now';
  }
}

// Inheritance 상속

class Reo extends People {
  constructor() {
    super(People);
    this.age = 28; // Overriding 오버라이딩
  }
}

let yuchang = new Reo();
yuchang.age    // 28
yuchang.eat(); // 'Im full now'

 

3. Abstraction

추상화란 당장 필요한 기능만을 묶어 정의하는 것이다.

전화기를 예로 들어보자 사용자가 그 안의 구조나 어떠한 로직으로 전화가 오고 가는지는 알 필요가 없다.

이처럼 객체를 만들 때 복잡한 원리나 로직을 사용자로부터 추상화 작업을 통해 사용자들이 쓰기 쉽게 만들어 주는 것이다.

es6 전 class 개념이 없었을 때 javascript를 객체지향적으로 사용하기 위해서

Functional, Prototypal, Pseudoclassical 패턴으로 인스턴스를 만들어 왔다.

 

4. Polymorphism

다형성은 같은 모양의 코드가 다른 행위를 하는 것을 말한다.

다형성을 구현하는데 중요한 두 가지 방법이 있다.

오버로딩오버라이딩이다.

오버로딩은 같은 이름으로 여러 개의 변수 및 메서드를 선언하는 것이다.

하지만 javascript에는 존재하지 않는 개념이다.

같은 이름으로 선언을 하면 결국 제일 아래에 선언한 것이 위의 모든 것을 덮어버린다.

오버라이딩은 부모로부터 상속받은 메서드를 재정의하여 사용하는 것이다.

이는 원래 있던 메서드에 기능을 추가하기도 하고 완전히 바꾸어 버리기도 하며

프로그래밍을 하는 데 있어서 다형성을 부여하게 된다.

위의 2. Inheritance의 예에서 오버라이딩을 볼 수 있다.

 

댓글