헝가리안 표기법
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
헝가리안 표기법은 변수 이름에 자료형이나 의미 정보를 접두어로 추가하는 프로그래밍 명명 규칙이다. 1970년대 찰스 시모니가 개발했으며, 시스템 헝가리안과 앱스 헝가리안 두 가지 종류가 있다. 시스템 헝가리안은 변수의 실제 데이터 형식을, 앱스 헝가리안은 변수의 목적을 나타낸다. 헝가리안 표기법은 변수의 자료형을 쉽게 파악할 수 있다는 장점이 있지만, 코드 가독성을 저해하고 유지보수를 어렵게 한다는 비판도 있다. 특히, 컴파일러의 형식 검사 기능과 최신 통합 개발 환경의 발달로 인해 사용 빈도가 줄어들고 있다.
더 읽어볼만한 페이지
- 명명규칙 - NATO 보고명
NATO 보고명은 군사 동맹인 NATO가 소련 및 중국 등 군사 장비에 부여한 코드네임으로, 다양한 언어 사용 군 조직 간의 통신을 원활하게 하기 위해 사용되었으며, 고정익 항공기는 엔진 유형에 따라 음절 수가 결정된다. - 명명규칙 - 계통명
계통명은 화학, 생물학, 천문학 등 다양한 분야에서 사용되는 명칭 체계이며, IUPAC, 이명법, 국제천문연맹(IAU) 등 각 분야의 규칙에 따라 물질, 생물, 천체의 이름을 명명한다. - 소스 코드 - 헤더 파일
헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다. - 소스 코드 - 의사코드
의사코드는 컴퓨터 과학 및 수치 계산 분야에서 알고리즘을 설명하기 위해 사용되는 비표준적인 언어로, 자연어와 프로그래밍 언어의 요소를 혼합하여 알고리즘의 논리적 흐름을 이해하기 쉽게 하고 프로그래머가 실제 코드로 구현하기 전에 알고리즘을 설계하고 검토하는 데 유용하다.
헝가리안 표기법 |
---|
2. 역사
헝가리안 표기법은 1972년부터 1981년까지 제록스 PARC에서 프로그래머로 일했으며, 이후 마이크로소프트의 수석 아키텍트가 된 찰스 시모니가 발명했다.[2] 이 표기법의 이름은 시모니의 출신 국가인 헝가리를 참조하며, 앤디 허츠펠드에 따르면 이 표기법이 프로그램을 "알 수 없는 외국어로 작성된 것처럼 보이게" 만들었기 때문이라고 한다.[2] 헝가리 사람의 이름은 다른 대부분의 유럽 이름과 달리 성씨가 이름보다 먼저 온다. 예를 들어 영어식 이름 "Charles Simonyi"는 헝가리어로 "Simonyi Károly"이다. 헝가리안 표기법은 변수의 타입 이름이 "이름"보다 먼저 온다는 점에서 이러한 특징을 반영한다. 시모니가 제록스 PARC에서 근무할 당시 스몰토크의 "타입 마지막" 명명 스타일(예: aPoint, lastPoint)이 널리 사용되었다.
헝가리안 표기법은 크게 시스템 헝가리안 표기법과 앱스 헝가리안 표기법으로 나뉜다. 이 두 표기법의 주요 차이점은 접두사의 목적에 있다.[3]
시모니의 논문은 변수가 저장하는 정보의 "타입"을 나타내는 접두어를 사용했다.[3][12] 그의 제안은 주로 변수가 저장하는 정보의 의미, 즉 변수의 ''목적''에 따라 식별자 이름을 붙이는 데 중점을 두었다. 시모니의 표기법은 마이크로소프트의 응용 소프트웨어 부서에서 사용되어 Apps Hungarian이라고 불렸다. 이후 마이크로소프트 윈도우 개발 팀에서 Systems Hungarian을 개발했다. Apps Hungarian은 시모니가 제안한 일부 접두사가 의미 정보를 거의 또는 전혀 포함하지 않기 때문에 Systems Hungarian과 완전히 구별되지 않는다.[12]
원래 시모니가 고안한 헝가리안 표기법은 변수의 의미나 사용 목적에 따라 접두사를 결정하는 것으로, 형식으로는 구별할 수 없는 정보를 변수명에 부여하여 혼란스러운 변수의 의미를 명확히 하고 혼동을 피하기 위한 것이었다. 예를 들어 논리 좌표와 장치 좌표, X축과 Y축, 달러와 엔화 등이 있는데, 이것들은 단순히 형식에 의한 안전성에 의존할 수 없다.
마이크로소프트의 응용 프로그램 개발 그룹에서 이 표기법을 엑셀이나 워드 등의 개발에 사용하여 성공을 거두자, Windows API 및 MFC를 포함한 Windows 개발 그룹에서도 채택되었다. 그 과정에서 시모니의 논문 중 "type"이 데이터 형식을 의미하는 것으로 오해되어, 변수명에 데이터 형식을 나타내는 접두어 또는 접미어를 붙이는 표기법으로 잘못 해석되었다. 시모니가 의도했던 표기법은 어플리케이션 헝가리안, 오해에 기반한 표기법은 시스템 헝가리안이라고 불린다. Windows API와 MFC는 대부분 시스템 헝가리안을 따른다. 시스템 헝가리안은 현재 비판받는 경우가 많으며, .NET Framework에서는 사용되지 않는다.[16] COM에서도 전통적으로 시스템 헝가리안이 사용되었지만, .NET 등장 이후 새롭게 추가된 컴포넌트에서는 시스템 헝가리안을 채택하지 않는 경우가 늘고 있다.[17]
헝가리안 표기법에 두 종류가 있다는 사실은 잘 알려져 있지 않으며, "헝가리안 표기법"이라고 하면 대부분 시스템 헝가리안을 의미하는 경우가 많다.
3. 종류
시스템 헝가리안 표기법은 변수의 실제 데이터 형식을 나타내는 반면, 앱스 헝가리안 표기법은 변수의 논리적 데이터 형식이나 사용 목적을 나타낸다.
원래 헝가리안 표기법은 마이크로소프트의 응용 프로그램 개발 그룹에서 개발되어 엑셀이나 워드 등의 개발에 사용되었다. 이후 Windows 개발 그룹에서도 채택되었는데, 이때 시모니의 논문에서 "type"을 데이터 형식으로 오해하여 시스템 헝가리안 표기법이 널리 퍼지게 되었다.
3. 1. 시스템 헝가리안 표기법
시스템 헝가리안 표기법에서 접두사는 변수의 실제 데이터 형식을 나타낸다.[3] 예를 들면 다음과 같다."l"
)이다."arru8"
)이다."str"
)을 나타내지만, 해당 문자열이 어떻게 구현되는지는 명시하지 않는다.
마이크로소프트의 Windows 개발 그룹에서 이 표기법을 채택했다. 시모니의 논문에서 "type"이 데이터 형식을 의미하는 것으로 오해되어, 변수명에 데이터 형식을 나타내는 접두어 또는 접미어를 붙이는 표기법으로 잘못 알려졌다. 시모니가 의도했던 표기법은 애플리케이션 헝가리안, 오해에 기반한 표기법은 시스템 헝가리안이라고 불린다.
Windows API 및 MFC는 대부분 시스템 헝가리안을 따른다. 시스템 헝가리안은 비판받는 경우가 많으며, .NET Framework에서는 사용되지 않는다.[16] COM도 시스템 헝가리안이 전통적으로 사용되었지만, .NET의 등장 이후 새롭게 추가된 컴포넌트에 관해서는 시스템 헝가리안을 채용하지 않는 경우가 늘고 있다.[17]
헝가리안 표기법에 두 종류가 있다는 것은 잘 알려져 있지 않으며, 단순히 "헝가리안 표기법"이라고 언급될 경우에도, 시스템 헝가리안의 의미로 사용되는 경우가 많다.
C 언어 및 C++에서 주로 사용되며, 언어 사양, 기능 및 자료형에 의존하는 규칙이 대부분이다.
문자 | 의미 | 사용 예 |
---|---|---|
b 또는 f | 논리형 | bDirtyFlag |
ch | 문자형 | chSeparator |
by | 바이트형 (부호 없는 1바이트 정수) | byGrayLevel |
n 또는 i | 정수형 (int, integer) | nPower |
l | 롱 정수 (long) | lDate |
u | 부호 없는 정수 | uiCount |
w | 워드형 (WORD) | wLanguageCode |
dw | 더블 워드형 (DWORD) | dwSize |
fp 또는 f | 단정밀도부동소수점형 | fpPrice |
db 또는 d | 배정밀도부동소수점형 | dPi |
p 또는 lp | 포인터형 | lpDirectSound |
s | 문자열형 | sPlayerName |
sz | 널 종료 문자열형 | szFileName |
fn | 함수 포인터형 | fnCallback |
h | 핸들형 | hThread |
hwnd 또는 h | 윈도우 핸들형 (Windows만 해당) | hMainWindow |
g_ | 전역 변수 | g_iErrorCode |
c_ | 상수 (const) | c_nBufferSize |
s_ | 정적 변수 (static) | s_pLookupTable |
m_ | 클래스의 멤버 변수 | m_nLength |
C | 클래스 | CHoge |
tag | 구조체 태그 | tagRECT |
이 문자들은 조합하여 사용될 수 있다. 예를 들어 "lpsz
: 널 종료 문자열에 대한 포인터", "m_ul
: 멤버 변수의 부호 없는 롱 정수" 등과 같다.
널 종료를 나타내는 "z"는 대부분 널 종료 문자열을 나타내는 "sz"의 형태로 나타나지만, 드물게 센티넬로서 0 또는 Null을 배치하고 있는 가변 길이 배열이나 리스트 등의 자료 구조를 나타내기 위해 사용되는 예도 있다.
전역 변수나 멤버 변수를 나타내는 접두사는 변수의 자료형이 아닌 스코프를 구분하기 위한 것이므로, 시스템 헝가리안과 구분하는 시각도 있다.
3. 2. 앱스 헝가리안 표기법
앱스 헝가리안 표기법은 변수의 물리적 데이터 유형보다는 논리적 데이터 유형을 인코딩하여, 변수의 목적이나 변수가 나타내는 것을 힌트로 제공한다.[3]- `rwPosition`: 변수는 ''row'' (
"rw"
)를 나타낸다. - `usName`: 변수는 사용하기 전에 "sanitize" 해야 하는 ''unsafe string'' (
"us"
)을 나타낸다. (예: 원시 사용자 입력을 사용하여 발생할 수 있는 공격의 예는 코드 주입, 크로스 사이트 스크립팅 참조). - `szName`: 변수는 '''''z'''ero-terminated '''s'''tring'' (
"sz"
)이다. 이는 시모니가 제안한 원래 접두사 중 하나였다.
시모니가 제안한 접두사 중 대부분은 의미론적이다. 현대적인 시각에서는 일부 접두사가 문자열과 같은 물리적 데이터 유형을 나타내는 것처럼 보이지만, 이러한 접두사는 여전히 의미론적이었는데, 시모니는 현대 언어가 당연하게 여기는 일부 데이터 유형을 구별할 수 없는 타입 시스템을 가진 언어를 위해 헝가리안 표기법을 의도했기 때문이다.[3]
다음은 원본 논문의 예이다:[3]
- `p''X''`는 다른 유형 ''X''에 대한 포인터이다. 이것은 거의 의미론적 정보를 포함하지 않는다.
- `''d''`는 두 값의 차이를 의미하는 접두사이다. 예를 들어, ''dY''는 그래프의 Y축을 따라가는 거리를 나타낼 수 있으며, ''y''라는 변수는 절대 위치일 수 있다. 이것은 본질적으로 의미론적이다.
- `''sz''`는 null 또는 zero로 종료되는 문자열이다. C에서 이 정보는 ''char*'' 유형의 변수가 단일 문자에 대한 포인터인지, 문자 배열인지, 또는 zero로 종료되는 문자열인지 명확하지 않기 때문에 약간의 의미론적 정보를 포함한다.
- `''w''`는 단어인 변수를 표시한다. 이것은 본질적으로 의미론적 정보를 전혀 포함하지 않으며, Systems 헝가리안으로 간주될 수 있다.
- `''b''`는 바이트를 표시하며, w와 대조적으로 의미론적 정보를 가질 수 있다. 왜냐하면 C에서 바이트 크기의 유일한 데이터 유형은 ''char''이기 때문에, 이것은 때때로 숫자 값을 저장하는 데 사용되기 때문이다. 이 접두사는 변수가 문자로 취급되어야 하는 값인지, 숫자로 취급되어야 하는 값인지에 대한 모호성을 해소할 수 있다.
표기법은 항상 소문자로 시작하는 문자를 니모닉으로 사용하지만, 니모닉 자체를 규정하지는 않는다. 널리 사용되는 여러 관례가 있지만, 주어진 코드 내에서 일관성이 유지되는 한 어떤 문자 집합이든 사용할 수 있다.
원래 시모니가 고안한 헝가리안 표기법은 변수의 의미나 사용 목적에 따라 접두사를 결정하는 것이며, 형식으로는 구별할 수 없는 정보를 변수명에 부여하여 혼란스러운 변수의 의미를 명백히 하고 혼동을 피하기 위한 것이었다. 예를 들어, 논리 좌표와 장치 좌표, X축과 Y축, 달러와 엔화 등은 단순히 형식에 의한 안전성에 의존할 수 없다.
애플리케이션 헝가리안 표기법은 잘못된 코드를 잘못된 것으로 보이게 하는 표기법이다. 예를 들어, 상대 좌표에 `rp` (Relative Position, 상대 위치)를, 절대 좌표에 `ap` (Absolute Position, 절대 위치)라는 접두사를 붙이는 경우, 윈도우의 위치를 설정하는 `window.SetPosition(rpX, apY);`와 같은 기술은 오류임을 명확하게 알 수 있다. 또한, 달러의 접두사를 `dol`, 엔화의 접두사를 `yen`으로 했을 경우, `dolIncome + yenDeposit`과 같은 계산은 오류임을 명확하게 알 수 있다.
4. 시길(Sigils)과의 관계
일부 프로그래밍 언어에서는 시길이라고 불리는 유사한 표기법이 언어에 내장되어 컴파일러에 의해 강제된다. 예를 들어, 일부 형태의 BASIC에서는 `name$`가 문자열을, `count%`가 정수를 명명한다. 헝가리안 표기법과 시길의 주요 차이점은 시길은 언어에서 변수의 유형을 선언하는 반면, 헝가리안 표기법은 프로그램 텍스트의 기계적 해석에 영향을 미치지 않는 순수한 명명 방식이라는 것이다.
5. 예시
Hungarian notation영어은 변수나 함수의 이름에 그 종류나 의도에 대한 정보를 포함하는 명명 규칙이다.
다음은 원본 논문에 있는 예시이다:[3]
- `pX`: 다른 유형 `X`에 대한 포인터. 의미 정보가 거의 없다.
- `d`: 두 값의 차이를 의미하는 접두사. 예를 들어 `dY`는 그래프의 Y축 거리를 나타낼 수 있으며, `y` 변수는 절대 위치일 수 있다. 의미론적이다.
- `sz`: null 또는 0으로 끝나는 문자열. C에서 `char*` 유형의 변수가 단일 문자에 대한 포인터인지, 문자 배열인지, 0으로 끝나는 문자열인지 명확하지 않기 때문에 약간의 의미론적 정보를 포함한다.
- `w`: 워드인 변수를 표시한다. 의미론적 정보를 거의 포함하지 않으며, Systems 헝가리안으로 간주될 수 있다.
- `b`: 바이트를 표시하며, w와 대조적으로 의미론적 정보를 가질 수 있다. C에서 바이트 크기의 유일한 데이터 유형은 `char`인데, 숫자 값을 저장하는 데 사용되기도 하기 때문이다. 이 접두사는 변수가 문자로 취급되어야 하는 값인지, 숫자로 취급되어야 하는 값인지에 대한 모호성을 해소한다.
표기법은 항상 소문자로 시작하는 문자를 니모닉으로 사용하지만, 니모닉 자체를 규정하지는 않는다. 널리 사용되는 여러 관례가 있지만, 주어진 코드 내에서 일관성이 유지되는 한 어떤 문자 집합이든 사용할 수 있다.
Apps 헝가리안 표기법을 사용하는 코드에서 유형에 따라서만 정의된 변수를 설명할 때 Systems 헝가리안이 포함될 수 있다.
표기법 | 의미 | 설명 |
---|---|---|
bBusy | 불리언 | |
chInitial | char | |
cApples | 항목 수 | |
dwLightYears | 더블 워드 (시스템) | |
fBusy | 플래그 (또는 float) | |
nSize | 정수 (시스템) 또는 수 (앱) | |
iSize | 정수 (시스템) 또는 인덱스 (앱) | |
fpPrice | 부동 소수점 | |
decPrice | 십진수 | |
dbPi | double (시스템) | |
pFoo | 포인터 | |
rgStudents | 배열 또는 범위 | |
szLastName | 널 종료 문자열 | |
u16Identifier | 부호 없는 16비트 정수 (시스템) | |
u32Identifier | 부호 없는 32비트 정수 (시스템) | |
stTime | 시계 시간 구조체 | |
fnFunction | 함수 이름 |
실제 데이터 형식이 아닌 포인터와 배열에 대한 니모닉은 일반적으로 데이터 요소 자체의 유형이 뒤따른다.
- `pszOwner`: 널 종료 문자열에 대한 포인터
- `rgfpBalances`: 부동 소수점 값의 배열
- `aulColors`: 부호 없는 long의 배열 (시스템)
헝가리안 표기법은 모든 프로그래밍 언어와 환경에 적용할 수 있지만, 특히 마이크로소프트가 C 언어, 특히 마이크로소프트 윈도우와 함께 사용하기 위해 널리 채택되었으며, 그 사용은 주로 해당 영역에 국한되어 있다.
- C로 윈도우 프로그래밍을 배운 프로그래머에게 가장 기억에 남는 예는 WindowProc() 함수의 `wParam` (워드 크기 매개변수) 및 `lParam` (long-integer 매개변수)일 것이다.
- `hwndFoo`: 윈도우 핸들
- `lpszBar`: 널 종료 문자열에 대한 long 포인터
헝가리안 표기법은 선택적으로 밑줄로 구분된 변수의 범위를 포함하도록 C++에서 확장되기도 한다.[4][5]
- `g_nWheels`: 전역 네임스페이스의 멤버, 정수
- `m_nWheels`: 구조체/클래스의 멤버, 정수
- `m_wheels`, `_wheels`: 구조체/클래스의 멤버
- `s_wheels`: 클래스의 정적 멤버
- `c_wheels`: 함수의 정적 멤버
jQuery를 사용하는 자바스크립트 코드에서는 변수가 jQuery 객체(일반 DOM 객체 또는 기타 값과 대조)를 포함한다는 것을 나타내기 위해 종종 `$` 접두사가 사용된다.[6]
모든 접두사를 사용하며, C 언어 및 C++ 특유의 언어 사양, 언어 기능 및 자료형에 의존하는 규칙이 대부분이다.
문자 | 의미 | 사용 예 |
---|---|---|
b 또는 f | 논리형 | bDirtyFlag |
ch | 문자형 | chSeparator |
by | 바이트형 (부호 없는 1바이트 정수) | byGrayLevel |
n 또는 i | 정수형 (int, integer) | nPower |
l | 롱 정수 (long) | lDate |
u | 부호 없는 정수 | uiCount |
w | 워드형 (WORD) | wLanguageCode |
dw | 더블 워드형 (DWORD) | dwSize |
fp 또는 f | 단정밀도부동소수점형 | fpPrice |
db 또는 d | 배정밀도부동소수점형 | dPi |
p 또는 lp | 포인터형 | lpDirectSound |
s | 문자열형 | sPlayerName |
sz | 널 종료 문자열형 | szFileName |
fn | 함수 포인터형 | fnCallback |
h | 핸들형 | hThread |
hwnd 또는 h | 윈도우 핸들형 (Windows만 해당) | hMainWindow |
g_ | 전역 변수 | g_iErrorCode |
c_ | 상수 (const) | c_nBufferSize |
s_ | 정적 변수 (static) | s_pLookupTable |
m_ | 클래스의 멤버 변수 | m_nLength |
C | 클래스 | CHoge |
tag | 구조체 태그 | tagRECT |
이것들은 조합하여 사용될 수도 있다. 예를 들어 "lpsz: 널 종료 문자열에 대한 포인터", "m_ul: 멤버 변수의 부호 없는 롱 정수" 등과 같은 형식이다.
널 종료를 나타내는 "z"는, 대부분의 경우 널 종료 문자열을 나타내는 "sz"의 형태로 나타나지만, 드물게 센티넬로서 0 또는 Null을 배치하고 있는 가변 길이 배열이나 리스트 등의 자료 구조를 나타내기 위해 사용되는 예도 있다.
전역 변수나 멤버 변수를 나타내는 접두사는, 변수의 자료형이 아닌 범위를 구분하기 위한 것이므로, 시스템 헝가리안과 구분하는 시각도 있다.
6. 장점
헝가리안 표기법의 지지자들은 다음과 같은 장점을 제시한다.[3]
- 변수의 자료형을 이름에서 바로 알 수 있다. 이는 통합 개발 환경 외부(코드 검토나 인쇄물 등)에서 코드를 보거나, 변수 선언이 사용 지점과 다른 파일(예: 함수)에 있을 때 유용하다.
- 동적 타이핑을 사용하거나 타입이 없는 언어에서 자료형을 나타내는 접두어는 더 이상 불필요하지 않다. 이러한 언어에서는 변수가 특정 유형의 데이터를 담도록 선언되지 않으므로, 프로그래머가 변수명 규칙, 문서 및 주석을 통해 제공하는 힌트가 변수에 대해 수행할 수 있는 연산에 대한 유일한 단서가 된다. 헝가리안 표기법은 이러한 언어(BCPL)에서 확장되었다.
- 변수명 형식을 사용하면 코드 리팩토링의 일부 측면이 단순화될 수 있다(다른 측면은 오류가 발생하기 쉬워짐).
- 코드 블록에서 유사한 의미를 가진 여러 변수를 사용할 수 있다. (예: dwWidth, iWidth, fWidth, dWidth)
- 변수 유형만 알아도 변수 이름을 쉽게 기억할 수 있다.
- 변수 이름이 더 일관성을 갖게 된다.
- 부적절한 유형 캐스팅 및 호환되지 않는 유형을 사용한 연산을 코드를 읽는 동안 쉽게 감지할 수 있다.
- 많은 전역 객체(VB/Delphi Forms)가 있는 복잡한 프로그램에서 기본 접두사 표기법을 사용하면 편집기 내에서 구성 요소를 찾는 작업이 쉬워진다. 예를 들어, `btn` 문자열을 검색하면 모든 Button 개체를 찾을 수 있다.
- 헝가리안 표기법을 멤버 변수에만 적용하는 좁은 방식으로 사용하면 이름 충돌을 피하는 데 도움이 된다.
- 데이터 유형, 유형 변환, 할당, 잘라내기 등의 경우 인쇄된 코드가 읽는 사람에게 더 명확하게 보인다.
7. 단점
헝가리안 표기법에 대한 대부분의 반대 의견은 "시스템" 헝가리안 표기법에 대한 것이지 "앱" 헝가리안 표기법에 대한 것은 아니다.[7] 잠재적인 문제점은 다음과 같다.
- 컴파일러가 형식 검사를 수행할 때 중복된다. 파스칼과 같이 엄격한 형식 검사를 제공하는 언어의 컴파일러는 변수의 사용이 해당 형식과 일치하는지 자동으로 확인한다. 눈으로 확인하는 것은 중복되며 인적 오류가 발생하기 쉽다.
- 대부분의 최신 통합 개발 환경은 필요에 따라 변수 형식을 표시하고 호환되지 않는 형식을 사용하는 연산을 자동으로 플래그 표시하므로 이 표기법은 거의 쓸모가 없어졌다.
- 여러 속성을 나타내는 데 사용될 때 혼란스러워진다.
- 코드가 수정되거나 이식될 때 일관성이 없어질 수 있다. 변수의 형식이 변경되면 변수 이름의 장식이 새 형식과 일치하지 않거나 변수 이름을 변경해야 한다.
- 대부분의 경우 변수의 사용법을 알면 해당 형식을 아는 것이 된다. 또한, 변수의 사용법을 모르는 경우 해당 형식에서 유추할 수 없다.
- 프로그래머가 형식 지정자를 먼저 입력해야 하므로 변수 이름에 대한 자동 완성을 지원하는 코드 편집기를 사용할 때의 이점을 감소시킨다.
- 형식 및 범위 접두사로 변수의 목적을 모호하게 하여 코드를 덜 읽기 쉽게 만든다.[7]
- 추가적인 형식 정보는 더 설명적인 이름을 충분히 대체하지 못할 수 있다.
- 이름이 충분히 설명적인 경우 추가적인 형식 정보가 중복될 수 있다. 예를 들어 firstName은 문자열일 가능성이 높다. 따라서 sFirstName으로 이름을 지정하면 코드에 불필요한 내용만 추가된다.
- 이름을 기억하기가 더 어렵다.
- 여러 변수는 코드 블록에서 유사한 이름으로 사용될 수 있지만, '''다른''' 의미를 갖는다.
8. 비판
로버트 C. 마틴은 헝가리안 표기법 및 기타 모든 형태의 인코딩은 변수, 함수, 멤버 또는 클래스의 이름이나 유형을 변경하기 어렵게 만들고, 코드를 읽기 어렵게 만들며, 독자를 오도할 가능성을 만든다고 비판한다.[8] 리누스 토르발스는 함수의 유형을 이름에 인코딩하는 것은 컴파일러가 어차피 타입을 확인하는데 프로그래머를 혼란스럽게 할 뿐이라고 지적한다.[9]
비야네 스트롭스트루프는 '헝가리안' 표기법이 유형이 없는 언어에서는 유용할 수 있지만, 제네릭 프로그래밍과 객체 지향 프로그래밍을 지원하는 언어에는 부적합하다고 말한다. 객체의 유형을 이름에 포함시키면 추상화가 복잡해지고 최소화된다는 것이다.[11]
C++(C++)나 C#과 같은 언어에서는 형 지정이 존재하기 때문에 시스템 헝가리안 표기법을 사용하는 것에 대한 이점은 없다.[19][20] 과거 윈도우 API/MFC에서 헝가리안 표기법을 전면적으로 채택했던 마이크로소프트 스스로가 .NET Framework에서는 헝가리안 표기법을 금지하고 있다.[16]
마이크로소프트의 응용 프로그램 개발 그룹에서 개발된 이 표기법은 엑셀이나 워드 등의 개발에서 성공을 거두었기 때문에, Windows 개발 그룹에서도 채용되었다. 그때, 시모니의 논문 중 "type"이 데이터 형식을 의미하는 것으로 오해되어, 변수명에 데이터 형식을 나타내는 접두어 또는 접미어를 붙이는 표기법이라고 오해되었다. 시모니가 의도했던 표기법을 어플리케이션 헝가리안, 오해에 기반한 표기법을 시스템 헝가리안이라고 부른다. Windows API 및 MFC는 대부분 시스템 헝가리안을 따른다. 시스템 헝가리안은 비판받는 경우가 많고, .NET Framework에서는 사용되지 않는다.[16] COM도 시스템 헝가리안이 전통적으로 사용되었지만, .NET의 등장 이후 새롭게 추가된 컴포넌트에 관해서는 시스템 헝가리안을 채용하지 않는 경우가 늘고 있다.[17]
헝가리안 표기법에 두 종류가 있다는 것은 잘 알려져 있지 않으며, 단순히 "헝가리안 표기법"이라고 언급될 경우에도, 시스템 헝가리안의 의미로 사용되는 경우가 많다. 시스템 헝가리안은 모든 접두사를 사용하며, C 언어 및 C++ 특유의 언어 사양, 언어 기능 및 자료형에 의존하는 규칙이 대부분이다.
문자 | 의미 | 사용 예 |
---|---|---|
b 또는 f | 논리형 | bDirtyFlag |
ch | 문자형 | chSeparator |
by | 바이트형 (부호 없는 1바이트 정수) | byGrayLevel |
n 또는 i | 정수형 (int, integer) | nPower |
l | 롱 정수 (long) | lDate |
u | 부호 없는 정수 | uiCount |
w | 워드형 (WORD) | wLanguageCode |
dw | 더블 워드형 (DWORD) | dwSize |
fp 또는 f | 단정밀도부동소수점형 | fpPrice |
db 또는 d | 배정밀도부동소수점형 | dPi |
p 또는 lp | 포인터형 | lpDirectSound |
s | 문자열형 | sPlayerName |
sz | 널 종료 문자열형 | szFileName |
fn | 함수 포인터형 | fnCallback |
h | 핸들형 | hThread |
hwnd 또는 h | 윈도우 핸들형 (Windows만 해당) | hMainWindow |
g_ | 전역 변수 | g_iErrorCode |
c_ | 상수 (const) | c_nBufferSize |
s_ | 정적 변수 (static) | s_pLookupTable |
m_ | 클래스의 멤버 변수 | m_nLength |
C | 클래스 | CHoge |
tag | 구조체 태그 | tagRECT |
위 표의 접두사들은 조합하여 사용될 수도 있다. 예를 들어 "lpsz: 널 종료 문자열에 대한 포인터", "m_ul: 멤버 변수의 부호 없는 롱 정수" 등과 같은 형식이다. 널 종료를 나타내는 "z"는 대부분의 경우 널 종료 문자열을 나타내는 "sz"의 형태로 나타나지만, 드물게 센티넬로서 0 또는 Null을 배치하고 있는 가변 길이 배열이나 리스트 등의 자료 구조를 나타내기 위해 사용되는 예도 있다.
전역 변수나 멤버 변수를 나타내는 접두사는 변수의 자료형이 아닌 스코프를 구분하기 위한 것이므로, 시스템 헝가리안과 구분하는 시각도 있다.
참조
[1]
웹사이트
Oral History of Charles Simonyi
http://archive.compu[...]
2018-08-05
[2]
뉴스
Anything You Can Do, I Can Do Meta
https://www.technolo[...]
2022-07-21
[3]
웹사이트
Hungarian Notation
http://msdn2.microso[...]
Microsoft Corp.
1999-11
[4]
웹사이트
Mozilla Coding Style
https://web.archive.[...]
2015-03-17
[5]
웹사이트
Webkit Coding Style Guidelines
http://www.webkit.or[...]
2015-03-17
[6]
웹사이트
Why would a JavaScript variable start with a dollar sign?
https://stackoverflo[...]
2016-02-12
[7]
서적
The New C Standard: A Cultural and Economic Commentary
http://www.coding-gu[...]
Addison-Wesley
[8]
서적
Clean Code: A Handbook of Agile Software Craftsmanship
Prentice Hall PTR
2008
[9]
웹사이트
Linux kernel coding style
https://www.kernel.o[...]
2018-03-09
[10]
서적
Code Complete
Microsoft Press
2004
[11]
웹사이트
Bjarne Stroustrup's C++ Style and Technique FAQ
http://www.stroustru[...]
2015-02-15
[12]
웹사이트
Making Wrong Code Look Wrong
http://www.joelonsof[...]
2005-12-13
[13]
웹사이트
Design Guidelines for Developing Class Libraries: General Naming Conventions
http://msdn2.microso[...]
2008-01-03
[14]
웹사이트
間違ったコードは間違って見えるようにする
http://local.joelons[...]
2005-05-11
[15]
웹사이트
Hungarian Notation
https://docs.microso[...]
2019-10-05
[16]
웹사이트
一般的な名前付け規則
https://docs.microso[...]
2019-10-05
[17]
웹사이트
Windows Ribbon Framework | Microsoft Docs
https://docs.microso[...]
[18]
서적
C++ Coding Standards: 101 Rules, Guidelines, and Best Practices (C++ In-Depth Series)
Addison-Wesley Professional
2004-10-25
[19]
웹사이트
Stroustrup: C++ Style and Technique FAQ
http://www.stroustru[...]
2019-10-05
[20]
웹사이트
Stroustrup: C++ Glossary
http://www.stroustru[...]
2017-10-22
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com