My Boundary As Much As I Experienced

클래스에서 private 필드를 나타내는 기호 #와 _의 차이는 무엇인가? 본문

FrontEnd/Javascript(Vanilla)

클래스에서 private 필드를 나타내는 기호 #와 _의 차이는 무엇인가?

Bumang 2024. 4. 7. 03:41

들어가기 전 토막 상식

보통 클래스 안의 정보들은 프로퍼티가 아니라 필드라고 한다.

계속 프로퍼티라 부르고 있었는데 클래스 문법 복습하면서 다시 알게 되었다.

 

 

_가 붙는 필드는 무엇인가?

class Counter {
  constructor() {
    this._count = 0; // _count는 내부적으로 사용되는 프로퍼티
  }

  increment() {
    this._count++;
  }

  getCount() {
    return this._count;
  }
}

const counter = new Counter();
counter.increment();
console.log(counter.getCount()); // 외부에서는 getCount를 통해서만 _count에 접근할 수 있음

JavaScript 클래스 문법에서 _ (언더스코어)로 시작하는 프로퍼티는

주로 해당 클래스의 내부에서만 사용되는 프로퍼티를 나타낸다.

이러한 네이밍 컨벤션은 해당 프로퍼티가 클래스 외부에서 직접적으로 접근되어선 안 된다는 것을 의미한다.

이것은 JavaScript에서는 엄격한 접근 제어를 제공하지 않기 때문에

개발자들이 코드를 더 안전하게 유지하기 위해 사용하는 관습적인 방법 중 하나였다.

 

_필드의 용도:
1. 내부 구현에 필요한 데이터를 저장하기 위한 것으로, 외부에서 직접 접근하면 안 되는 데이터를 나타낸다.
2. 외부에 공개되지 않아야 하는 메서드나 변수를 나타낸다.
3. 클래스의 인터페이스를 의미적으로 명확히 하기 위해 사용될 수 있다.

 

 

#을 붙여서 private로 만들면 되는거 아닌가?

맞다. JavaScript에서는 2022년 11월에 공개된 ECMAScript 2022(ES12)부터 #을 사용하여 클래스 필드를 private로 만드는 기능이 도입되었다. 이것은 클래스 외부에서 직접적으로 접근할 수 없도록 보호하는 데 사용된다. 이전에는 _을 사용하여 private 프로퍼티를 표시하는 것이 일반적이었지만, #을 사용하는 것이 더 견고한 방법이다.

class Counter {
  #count = 0; // private 필드

  increment() {
    this.#count++;
  }

  getCount() {
    return this.#count;
  }
}

const counter = new Counter();
counter.increment();
console.log(counter.getCount()); // 클래스 외부에서 getCount를 통해서만 #count에 접근할 수 있음

 

 

요약

#_은 모두 JavaScript에서 private 프로퍼티나 메서드를 나타내는데 사용될 수 있다.

그러나 #은 더 최신의 문법이며, ECMAScript 2022(ES12)에서 도입되었다.

반면에 _은 개발자들이 이전에 private 프로퍼티를 나타내는데 주로 사용해온 관습적인 방법이다.