프로그래밍 언어를 배우다 보면

서로 비슷해 보이지만 실제로는 전혀 다른 개념들을 자주 마주하게 됩니다.

이번 글에서는 자바스크립트와 파이썬에서 자주 사용되는 두 개념, null vs None

그리고 this vs self를 비교해보려 합니다.


 

목차

    1. null과 None
      1. 내부 동작 차이
      2. 자바스크립트의 설계오류(null)
    2. this와 self
      1. this는 묵시적, self는 명시적

1. null과 None

프로그래밍을 하다 보면 개발자가 의도적으로 "값이 없다"는 상황을 표현해야 할 때가 많습니다.

자바스크립트에서는 null, 파이썬에서는 None 이라는 키워드를 사용해 이를 나타내는데요,

 

두 언어 모두 "값이 없음"을 의미하지만,

내부 구현 방식과 메모리 관리 방식에서는 뚜렷한 차이가 있습니다.

 

1) 내부 동작 차이

자바스크립트의 null은 내부적으로 참조할 객체가 없다는 의미를

메모리 주소 0을 가리켜서 표현합니다.

참고로 null은 개발자가 명시적으로 지정하는 것이고,

undefined는 시스템(또는 JS엔진)이 "초기화되지 않은 값"을 자동으로 부여할 때 사용합니다.

 

null을 비교할 때는 반드시 ===(엄격한 비교)를 사용하는 것을 권장합니다.

== 연산자는 타입 변환을 허용하기 때문에 예기치 않은 결과를 초래할 수 있습니다.

 

typeof null을 실행하면 null이 아닌 object가 결과로 나오는데

이는 자바스크립트의 설계 오류로 뒤에서 다시 살펴보겠습니다.

 

Python의 None은 메모리에 실제 존재하는 단일(Singleton) 객체입니다.

프로그램이 시작될 때 하나의 None 객체가 생성되고,

코드 내에서 사용되는 모든 None은 이 동일한 객체를 참조합니다.

 

모든 None이 단일 객체를 참조하므로, 메모리 상에서도 매우 효율적으로 관리됩니다.

None은 값이 아니라 객체이므로, 비교할 때는 is 연산자를 사용하는 것이 권장됩니다.

is는 메모리 주소를 비교하여 같은 객체인지를 확인합니다.

type(None)을 출력해보면 'NoneType'이 반환됩니다.

 

2) 자바스크립트의 설계오류(null)

자바스크립트의 null 타입 관련 설계 오류는 꽤 유명합니다.

위에서 말한것처럼 null은 '참조할 객체가 없음'을 의미합니다.

 

내부적으로 메모리 주소 0을 참조하는 null 포인터로서 표현하는데

이는 저수준 언어(c언어)의 설계 방식을 참고하여 만들어졌기 때문입니다.

let obj = null;
//힙 : 0(null)
//스택 : 0번지 메모리 주소(null 포인터)

 

 

그럼 왜 typeof 연산자를 사용하면 object 가 나오는 것일까요?

자바스크립트 엔진은 typeof 연산자를 사용할 때 다음과 같은 로직으로 동작합니다.

1. 해당 값의 메모리 주소 확인
2. 메모리 주소가 존재하면 이를 Object 타입으로 인식
3. null은 초기 설계에서 0번지 메모리 주소를 참조하기 때문에, 메모리 주소가 존재한다고 판단
4. 따라서 typeof null의 결과는 "object"를 반환

 

 

자바스크립트가 발전하면서 대형 어플리케이션에서도 자바스크립트가 사용되면서 설계 오류가 드러났지만

이미 많은 곳에서 typeof null을 object로 처리하고 있었기 때문에

이를 수정하면 기존 코드가 깨지는 레거시 호환성 문제가 발생하여

해당 오류는 수정되지 않고 그대로 유지되었습니다.

typeof null //object
typeof undefined //undefined

nul == undefined //true
nul === undefined //false

 

 

2. this와 self

1) this는 묵시적, self는 명시적

프로그래밍 언어에서 객체나 인스턴스 자신을 참조할 때 사용하는 키워드는 자주 등장합니다.
자바스크립트에서는 this, 파이썬에서는 self를 사용합니다.

 

this (JavaScript)

  • this는 자바스크립트 객체 메서드나 함수 안에서 자기 자신을 참조하는 키워드입니다.
  • 묵시적으로 바인딩되며,
    호출 방식에 따라 this가 가리키는 대상이 달라질 수 있습니다.
const example = {
    value: 10,
    show: function() {
        console.log(this.value);
    }
};

example.show(); // this는 example 객체를 가리킴
  • 하지만 호출 문맥(call context)에 따라 this가 달라지기 때문에,
    헷갈릴 여지가 많습니다.

 

지난번 포스팅에서는 변수가 메모리에 저장될 때 스택 프레임이 생성되고,
그 안의 실행 컨텍스트(Execution Context)this 바인딩 정보가 포함된다고 설명했습니다.

이는 자바스크립트의 this가 묵시적으로 바인딩되는 특성을 반영한 구조입니다.

반면, 파이썬에서는 self를 메서드의 첫 번째 인자로 명시적으로 전달하기 때문에,
별도의 this 바인딩 정보를 스택 프레임에 저장할 필요가 없습니다.
(파이썬의 스택 프레임에는 메서드 인자와 지역 변수 정보가 저장되지만, self는 항상 개발자가 명시적으로 다루어야 합니다.)

 

*지난번 포스팅 : https://sol-aftercoding.tistory.com/entry/KDA-2%EC%9D%BC%EC%B0%A8-416

 

[KDA] 변수는 왜 스택에, 객체는 힙에 저장될까?

최근 KDA(키움 디지털 아카데미)를 수강하면서,그동안 가볍게만 다뤘던 파이썬을 처음으로 제대로 배울 기회가 생겼습니다. 저는 주로 자바스크립트를 사용해왔기 때문에,파이썬을 배우면서 문

sol-aftercoding.tistory.com

 

 

self (Python)

  • self는 파이썬 클래스 메서드 안에서 인스턴스를 가리키는 키워드입니다.
  • 명시적으로 메서드의 첫 번째 인자로 작성해야 합니다.
  • 모든 인스턴스 메서드는 첫 번째 인자로 self를 받아야 하며,
    이 self를 통해 인스턴스의 속성이나 다른 메서드에 접근합니다.
  • 규칙이 엄격하고 명시적이기 때문에,
    self가 무엇을 가리키는지 항상 명확합니다. 혼동이 거의 없습니다.
class Example:
    def __init__(self, value):
        self.value = value

    def show(self):
        print(self.value)

 

참고자료

- 모던 자바스크립트 딥다이브

- KDA : 파이썬 프로그래밍(송치오 강사님)

+ Recent posts