맨위로가기

식별자

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

식별자는 컴퓨터 과학, 메타데이터, 그리고 다양한 분야에서 사용되는 고유한 이름을 의미한다. 프로그래밍 언어에서 식별자는 변수, 자료형, 서브루틴 등을 가리키는 토큰으로, 언어에 따라 식별자에 사용할 수 있는 문자, 스코프, 그리고 의미 부여 방식에 차이가 있다. 메타데이터에서 식별자는 객체를 고유하게 식별하는 언어 독립적인 레이블이며, 다양한 형식과 구조를 가질 수 있다. 또한, 식별자는 여러 분야에서 사용되며, 형식, 모호성, 그리고 프로그래밍 언어 간의 호환성 문제 등과 같은 문제점을 가지고 있어, 이를 해결하기 위한 다양한 방법들이 존재한다.

더 읽어볼만한 페이지

  • 프로그래밍 언어 개념 - 참조
    참조는 프로그래밍에서 메모리 주소나 다른 데이터를 가리키는 값으로, 데이터의 효율적인 전달과 공유를 위해 사용되며, 포인터, 파일 핸들, URL 등이 그 예시이다.
  • 프로그래밍 언어 개념 - 자료형
    자료형은 프로그래밍 언어에서 데이터를 분류하고 관리하는 추상적인 분류 체계로, 값의 표현, 해석 및 구조에 제약 조건을 가하여 프로그램의 정확성을 검증하며, 단순형/복합형, 언어 정의형/사용자 정의형 등으로 분류되고 문자형, 수치형, 부울형 등 다양한 종류가 있다.
  • 메타데이터 - DOAJ
    DOAJ는 과학 및 학술 저널의 오픈 액세스 가시성을 높이고 이용 편의성을 향상시켜 접근성과 영향력을 확대하며, 피어 리뷰를 거친 학술지를 엄격하게 심사하여 수록하고 모든 콘텐츠를 무료로 제공하는 오픈 액세스 저널 디렉토리이다.
  • 메타데이터 - 해시태그
    해시태그는 2007년 트위터에서 관심 주제를 묶기 위해 제안되어 마이크로블로깅 네트워크에서 널리 사용되기 시작했으며, 다양한 분야에서 활용되고 언어학적 분석의 대상이 되기도 한다.
  • 식별자 - 아카이벌 리소스 키
    아카이벌 리소스 키(ARK)는 디지털, 물리적, 추상적 자원의 영구적인 식별을 위한 체계로, 분산된 웹 환경에서 관리 주체의 약속을 통해 객체의 보존과 접근성을 제공하며, ARK Alliance가 국제적인 사용을 장려하고 한국에서도 활용된다.
  • 식별자 - 바코드
    바코드는 다양한 폭의 막대와 공백 조합으로 정보를 나타내는 기호로, 상품 식별, 재고 관리 등에 사용되며 1차원과 2차원 바코드가 존재하고 바코드 스캐너로 판독되어 산업 효율성을 높인다.
식별자

2. 컴퓨터 과학에서의 식별자

컴퓨터 과학에서 식별자(Identifier, ID)는 어휘 토큰으로서, 특정 개체의 이름을 지정하는 데 사용된다. 식별자는 사실상 모든 정보 처리 시스템에서 광범위하게 활용되며, 어떤 개체를 고유하게 식별하고 참조할 수 있게 해주기 때문에 모든 종류의 기호 처리에 필수적인 요소이다.

특히 프로그래밍 언어에서 식별자는 코드 내에 존재하는 변수, 자료형, 서브루틴, 모듈 등 다양한 언어적 구성 요소를 가리키는 이름, 즉 토큰으로 정의된다. 이를 통해 프로그래머는 코드의 각 부분을 명확하게 구분하고 참조할 수 있다.

2. 1. 프로그래밍 언어

프로그래밍 언어에서 식별자(en: Identifier, ID)는 코드 내에 존재하는 변수, 자료형, 서브루틴(함수, 프로시저, 메서드 등), 레이블, 패키지 등 언어의 구성 요소를 식별하기 위해 사용되는 토큰(기호)이다.[6] 식별자는 사실상 모든 정보 처리 시스템에서 광범위하게 사용되며, 개체를 식별하여 참조하는 것은 모든 종류의 기호 처리에 필수적이다.

각 프로그래밍 언어는 식별자에 사용할 수 있는 문자에 대한 고유한 규칙을 가지고 있다. 일반적으로 식별자는 스코프 내에서 유일해야 하며, 모호함 없이 문법에 맞는 형식이어야 한다.

=== 명명 규칙 ===

많은 프로그래밍 언어는 식별자에 사용할 수 있는 문자를 제한한다.

  • 허용 문자: CC++ 계열 언어에서는 로마자 대문자와 소문자, 숫자, 밑줄 문자(_)만 식별자로 사용할 수 있다. 일반적으로 많은 언어에서 ASCII의 영숫자와 밑줄 등의 일부 기호로 구성된다.
  • 제한 문자: 토큰 구분 기호로 자주 사용되는 공백이나 뺄셈 연산자로 사용되는 하이픈 마이너스(-)는 식별자에 포함될 수 없는 경우가 많다.
  • 첫 글자 제한: 어휘 분석기가 숫자 리터럴과 쉽게 구별할 수 있도록 식별자의 첫 글자에는 숫자를 사용할 수 없는 언어가 많다.
  • 대소문자 구분: 언어에 따라 식별자의 대소문자를 구분하기도 하고, 구분하지 않기도 한다.
  • 유니코드 지원: 최근의 몇몇 언어는 유니코드 문자를 식별자에 사용할 수 있도록 지원한다. 소스 코드를 유니코드로 인코딩하면 ASCII 영숫자 외에 한글, 일본어 등 다양한 문자를 사용할 수 있다. 하지만 언어마다 지원 범위가 다르다. 예를 들어, C#에서는 서로게이트 페어를 식별자로 사용할 수 없지만, 스위프트에서는 이모지와 같은 서로게이트 페어도 식별자로 사용할 수 있다.
  • 예약어 및 키워드: 대부분의 언어에는 `if`, `for`, `while` 등과 같이 식별자로 사용할 수 없는 예약어 또는 키워드가 정해져 있다. C#의 `get`/`set`처럼 특정 위치에서는 키워드로 취급되지만 다른 위치에서는 식별자로 사용할 수 있는 "문맥 의존 키워드"가 있는 언어도 있다.


=== 스코프 ===

식별자의 프로그램 내 스코프나 접근성은 지역(local) 또는 전역(global)일 수 있다.

  • 전역 식별자: 함수 외부에서 선언되며 프로그램 전체에서 사용될 수 있다.
  • 지역 식별자: 특정 함수 내부에서 선언되며 해당 함수 안에서만 사용될 수 있다.[6]


자바와 같이, 같은 스코프 내에서 변수나 메서드 등 다른 구문 요소가 동일한 이름을 가지더라도 문맥에 따라 구별할 수 있는 언어도 있다. 자세한 내용은 네임스페이스 문서를 참조할 수 있다.

=== 식별자 기반 의미 부여 ===

일반적으로 컴파일러와 인터프리터는 식별자를 구성하는 문자 자체에 특별한 의미를 부여하지 않지만, 예외적인 경우도 존재한다.

  • : 변수를 참조할 때 시길($, @, %, & 등)이라는 접두사를 사용하여 에서 해당 변수가 어떻게 해석될지를 결정한다.
  • 루비: 식별자가 대문자로 시작하면 해당 변수는 자동으로 불변으로 간주된다.
  • 포트란: 변수 이름의 첫 글자에 따라 기본적으로 해당 변수가 정수형인지 실수형인지 결정된다. (예: I-N으로 시작하면 정수형)
  • Go: 식별자의 첫 글자가 대문자이면 외부 패키지에서 접근 가능한 public으로, 소문자이면 해당 패키지 내에서만 접근 가능한 private으로 간주된다.[7]


Go와 같은 일부 언어에서는 식별자의 고유성이 철자뿐만 아니라 이러한 가시성(visibility) 규칙에 의해서도 결정된다.[7]

2. 2. 식별자의 범위

식별자가 프로그램 내에서 사용될 수 있는 범위, 즉 스코프(scope)나 접근 가능성(accessibility)은 지역(local) 또는 전역(global)으로 나뉜다. 전역 식별자는 함수 밖에서 선언되며, 프로그램 전체 어디에서든 사용할 수 있다. 반면, 지역 식별자는 특정 함수 안에서 선언되며, 그 함수 내부에서만 사용할 수 있다.[6]

2. 3. 모호성

자원은 여러 개의 식별자를 가질 수 있다. 예를 들어, 한 사람은 여러 이름, 별명, 호칭(직함, 경칭)으로 불릴 수 있으며[1], 문서는 여러 버전을 가질 수 있다. 또한, 하나의 물질도 CAS 색인 이름이나 IUPAC 이름처럼 여러 이름으로 불릴 수 있다.[2] 의약품의 경우에도 INN, USAN, 브랜드 이름 등 다양한 식별자가 존재한다.

  • '''예시:''' 어떤 특정 개인은 제인 스미스, 제인 엘리자베스 메러디스 스미스, 제인 E. M. 스미스, 제인 E. 스미스, 재니 스미스, 재니, 리틀 재니, 제인 이모, 재니 이모, 엄마, 할머니, 켈리의 어머니, 빌리의 할머니, 스미스 씨, 스미스 박사, 제인 E. 스미스, PhD, 퍼지 등 다양한 식별자로 불릴 수 있다.


반대로, 여러 자원이 동일한 식별자로 표현될 수도 있는데, 이는 명명 충돌 문제로 이어질 수 있다.

많은 코드명명법 체계는 작은 네임스페이스 안에서 시작된다. 시간이 지나면서 국경 간 무역, 과학 협력, 문화 교류 등이 활발해지면 네임스페이스는 확장된다. 이 과정에서 원래 명명 규칙의 한계가 드러나면서 역사적 소급 명칭, 동의어, 번역이나 변환 등이 필요해진다. 이러한 문제는 주로 다음과 같은 이유로 발생한다.

  • 암시적 컨텍스트: 이전에는 좁은 범위에서만 통용되던 규칙이 더 넓은 범위에 적용되면서 문제가 생긴다.
  • 용량 부족: 과거의 좁은 환경을 반영하여 식별자 수가 제한적이다.
  • 확장성 부족: 미래의 필요에 대비한 기능이 부족하다.
  • 특정성 및 모호성 제거 능력 부족: 기존의 고유했던 식별자가 새로운 환경에서 중복될 수 있다.


컴퓨터 과학에서는 이러한 문제를 명명 충돌이라고 부른다. 만약 모든 객체가 고유 식별자(UID)를 가진다면 네임스페이스가 필요 없겠지만, 인간이 수많은 UID를 모두 기억하고 관리하기는 어렵기 때문에 네임스페이스는 여전히 필요하다.

프로그래밍 언어에서도 식별자와 관련된 모호성 문제가 발생할 수 있다. 일반적으로 식별자는 특정 스코프 내에서 하나의 의미만 가져야 하지만, 자바처럼 문맥에 따라 같은 이름의 식별자(변수명과 메서드명 등)를 구별할 수 있는 언어도 있다. 자세한 내용은 네임스페이스 문서를 참조할 수 있다.

특히 여러 프로그래밍 언어를 함께 사용하거나 라이브러리를 공유할 때 문제가 두드러진다.

  • C#이나 C++/CLI는 대소문자를 구분하지만, VB.NET은 구분하지 않는다. 따라서 C#에서 대소문자만 다른 식별자(예: `myVariable`과 `MyVariable`)를 공개(public/protected) 심볼로 포함하는 라이브러리를 만들면, VB.NET에서는 이를 같은 이름으로 인식하여 컴파일 오류가 발생할 수 있다.
  • F#처럼 식별자에 기호나 공백을 사용할 수 있는 언어도 있지만, C# 등 비대응 언어에서는 해당 식별자를 직접 다루기 어려우며, 리플렉션 등의 방법을 사용해야 참조할 수 있다.
  • JavaScript나 JSON에서는 `$` (달러 기호)를 식별자에 사용할 수 있다. 그러나 $ 기호를 식별자로 사용할 수 없는 언어에서 JSON 데이터를 처리할 때는, 일반적으로 `data.hoge`처럼 접근하는 대신 `data["hoge$piyo"]`와 같이 문자열 형태로 접근하는 등의 별도 조치가 필요할 수 있다.


이러한 언어 간 호환성 문제를 피하기 위해, 여러 언어에서 사용될 라이브러리나 API를 개발할 때는 공통 언어 규격(CLS)을 따르는 것이 권장된다.[4][5] CLS는 다양한 .NET 언어들이 서로 호환될 수 있도록 식별자 명명 규칙(예: 대소문자만 다른 식별자 금지, 특정 기호 사용 제한 등)을 포함한 최소한의 공통 사양을 정의한다.

3. 메타데이터에서의 식별자

메타데이터에서 식별자는 식별 체계 내에서 객체를 고유하게 식별하는 언어 독립적인 레이블, 기호 또는 토큰이다. '식별자'라는 접미사는 데이터 요소의 이름을 지정할 때 표현 용어로 사용되기도 한다.

ID 코드는 본질적으로 메타데이터를 함께 전달할 수 있다. 예를 들어, 눈앞의 식품 패키지에 "2011-09-25T15:42Z-MFR5-P02-243-45"라는 식별자가 있다면, 이 식별자 자체뿐만 아니라 다음과 같은 메타데이터도 알 수 있다.


  • 포장 일시: 2011년 9월 25일 15시 42분 (UTC)
  • 제조사: 면허를 받은 공급업체 번호 5
  • 생산 정보: 미국 일리노이주 피오리아 공장 건물 2에서 해당 교대조에서 생산된 243번째 패키지
  • 검사 정보: 검사관 번호 45가 검사


반면, 임의의 식별자는 메타데이터가 없을 수 있다. 예를 들어, 식품 패키지에 단순히 '100054678214'라고만 적혀 있다면, 이 ID는 해당 객체를 특정하는 것 외에는 포장 날짜, 제조업체 이름, 생산 순위 또는 검사관 번호와 같은 추가 정보를 제공하지 않을 수 있다. 어떤 경우에는 일련번호와 같은 임의의 식별자가 의도치 않게 정보를 유출하기도 한다(예: 독일 전차 문제). 정보 유출을 최소화하도록 설계된 식별자를 불투명 식별자라고 하며, 여기에는 '정말 불투명 포인터'나 버전 4 UUID 등이 있다.

4. 여러 분야에서의 식별자

식별자범위
원자 번호국제적 (ISV를 통해)
호주 사업자 번호호주
CAGE 코드미국 및 북대서양 조약 기구
CAS 등록 번호미국에서 시작, 현재는 국제적 (ISV를 통해)
CODEN미국에서 시작, 현재는 국제적
디지털 객체 식별자 (DOI, doi)Handle System 이름 공간, 국제적 범위
DIN 표준 번호독일에서 시작, 현재는 국제적
E 번호유럽 연합에서 시작, 국제적으로 사용될 수 있음
EC 번호
고용주 식별 번호 (EIN)미국
전자 식별자 일련의 공표 (EISP)국제적
국제 상품 거래 번호국제적
그룹 식별자특정 컴퓨터 시스템 등 다양한 범위
국제 화학 식별자국제적
국제 표준 도서 번호 (ISBN)ISBN은 EAN 이름 공간의 일부, 국제적 범위
국제 전자책 식별자 번호 (IEIN)국제적
국제 표준 연속물 번호 (ISSN)국제적
ISO 표준 번호 (예: ISO 8601)국제적
의회 도서관 제어 번호미국 (일부 국제적인 서지학적 유용성 포함)
개인 식별 번호 (PIN)다양한 범위 (예: 은행, 정부)
개인 식별 번호 (덴마크)덴마크
제약 코드다양한 시스템
제품 배치 번호
일련 항목 및 기여 식별자미국 (일부 국제적인 서지학적 유용성 포함)
일련 번호회사별, 정부별 등 다양한 범위
서비스 배치 번호
사회 보장 번호미국
세금 파일 번호호주
고유 기사 식별자 (UAI)국제적

5. 한국의 CDMA 단말기 식별자

CDMA 단말기, 즉 휴대전화의 식별자에는 ESN, 일련번호, 전화번호가 있다. 기지국과 연동되는 각 통신사의 전산망에는 서비스 가입자의 ESN, 일련번호, 전화번호가 입력되어 있으며, 이를 토대로 가입자를 식별하게 된다. 사용자가 이러한 식별자를 임의로 변경하는 것은 불법 행위이며, 단말기의 통신을 불가능하게 만들 수 있다.

6. 식별자의 형식

식별자는 종종 구조를 가지며, 이를 통해 관련된 정보를 나타내기도 한다. 예를 들어 우편번호는 지역을 식별하는 데 사용되며, 앞자리 숫자는 광역 지역을, 나머지 숫자는 그 안의 세부 구역을 나타내는 계층 구조를 가진다. 이러한 구조는 주로 구분자를 사용하여 표현된다.

대표적인 구분자와 사용 예시는 다음과 같다.

구분자 종류예시 (구조)설명
마침표 (.)IPv4 주소 (196.0.0.1)점으로 구분된 4개의 숫자 그룹으로 구성된 4계층 구조
콜론 (기호) (:)IPv6 주소 (2001:0db8:0000:0000:0000:0000:0000:9abc)콜론으로 구분된 8개의 16진수 그룹으로 구성된 6계층 구조
슬래시 (기호) (/)경로 (root/home/app)슬래시로 구분되는 임의의 계층 구조 (주로 파일 시스템 경로에 사용)



식별자의 구조가 고정된 길이를 가질 경우, 특정 부분을 생략하는 표기법이 정의되기도 한다. 예를 들어 IPv6 주소에서는 연속되는 0 그룹을 콜론 두 개(::)로 축약하여 2001:0db8::9abc와 같이 표기할 수 있다. ARN(Amazon Resource Name)의 경우, 존재하지 않는 계층을 생략하여 arn:aws:iam::123:role/roleA와 같이 나타낼 수 있다.

7. 식별자 관련 문제

식별자는 일반적으로 스코프 내에서 여러 의미를 가져서는 안 되며, 모호함 없이 문법에 맞는 형식이어야 한다. 하지만 자바와 같이, 같은 스코프 내에서 변수나 메서드 등 다른 구문 요소가 동일한 이름을 가져도 문맥에 따라 구별할 수 있는 언어도 있다. 자세한 내용은 네임스페이스 문서를 참조할 수 있다.

동일한 네임스페이스 내에서 같은 식별자를 사용하면 명명 충돌이 발생할 수 있다. 이는 특히 서로 다른 시스템이나 코드 체계가 통합되거나 확장될 때 문제가 되기도 한다.

서로 다른 프로그래밍 언어 간에 객체 심볼을 공유할 때 식별자 관련 문제가 발생하기도 한다.


  • '''대소문자 구분 문제''': C#이나 C++/CLI는 대소문자를 구분하므로, 같은 네임스페이스 안에 대소문자만 다른 식별자를 가진 여러 형식을 정의할 수 있다. 그러나 이를 공개(public, protected) 심볼로 포함하는 라이브러리를 대소문자를 구분하지 않는 VB.NET에서 사용하려고 하면, 같은 이름의 식별자가 여러 개 존재한다고 판단되어 컴파일 오류가 발생한다.
  • '''허용 문자 차이 문제''': 공통 중간 언어(CIL)에서는 문법상 모호성이 없으면 기호나 공백이 포함된 식별자도 허용된다. F# 등에서는 이런 식별자를 사용할 수 있지만, C# 등에서는 해당 식별자를 직접 다룰 수 없어 리플렉션 같은 특별한 방법을 사용해야만 참조할 수 있다.
  • '''특수 기호 문제''': JavaScript나 JSON에서는 `$` (달러 기호)를 식별자에 사용할 수 있다. 하지만 `$`를 식별자로 쓸 수 없는 다른 언어에서 이런 JSON 데이터를 처리하려면, 일반적인 속성 접근 방식(예: `data.hoge$piyo`) 대신 문자열을 이용한 접근(예: `data["hoge$piyo"]`) 같은 방법을 사용해야 한다.


이러한 언어 간 호환성 문제를 피하기 위해, 라이브러리(API) 등은 공통 언어 규격(CLS)을 따르도록 권장된다.[4][5]

참조

[1] 웹사이트 Procedure for Applying Identifiers to Documents http://www.gla.ac.uk[...] 2009-04-28
[2] 웹사이트 Information on Chemical Nomenclature http://gethelp.libra[...] 2009-04-28
[3] 간행물 ISO/IEC 25760-1:2011 3.1.1~3.1.4
[4] 웹사이트 Capitalization Conventions | Microsoft Docs https://docs.microso[...]
[5] 웹사이트 Visual Basic Naming Conventions | Microsoft Docs https://docs.microso[...]
[6] 서적 C++ programming : from problem analysis to program design Cenage Learning 2014
[7] 웹인용 The Go Programming Language Specification - The Go Programming Language http://golang.org/re[...] Golang.org 2013-06-05



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com