본문 바로가기
코딩취미/프로그램 지식

네임 맹글링(Name Mangling)의 목적과 프로그래밍 언어별 사용 특징

by 브링블링 2024. 1. 19.
728x90

네임 맹글링(Name Mangling)의 목적과 프로그래밍 언어별 사용 특징

네임 맹글링(Name Mangling)은 주로 프로그래밍 언어의 컴파일러나 인터프리터에 의해 사용되며, 프로그래밍 언어의 내부 구조와 동작 방식에 깊이 관여하는 중요한 기능으로, 특히 객체 지향 프로그래밍에서 중요한 역할을 합니다.

이러한 네임 맹글링은 다음과 같은 목적으로 주로 활용됩니다.

1. 컴파일러 내부에서의 함수 오버로딩 처리

  • C++와 같은 언어에서 널리 사용됩니다.
  • 같은 이름의 함수가 여러 매개변수 타입이나 개수를 가질 때, 각각의 함수에 대해 고유한 식별자를 생성합니다.
  • 예: int add(int, int)와 double add(double, double)는 서로 다른 내부 이름을 가집니다.

2. 클래스 멤버의 접근 제어

  • Python에서 private 멤버를 처리하는 데 사용됩니다.
  • 클래스 내부의 private 멤버(변수나 메소드)가 이름 앞에 __를 붙여서 선언되면, 파이썬은 이를 _ClassName__memberName 형태로 변경합니다.
  • 이는 클래스 외부에서의 직접적인 접근을 방지하고, 이름 충돌을 막는 데 도움을 줍니다.

3. 링커(Linker)의 심볼 해결

  • 컴파일러가 생성한 코드에서 서로 다른 파일 또는 모듈 간의 함수나 변수를 연결할 때 사용됩니다.
  • 예: 여러 C++ 소스 파일에서 같은 이름의 전역 변수나 함수가 서로 다른 컨텍스트에서 사용될 경우.

4. 이름 충돌 방지

  • 서로 다른 네임스페이스, 모듈, 라이브러리 간에 이름 충돌을 방지하는 데 사용됩니다.
  • 예: 라이브러리 또는 모듈이 같은 이름의 함수나 변수를 가질 때.

5. 보안 및 캡슐화

  • 클래스의 내부 구현을 숨기고, 외부에서의 무단 접근을 어렵게 만들어 클래스의 캡슐화를 강화합니다.
  • 예: 클래스의 private 메소드나 변수에 대한 접근을 간접적으로 제한합니다.
728x90

그리고 각 프로그래밍 언어(C++, Python, Java)에서 네임 맹글링(Name Mangling)의 개념과 사용 방식은 다음과 같습니다.

언어별 네임 맹글링 특징 및 차이점

C++의 네임 맹글링은 주로 함수 오버로딩에서 다양한 함수 버전을 구분하기 위해 사용됩니다. Python에서는 클래스의 private 멤버를 숨기는 데 사용되며, Java에서는 네임 맹글링이 필요 없으며 대신 접근 제어자를 사용하여 멤버 접근을 제어합니다. 

 

기준 C++ Python Java
네임 맹글링 사용 함수 오버로딩 지원 클래스의 private 멤버 숨김 사용하지 않음
기본 목적 함수 시그니처 구별 private 멤버의 클래스 내 접근 N/A
메커니즘 컴파일러가 함수 이름 변경 __member를 _ClassName__member로 변경 접근 제어자 사용
접근 제어 함수 시그니처에 따라 다름 밑줄 규칙에 따라 다름 접근 제어자에 따라 다름

 

C++

설명

  • C++에서 네임 맹글링은 컴파일 시 함수 오버로딩을 지원하기 위해 사용됩니다.
  • 컴파일러는 함수의 이름, 매개변수 타입, 개수 등을 고려하여 고유한 이름을 생성합니다.
void func(int x) { }
void func(double x) { }

// 컴파일 후, 각 함수는 고유한 맹글링된 이름을 가짐

Python

설명

  • Python에서는 클래스의 private 멤버에 대한 네임 맹글링을 사용합니다.
  • 클래스 내부의 멤버(변수나 메소드) 이름이 두 개의 밑줄(__)로 시작하면, 파이썬은 이를 _ClassName__memberName 형태로 변경합니다.
class MyClass:
    def __init__(self):
        self.__privateVar = "I am private"

# 외부에서 MyClass의 __privateVar에 접근하려 할 때
# obj.__privateVar 는 접근할 수 없으며, obj._MyClass__privateVar로 접근해야 함

Java

설명

  • Java에서는 네임 맹글링이라는 개념이 존재하지 않습니다.
  • 대신, 접근 제어자(public, private, protected)를 사용하여 멤버의 접근을 제어합니다.
public class MyClass {
    private String privateVar = "I am private";

    public String getPrivateVar() {
        return privateVar;
    }
}

// MyClass의 privateVar에 접근하려면, 공개 메소드인 getPrivateVar()을 사용해야 함
728x90