본문 바로가기
My Wiki (CodesStates)/JS,Node

(5-4) JS/객체 지향 JavaScript/JavaScript와 기타 다른 객체 지향 언어와의 차이점

by Esoolgnah 2021. 8. 23.
728x90

 

은닉화(private 키워드)의 한계

Java나 TypeScript라는 프로그래밍 언어는 클래스 내부에서만 쓰이는 속성 및 메소드를 구분시키기 위해 private이라는 키워드를 제공한다. 이러한 은닉화를 도와 주는 기능이 JavaScript에서는 널리 쓰이지 않는다. 정확히는 지원하는 브라우저가 매우 적다. 아래 TypeScript의 예제로 name이라는 속성이 존재한다. 그러나 private 키워드가 붙어 있어서 클래스 내부에서만 사용 가능하다.

 

// TypeScript 문법입니다.

class Animal {
  private name: string;

  constructor(theName: string) {
    this.name = theName;
  }
}

new Animal("Cat").name; // 사용 불가
// Property 'name' is private and only accessible within class 'Animal'.

[코드] TypeScript에서 OOP 패턴으로 구현한 클래스 Animal 예시

 

 

JavaScript에서는 은닉화를 돕기 위해서 일반적으로 클로저 모듈 패턴을 사용한다. 클래스/인스턴스 형태로 만들 때에는 다른 방법을 사용한다.

 

 

추상화(interface 키워드) 기능의 부재

객체 지향 프로그래밍의 주요 키워드 중 하나인 추상화는, 속성과 메소드의 이름만 노출시켜서 사용을 단순화한다는 의미를 갖고 있다. 즉, 인터페이스(interface)의 단순화를 의미한다. Java나 TypeScript 언어는 언어의 주요 기능으로 interface를 구현해 놓았다. 그러나 이러한 부분은 JavaScript에는 존재하지 않는 기능이다. 다음 코드를 한번 살펴 보자. 인터페이스와 구현이 따로 정의되어 있다.

 

// TypeScript 문법입니다.

interface ClockInterface {
  currentTime: Date;
  setTime(d: Date): void;
}

class Clock implements ClockInterface {
  currentTime: Date = new Date();
  setTime(d: Date) {
    this.currentTime = d;
  }
  constructor(h: number, m: number) {}
}

[코드] TypeScript에서 Interface와 class를 따로 정의한 예시

 

 

인터페이스의 이점은 인터페이스가 일종의 규약처럼 간주되어 인터페이스를 클래스로 구현하는 사람들이 이에 맞게 작성할 수 있게 돕는다. (인터페이스는 다양한 구현이 있을 수 있다.) 이는 클래스를 이용하는 입장에서 노출된 인터페이스를 통해 "이 클래스는 메소드 이름이 의도한 바대로 작동할 것이다"라는 것을 명백히 드러나게 해 준다. 또한 실질적인 구현 방법을 공개하지 않고, 사용법을 노출시키기에도 유리하다.

어떤 클래스가 외부 공개용으로 모듈처럼 작동할 때에, 이러한 인터페이스는 빛을 발한다.

 

 

 

 

반응형

댓글