본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

별명(alias)은 프로그래밍 언어에서 하나의 자료 객체(기억 장소)에 둘 이상의 이름이 동시에 바인딩되어 있는 상태를 말한다. 한 이름으로 값을 바꾸면 다른 이름으로 읽은 값도 함께 바뀐다. 이런 현상을 에일리어싱(aliasing)이라 한다.

변수는 이름과 기억 장소가 묶인(바인딩된) 것이다. 보통은 이름 하나에 기억 장소 하나가 대응하지만, 포인터나 참조를 쓰면 서로 다른 이름이 같은 기억 장소를 가리킬 수 있다. 프로그램을 읽는 사람은 한 이름을 바꿨는데 다른 이름의 값이 왜 바뀌는지 알아차리기 어렵고, 컴파일러도 두 이름이 같은 곳인지 몰라 최적화를 덜 하게 된다.

별명이 생기는 경우

편집 원본 편집
  • 두 포인터가 같은 변수를 가리킬 때
  • 참조에 의한 전달(call by reference)로 넘긴 인자와 원래 변수
  • C++ 의 참조 변수(int &r = a;)
  • 포트란의 EQUIVALENCE, C 의 공용체(union)
  • 배열 원소 a[i] 와 a[j] 에서 i 와 j 가 같을 때
  • 자바·파이썬에서 객체 참조를 다른 변수에 대입했을 때
int a = 10;
int *p = &a;     /* a 와 *p 는 같은 기억 장소의 두 이름(별명) */
*p = 20;
printf("%d\n", a);   /* 20 */

C99 의 restrict 키워드는 "이 포인터가 가리키는 곳에는 다른 별명이 없다" 고 컴파일러에 알려 최적화를 허용한다.

헷갈리는 개념

편집 원본 편집

네 가지 모두 이름(참조)과 기억 장소의 바인딩·수명에서 생기는 문제다.

개념 뜻 예
별명(alias) 하나의 기억 장소에 이름이 둘 이상 바인딩되어 있다 p = &a 뒤의 a 와 *p
부작용(side effect) 함수가 값을 돌려주는 것 말고 전역 변수, 인자로 받은 변수, 입출력 상태 등 바깥 상태를 바꾼다 호출할 때마다 전역 카운터를 늘리는 함수
허상 참조(dangling reference, 현수 참조) 참조는 남아 있는데 그것이 가리키던 기억 장소는 이미 해제되었다 → 허상 참조 free 한 뒤에도 쓰는 포인터
가비지(garbage) 할당은 되어 있는데 어떤 이름으로도 접근할 수 없는 기억 장소 → 가비지 컬렉션 다른 곳을 가리키게 바꿔 버려 잃어버린 힙 블록

허상 참조는 '기억 장소 없는 이름', 가비지는 '이름 없는 기억 장소'로 서로 반대다. 별명이 있으면 한 이름으로 기억 장소를 해제했을 때 다른 이름이 허상 참조가 된다. 부작용이 있는 함수는 별명을 통해 호출한 쪽의 변수까지 바꿀 수 있다. 함수형 언어는 부작용을 없애 이런 문제를 피한다.

SQL·셸에서 테이블·명령에 짧은 이름을 붙이는 alias 는 다른 뜻이다 → Alias