참조(컴퓨터 과학)
Reference (computer science)컴퓨터 과학에서 참조란 컴퓨터의 메모리나 다른 저장장치에서 프로그램이 변수의 값이나 기록과 같은 특정 데이터에 간접적으로 접근할 수 있도록 하는 값이다.참조는 기준점을 참조한다고 하며, 기준점에 접속하는 것을 참조를 비참조라고 한다.
참조는 기준 자체와 구별된다.일반적으로 특정 시스템의 메모리에 저장된 데이터에 대한 참조의 경우, 참조는 데이터가 메모리 또는 저장 장치에 저장되는 위치의 물리적 주소로 구현된다.이러한 이유로 참조는 종종 포인터나 주소와 잘못 혼동되며, 데이터를 "지점"한다고 한다.그러나 기준점 주소와 일부 고정된 "기본" 주소 사이의 간격띄우기(차이)와 같은 다른 방법으로 참조를 배열의 인덱스로서, 또는 핸들로 보다 추상적으로 구현할 수도 있다.네트워킹에서 보다 광범위하게 참조는 URL과 같은 네트워크 주소일 수 있다.
참조의 개념은 데이터 항목을 고유하게 식별하는 다른 값(키 또는 식별자)과 혼동해서는 안 되며, 일부 테이블 데이터 구조에서 비종교적인 조회 연산을 통해서만 그것에 접근할 수 있도록 해야 한다.
참조는 프로그래밍에 널리 사용되며, 특히 큰 데이터나 변이 가능한 데이터를 절차의 인수로 효율적으로 전달하거나, 그러한 데이터를 다양한 용도 간에 공유하기 위해 사용된다.특히 참조는 다른 데이터에 대한 참조를 포함하는 변수나 기록을 가리킬 수 있다.이 아이디어는 간접 주소 지정의 기초가 되며 링크된 목록과 같은 많은 연계된 데이터 구조의 기초가 된다.참조는 프로그램에서 상당한 복잡성을 야기할 수 있는데, 그 이유는 부분적으로 매달린 참조와 야생 참조의 가능성 때문이고, 부분적으로 참조가 있는 데이터의 토폴로지가 지시된 그래프이기 때문이며, 분석은 상당히 복잡할 수 있다.
혜택들
참조는 객체를 저장할 수 있는 위치, 객체를 할당하는 방법 및 코드 영역 간에 전달되는 방법에서 유연성을 증가시킨다.데이터에 대한 참조에 접근할 수 있는 한 이를 통해 데이터에 접근할 수 있으며, 데이터 자체를 이동할 필요는 없다.그들은 또한 서로 다른 코드 영역들 간의 데이터 공유를 더 쉽게 만들며, 각각은 그것에 대한 참조를 유지한다.
참고문헌의 메커니즘은 구현에 차이가 있을 경우 거의 모든 현대 프로그래밍 언어에 공통되는 기본적인 프로그래밍 언어 기능이다.참조의 직접적인 사용을 지원하지 않는 일부 언어조차도 일부 내부 또는 암묵적 사용을 가지고 있다.예를 들어, 참조 호출에 의한 호출 규약은 참조의 명시적 또는 암묵적 사용을 통해 구현될 수 있다.
예
포인터는 가장 원시적인 형태의 참조다.기반 하드웨어와의 긴밀한 관계 때문에, 그것들은 가장 강력하고 효율적인 유형의 참고 자료 중 하나이다.그러나, 또한 이러한 관계 때문에 포인터는 메모리 아키텍처의 세부사항에 대한 프로그래머의 강력한 이해를 필요로 한다.포인터가 메모리 위치의 주소를 저장하기 때문에, 포인터의 부적절한 사용은 특히 매달린 포인터나 야생 포인터로 인해 프로그램에서 정의되지 않은 동작으로 이어질 수 있다.스마트 포인터는 포인터처럼 작용하지만 특정 방법을 통해서만 접근할 수 있는 불투명한 데이터 구조다.
손잡이는 추상적인 참조로, 다양한 방법으로 표현될 수 있다.일반적인 예는 파일 내용을 추상화하는 데 사용되는 파일 핸들(C 표준 I/O 라이브러리의 FILE 데이터 구조)이다.일반적으로 파일 잠금을 요청할 때와 같이 파일 자체와 파일을 읽을 때와 같이 파일 내용 내의 특정 위치를 모두 나타낸다.
분산 컴퓨팅에서 참조는 주소나 식별자 이상을 포함할 수 있다. 또한 참조된 객체를 찾고 접근하는 데 사용되는 네트워크 프로토콜의 내장된 사양, 즉 정보가 인코딩되거나 직렬화되는 방식을 포함할 수도 있다.따라서 예를 들어, 원격 웹 서비스에 대한 WSDL 설명은 참조의 한 형태로 볼 수 있다. 특정 웹 서비스를 찾고 바인딩하는 방법에 대한 완전한 사양을 포함한다.라이브 분산 객체에 대한 참조는 또 다른 예로서, 이후에 피어 투 피어 상호작용을 하게 될 프록시라고 불리는 작은 소프트웨어 구성요소를 구성하는 방법과 로컬 컴퓨터가 약하게 일관된 메시지 스트림으로만 복제되거나 존재하는 데이터에 대한 액세스를 얻을 수 있는 방법에 대한 완전한 규격이다.이 모든 경우에 참조는 데이터에 액세스하는 방법에 대한 전체 지침 집합 또는 레시피를 포함한다. 이러한 의미에서 참조는 메모리에 있는 식별자 또는 주소와 동일한 목적을 제공한다.
형식적 표현
보다 일반적으로 참조는 다른 데이터의 고유한 검색을 허용하는 데이터 조각으로 간주될 수 있다.여기에는 데이터베이스의 기본 키와 연관 배열의 키가 포함된다.키 K 집합과 데이터 개체 D 집합이 있는 경우, K에서 D까지 잘 정의된(단일 값) 함수는 참조 유형을 정의하며, 여기서 null은 의미 있는 것을 참조하지 않는 키의 이미지다.
그러한 함수의 대체 표현은 도달성 그래프라고 불리는 방향 그래프다.여기서 각 기준점은 정점으로 표시되며 u의 기준점이 v의 기준점을 가리킬 경우 u에서 v까지의 에지가 있다.최대 아웃도는 1이다.이러한 그래프는 가비지 수집에서 중요한데, 가비지 수집은 접근하기 어려운 개체로부터 접근 가능한 것을 분리하는 데 사용될 수 있다.
외장 및 내장 스토리지
많은 데이터 구조에서 크고 복잡한 개체는 더 작은 개체로 구성된다.이러한 물체는 일반적으로 다음 두 가지 방법 중 하나로 저장된다.
- 내부 저장장치로는 작은 물체의 내용물이 큰 물체 안에 저장된다.
- 외부 스토리지에서는 작은 개체가 자신의 위치에 할당되고, 큰 개체는 해당 개체에 대한 참조만 저장된다.
참조 및 동적 할당 메타데이터에 대한 공간 비용과 참조를 참조 취소하고 더 작은 개체에 메모리를 할당하는 데 드는 시간 비용이 있기 때문에 내부 스토리지가 일반적으로 더 효율적이다.또한 내장형 저장장치는 동일한 큰 물체의 서로 다른 부분을 메모리에 가깝게 유지함으로써 참조의 위치성을 향상시킨다.그러나 외장 스토리지를 선호하는 상황은 다양하다.
- 데이터 구조가 반복적인 경우, 그 자체가 포함될 수 있다는 것을 의미한다.이것은 내부적인 방법으로 나타낼 수 없다.
- 스택과 같이 공간이 제한된 영역에 더 큰 객체가 저장되고 있다면, 다른 메모리 영역에 큰 구성요소 객체를 저장하고 참조를 사용하여 참조함으로써 저장소의 고갈을 방지할 수 있다.
- 만약 작은 물체들이 크기가 다를 수 있다면, 큰 물체들이 여전히 그것들을 포함할 수 있도록 크기를 조정하는 것은 종종 불편하거나 비용이 많이 든다.
- 참고문헌은 종종 새로운 요구사항에 더 잘 적응하고 다루기 더 쉽다.
Java, Smalltalk, Python 및 Scheme과 같은 일부 언어는 내부 스토리지를 지원하지 않는다.이러한 언어에서 모든 사물은 참조를 통해 균일하게 접근된다.
언어 지원
사용되는 첫 번째 언어인 어셈블리 언어에서는 원시 메모리 주소나 인덱스를 사용하여 참조를 표로 표현하는 것이 일반적이다.이러한 정보는 프로그램 논리에 암호화되어 있지만, 주소가 그것이 가리키는 가치에 대해 심지어 그것이 얼마나 크거나 어떻게 해석해야 하는지에 대해서도 아무것도 알려주지 않기 때문에, 이러한 정보는 사용하기가 다소 까다롭다.그 결과 잘못된 프로그램에서 오역이 발생하여 당황스러울 정도로 오류가 발생할 수 있다.
가장 초기 불투명한 참조 중 하나는 Lisp 언어 cons cell의 그것이었는데, 이것은 단순히 다른 cons cell을 포함하여 다른 lisp 객체에 대한 두 개의 참조를 포함하는 기록이다.이 간단한 구조는 단독 링크된 리스트를 작성하는 데 가장 많이 사용되지만, 단순한 이진수, 소위 "점화된 리스트"를 만드는 데도 사용될 수 있는데, 이 리스트는 null reference가 아니라 값으로 종료된다.
또 다른 초기 언어인 포트란은 참조를 명시적으로 표현하지 않지만, 참조별 호출 의미론에서 암묵적으로 사용한다.
포인터는 오늘날에도 여전히 가장 인기 있는 유형의 참고 자료 중 하나이다.참조하는 데이터가 잘못 해석되지 않도록 컴파일 시간에 사용할 수 있는 정적 데이터 형식을 가지고 있다는 점을 제외하면 원시 주소의 어셈블리 표현과 유사하다.단, C는 깁스를 이용하여 위반할 수 있는 약한 타입의 시스템(다양한 포인터 타입 간, 포인터 타입과 정수 간 변환을 설명함)을 가지고 있기 때문에, 더 어렵더라도 여전히 오역이 가능하다.그것의 후계자 C++는 그것의 표준 라이브러리에 있는 새로운 캐스트 운영자 및 스마트 포인터와 함께 포인터의 유형 안전을 증가시키려고 노력했지만, 여전히 호환성을 위해 이러한 안전 메커니즘을 우회하는 능력을 가지고 있었다.
오늘날 에펠, 자바, C#, 비주얼 베이직과 같은 많은 인기 있는 주류 언어들은 보통 단순히 참고문헌으로 언급되는 훨씬 불투명한 유형의 참고문헌을 채택했다.이러한 참조는 참조하는 데이터를 해석하는 방법을 나타내는 C 포인터와 같은 유형을 가지지만 원시 주소로 해석할 수 없고 안전하지 않은 변환은 허용되지 않는다는 점에서 형식이다.
포트란
Fortran 참조는 스칼라 변수나 배열의 행 또는 열과 같은 다른 객체의 별칭으로 가장 잘 생각된다.참조를 배제하거나 참조자의 내용을 직접 조작하는 구문은 없다.Fortran 참조는 null일 수 있다.다른 언어에서와 마찬가지로, 이러한 참조는 링크된 목록, 대기열 및 나무와 같은 동적 구조의 처리를 용이하게 한다.
기능 언어
위의 모든 설정에서, 변형 가능한 변수, 수정할 수 있는 데이터의 개념은 종종 참조를 암묵적으로 사용한다.표준 ML, OCaml 및 많은 다른 기능 언어에서 대부분의 값은 영구적이다. 할당으로 수정할 수 없다.할당 가능한 "참고 세포"는 명령어에서의 변이 가능한 참조의 피할 수 없는 목적을 제공하고, 그 기능을 명시적으로 수정한다.그러한 기준 세포는 어떤 값도 가질 수 있으며, 따라서 다형성 타입이 주어진다.α ref
, whereα
가리키는 값의 유형으로 대체해야 한다.이러한 변이성 언급은 일생 동안 다른 물체를 가리킬 수 있다.예를 들어, 이를 통해 원형 데이터 구조를 구축할 수 있다.기준 셀은 기능적으로 길이 1의 배열과 동일하다.
안전성과 효율적인 구현을 보존하기 위해 참조를 ML에서 타이프캐스트할 수 없으며 포인터 산술도 수행할 수 없다.기능적 패러다임에서 C와 같은 언어로 포인터를 사용하여 표현될 많은 구조들이 강력한 대수적 데이터 유형 메커니즘과 같은 다른 시설을 사용하여 표현된다는 점에 유의해야 한다.컴파일러가 종종 "후드 아래" 기계 포인터를 사용함에도 불구하고 프로그래머는 프로그래밍을 하는 동안 특정 속성(불변성의 보증 등)을 즐길 수 있다.
기호 참조
Perl과 같은 일부 언어는 변수의 이름을 포함하는 문자열 값일 뿐인 기호 참조를 지원한다.Perl은 정규 참조가 아닌 값이 참조되지 않는 경우 이를 기호 참조로 간주하고 값이 부여한 이름을 변수에 부여한다.[1]PHP는 그 형태와 유사한 특징을 가지고 있다.$var
구문.[2]
객체 지향 언어의 참조
많은 객체 지향 언어들은 참조를 광범위하게 사용한다.그들은 객체에 접근하고 할당하기 위해 참조를 사용할 수 있다.참조는 함수/방법 호출이나 메시지 전달에도 사용되며, 참조 카운트는 사용되지 않는 물체의 가비지 수집을 수행하는 데 자주 사용된다.
참고 항목
참조
- ^ "perlref". perldoc.perl.org. Retrieved 2013-08-19.
- ^ "Variable variables - Manual". PHP. Retrieved 2013-08-19.
외부 링크
![]() | 무료 사전인 Wiktionary에서 부조리를 찾아 보십시오. |
- 3분짜리 교육용 동영상의 포인터에 대한 소개와 함께 재미있는 포인터 – 스탠포드 컴퓨터 과학 교육 라이브러리