맨위로가기

참조

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

1. 개요

참조는 프로그래밍에서 다른 데이터에 접근하기 위한 값으로, 메모리 주소나 다른 데이터를 가리킨다. 참조는 데이터의 효율적인 전달과 공유를 위해 사용되며, 포인터, 파일 핸들, URL 등이 그 예시이다. 참조는 내부 저장과 외부 저장 방식으로 나뉘며, 프로그래밍 언어에 따라 다양한 방식으로 지원된다.

더 읽어볼만한 페이지

  • 원시 자료형 - 문자열
    문자열은 사람이 읽을 수 있는 텍스트를 저장하고 정보를 전달하거나 받는 데 사용되는 순서가 있는 문자들의 시퀀스로, 다양한 형태의 데이터를 표현하며 유한한 길이를 가지고, 프로그래밍 언어에서 기본 또는 복합 자료형으로 제공되고, 문자 집합과 인코딩 방식에 따라 표현 방식이 달라진다.
  • 원시 자료형 - 바이트
    바이트는 디지털 정보의 기본 단위로, 일반적으로 8비트로 구성되지만, 역사적으로는 다양한 비트 수를 가질 수 있었으며, 컴퓨터 메모리 용량이나 데이터 크기를 나타내는 데 널리 사용된다.
  • 프로그래밍 언어 개념 - 자료형
    자료형은 프로그래밍 언어에서 데이터를 분류하고 관리하는 추상적인 분류 체계로, 값의 표현, 해석 및 구조에 제약 조건을 가하여 프로그램의 정확성을 검증하며, 단순형/복합형, 언어 정의형/사용자 정의형 등으로 분류되고 문자형, 수치형, 부울형 등 다양한 종류가 있다.
  • 프로그래밍 언어 개념 - 다형성 (컴퓨터 과학)
    다형성은 프로그래밍 언어에서 이름이 여러 자료형에 사용되거나 객체가 여러 타입으로 취급되는 능력으로, 코드 재사용성과 유연성을 높이며 임시 다형성, 매개변수 다형성, 서브타이핑 등으로 분류되고 객체 지향 프로그래밍의 중요한 특징이며 정적, 동적 다형성으로 구현된다.
  • 자료형 - 익명 함수
    익명 함수는 이름이 없는 함수로, 람다 추상, 람다 함수, 람다 표현식, 화살표 함수 등으로 불리며, 함수형 프로그래밍 언어에서 람다식 형태로 많이 사용되고 고차 함수의 인수, 클로저, 커링 등에 활용되지만, 재귀 호출의 어려움이나 기능 제한과 같은 단점도 존재한다.
  • 자료형 - 형 변환
    형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다.
참조
자료형
종류추상 자료형
분야컴퓨터 과학
개요
정의프로그램이 메모리의 특정 값에 간접적으로 접근할 수 있도록 하는 자료형
설명참조는 값 자체가 아닌 값의 위치(메모리 주소)를 나타냄
관련 개념포인터
변수
객체
특징
메모리 관리참조는 자동으로 메모리를 관리하는 데 사용될 수 있음 (예: 가비지 컬렉션)
안정성포인터에 비해 더 안전하게 사용될 수 있음 (예: C++의 참조)
유연성함수에 객체를 전달하거나 반환할 때 유용함
사용 예시
변수 참조변수를 참조하여 원래 변수의 값을 변경할 수 있음
객체 참조객체를 참조하여 객체의 속성이나 메서드에 접근할 수 있음
함수 인자함수에 참조를 전달하여 함수 내부에서 원본 데이터를 변경할 수 있음
프로그래밍 언어
지원 언어C++
자바
C#
파이썬
스위프트
장점 및 단점
장점메모리 효율성: 불필요한 데이터 복사를 방지
코드 가독성 향상: 포인터보다 더 명확한 의미 전달
안정성 향상: 잘못된 메모리 접근으로 인한 오류 감소
단점포인터에 비해 유연성이 떨어질 수 있음
참조의 동작 방식을 이해하는 데 어려움이 있을 수 있음

2. 형식 표현

참조 ''R''은 역참조(''R'') 연산을 허용하는 값이며, 이 연산은 값을 산출한다. 일반적으로 참조는 특정 유형의 값을 반환하도록 형식이 지정된다.[1][2]

종종 참조는 추상 변수를 의미하는 할당 연산 저장(''R'', ''x'')을 허용하기도 한다.[1]

3. 사용

참조는 특히 크거나 변경 가능한 데이터를 프로그래밍에서 프로시저의 인수로 효율적으로 전달하거나 다양한 용도로 데이터를 공유하기 위해 널리 사용된다. 특히, 참조는 다른 데이터에 대한 참조를 포함하는 변수 또는 레코드를 가리킬 수 있다. 이 아이디어는 간접 주소 지정 및 연결 리스트와 같은 많은 연결된 데이터 구조의 기반이 된다. 참조는 객체가 저장될 수 있는 위치, 객체의 할당 방법, 그리고 코드의 여러 영역 간에 객체가 전달되는 방식을 유연하게 만든다. 데이터에 대한 참조에 액세스할 수 있는 한, 이를 통해 데이터에 액세스할 수 있으며 데이터 자체를 이동할 필요가 없다. 또한 서로 다른 코드 영역 간의 데이터 공유를 더 쉽게 만든다. 각 코드 영역은 해당 데이터에 대한 참조를 유지한다.

참조는 프로그램에 상당한 복잡성을 유발할 수 있다. 이는 부분적으로 댕글링 참조 및 와일드 참조의 가능성 때문이며, 부분적으로 참조가 있는 데이터의 토폴로지가 분석이 매우 복잡할 수 있는 방향 그래프이기 때문이다. 그럼에도 불구하고, 참조는 포인터 산술이 없기 때문에 포인터보다 분석하기가 더 쉽다.

참조의 메커니즘은 구현에 따라 다르지만, 거의 모든 현대 프로그래밍 언어에서 공통적으로 사용되는 기본적인 프로그래밍 언어 기능이다. 심지어 참조를 직접 사용을 지원하지 않는 일부 언어에서도 내부적으로 또는 암묵적으로 사용한다. 예를 들어, 참조에 의한 호출 호출 규칙은 참조를 명시적으로 또는 암묵적으로 사용하여 구현할 수 있다. 참조를 사용하면 객체를 저장하는 위치, 저장 방법, 코드 내에서 전달하는 방식 등 유연성이 증가한다. 참조를 통해 실제 데이터에 접근할 수 있다면, 데이터 자체를 이동시킬 필요가 없다. 또한, 여러 코드에서 참조를 통해 하나의 데이터를 공유할 수도 있다.

포인터는 객체의 메모리 상의 주소만을 저장한 것이다. 이는 가장 기본적인 참조이며, 오류가 발생하기 쉽지만, 가장 강력하고 효율적인 참조이기도 하다. 스마트 포인터는 불투명 데이터 구조의 일종으로, 포인터처럼 작동하지만, 특정 메서드를 통해서만 접근할 수 있다.

'''파일 핸들'''은 파일의 내용을 추상화하는 참조이다. 파일에 대한 을 요청할 때는 파일 자체를 가리키는 동시에, 파일을 읽을 때는 파일 내의 특정 위치를 가리킨다.

4. 예시

포인터메모리 주소를 저장하는 가장 기본적인 형태의 참조이다. 핸들은 파일 핸들과 같이 다양한 방식으로 표현될 수 있는 추상적인 참조이다. 분산 컴퓨팅에서 참조는 네트워크 프로토콜, 인코딩/직렬화 방식 등 데이터 접근에 필요한 정보를 포함할 수 있다.

키 집합과 데이터 객체 집합 간의 잘 정의된(단일 값) 함수는 참조 유형을 정의한다. 도달 가능성 그래프는 참조를 방향 그래프로 표현한 것으로, 가비지 수집에 유용하다.

참조는 집 주소와 비슷하다. 주소는 매우 작은 식별자이며, 주소가 가리키는 대상에는 더 풍부한 정보가 있다. 예를 들어, 집의 색깔을 알고 싶다면, 주소만 있으면 그 집을 찾아가서 실제로 보면 된다. 즉, 주소는 집의 색깔을 알기 위한 충분한 정보원이 된다. 주소에서 집을 찾는 것은 참조를 역참조하는 것과 비슷하다.

더 복잡한 예로, 이사를 갈 때마다 새로운 집 주소를 옛 집에 남겨둔다고 가정할 수 있다. 누군가가 첫 번째 집을 방문하면, 놓여 있는 주소에서 다음 집으로, 그 다음 집으로 따라가 최종적으로 현재 집에 도착할 수 있다. 이것은 참조를 사용한 단순한 선형 리스트와 비슷하다.

주소의 또 다른 장점은 실제 집보다 훨씬 다루기 쉽다는 것이다. 예를 들어, 마을 사람들을 성씨의 가나다순으로 정렬하고 싶을 때, 더 쉬운 방법은 마을 사람들의 주소 목록을 만들고 성씨의 가나다순으로 정렬하는 것이다. 참조에도 유사한 장점이 있다. 데이터에 대한 참조를 조작함으로써 데이터 자체를 변경하지 않고 다양한 작업을 할 수 있으며, 경우에 따라 그 편이 더 효율적이다.

일상생활은 전화번호, 이메일 주소, URL 등 참조의 예로 가득하다. 이들은 모두 원격에 있는 자원을 가리키며, 그 자원에 대한 접근을 가능하게 한다.

참조를 사용하면 객체를 저장하는 위치, 저장 방법, 코드 내에서 전달하는 방식 등 유연성이 증가한다. 참조를 통해 실제 데이터에 접근할 수 있다면, 데이터 자체를 이동시킬 필요가 없다. 또한, 여러 코드에서 참조를 통해 하나의 데이터를 공유할 수도 있다.

포인터는 객체의 메모리 상의 주소만을 저장한 것이다. 이는 가장 기본적인 참조이며, 오류가 발생하기 쉽지만, 가장 강력하고 효율적인 참조이기도 하다. 스마트 포인터는 불투명 데이터 구조의 일종으로, 포인터처럼 작동하지만, 특정 메서드를 통해서만 접근할 수 있다.

파일 핸들은 파일의 내용을 추상화하는 참조이다. 파일에 대한 을 요청할 때는 파일 자체를 가리키는 동시에, 파일을 읽을 때는 파일 내의 특정 위치를 가리킨다.

더 일반적으로, 참조는 특정 데이터의 고유한 검색을 가능하게 하는 다른 데이터로 간주될 수 있다. 여기에는 데이터베이스기본 키연관 배열의 키 등도 포함된다. 데이터 집합 ''D''에 대해, ''D''에서 ''D'' ∪ {null}로 고유하게 정의되는 함수가 참조의 정의가 된다. 여기서 ''null''은 의미 있는 것을 가리키지 않는 데이터이다.

이러한 함수의 또 다른 표현으로, "도달 가능성 그래프"라고 불리는 유향 그래프가 있다. 여기서 각 데이터는 정점으로 표시되며, 데이터 ''u''에서 데이터 ''v''로의 에지가 있을 때, ''u''는 ''v''를 참조하고 있다 (그래프 이론). 최대 출차수는 1이다. 이처럼 참조를 그래프로 파악하는 것은 가비지 컬렉션에서 도달 불가능한 객체로부터의 접근을 분리하는 데 유효하다.

5. 외부 저장과 내부 저장

객체 저장 방식에는 내부 저장과 외부 저장 두 가지가 있다.


  • '''내부 저장'''은 작은 객체의 내용을 큰 객체 내부에 저장하는 방식이다.
  • '''외부 저장'''은 작은 객체를 자체 위치에 할당하고, 큰 객체는 참조만 저장하는 방식이다.[1]


내부 저장은 동적 할당 메타데이터 및 참조에 대한 공간 비용이 발생하고, 참조를 역참조하고 작은 객체에 대한 메모리를 할당하는 데 시간 비용이 들기 때문에 일반적으로 더 효율적이다. 내부 저장은 또한 동일한 큰 객체의 서로 다른 부분을 메모리에서 가깝게 유지하여 참조 지역성을 향상시킨다.[1] 그러나 다음과 같은 경우에는 외부 저장이 선호된다.

  • 자료 구조가 재귀적인 경우. 즉, 자체를 포함할 수 있는 경우에는 내부 방식으로 표현할 수 없다.
  • 더 큰 객체가 스택과 같이 제한된 공간에 저장되는 경우, 다른 메모리 영역에 큰 구성 요소 객체를 저장하고 참조를 사용하여 저장 공간 부족을 방지할 수 있다.
  • 작은 객체의 크기가 다를 수 있는 경우, 더 큰 객체의 크기를 조정하여 계속 포함하는 것이 불편하거나 비용이 많이 든다.
  • 참조는 종종 사용하기 쉽고 새로운 요구 사항에 더 잘 적응한다.[1]


Java, Smalltalk, Python, Scheme과 같은 일부 언어는 내부 저장을 지원하지 않는다. 이러한 언어에서는 모든 객체에 참조를 통해 균일하게 접근한다.[1]

6. 언어 지원

어셈블리 언어에서 참조는 보통 원시 메모리 주소나 테이블의 인덱스로 표현된다. 이러한 방식은 주소 자체가 가리키는 값에 대한 정보를 주지 않아 사용하기 까다롭다. 값의 크기나 해석 방법은 프로그램 로직에 포함되어, 오해석으로 인한 오류가 발생할 수 있다.[6]

Lisp의 cons 셀은 다른 Lisp 객체에 대한 두 개의 참조를 포함하는 레코드로, 초기 불투명한 참조 중 하나이다. 이 구조는 주로 단일 연결 리스트이진 트리를 구성하는 데 사용된다.

포인터는 오늘날에도 널리 사용되는 참조 유형이다. 원시 주소와 유사하지만, 정적 데이터형을 통해 타입 안전성을 제공한다. 그러나 C는 약한 타입 시스템을 가지므로, 캐스트를 통해 타입 안전성이 위반될 수 있다. C++(C++)는 참조 타입과 표준 라이브러리의 스마트 포인터를 통해 타입 안전성을 강화했지만, 여전히 안전 메커니즘을 우회할 수 있는 기능을 가지고 있다.

포트란은 참조에 대한 명시적인 표현은 없지만, 참조에 의한 호출 의미론에서 암묵적으로 사용한다. 포트란 참조는 다른 객체의 "별칭"으로 생각할 수 있으며, 널(null)일 수도 있다.

Eiffel, 자바, C#, 비주얼 베이직과 같은 객체 지향 언어들은 '참조'라고 불리는 불투명한 형태의 참조를 사용한다. 이들은 타입 안전성을 가지며, 안전하지 않은 변환은 허용되지 않는다.

Standard ML, OCaml과 같은 함수형 언어에서 가변 참조 셀은 수정 가능한 데이터를 제공하며, 다형성 유형을 갖는다.

PHP는 변수 이름을 포함하는 문자열 값인 심볼릭 참조를 지원한다.[3][4]

6. 1. Java

자바의 데이터 타입에는 크게 참조형과 기본형이 있다. 클래스형, 인터페이스형, 타입 변수(제네릭의 타입 인자), 배열형이 참조형이다.

6. 2. C#

C#의 데이터 타입에는 크게 참조 형식, 값 형식, 포인터 형식이 있다. 클래스, 인터페이스, 배열, 델리게이트는 참조 형식이다. 수치형 및 논리형을 포함하는 구조체와 열거형은 값 형식이다.

7. 심볼릭 참조

과 같은 일부 언어들은 심볼릭 참조(symbolic reference)를 지원한다. 심볼릭 참조는 변수들의 이름을 포함하는 문자열 값이다. 정규 참조가 아닌 값이 역참조될 때 펄은 이를 심볼릭 참조로 간주하며 값에 의해 부여된 이름을 변수에 제공한다.[6] PHP는 `$$var` 문법 형태로 비슷한 기능을 제공한다.[7]

8. 비유 (주소)

참조는 집 주소와 비슷하다. 주소는 매우 작은 식별자이지만, 주소가 가리키는 대상에는 더 풍부한 정보가 있다. 예를 들어, 그 집을 보면 색깔을 알 수 있지만, 주소만으로는 색깔을 알 수 없다. 주소는 단지 집을 찾는 것을 가능하게 할 뿐이다. 그러나 집의 색깔을 알고 싶다면, 주소만 있으면 찾아내서 실제로 그 집을 보면 된다. 즉, 주소는 집의 색깔을 알기 위한 충분한 정보원이 된다. 주소에서 집을 찾는 것은 참조를 역참조하는 것과 비슷하다.[1]

더 복잡한 예로, 이사를 갈 때마다 새로운 집 주소를 옛 집에 남겨둔다고 하자. 누군가가 첫 번째 집을 방문하면, 놓여 있는 주소에서 다음 집으로, 다음 집으로 따라가 최종적으로 현재 집에 도착할 수 있다. 이것은 참조를 사용한 단순한 선형 리스트와 비슷하다.[1]

주소의 또 다른 장점은 실제 집보다 훨씬 다루기 쉽다는 것이다. 예를 들어, 마을 사람들을 성씨의 가나다순으로 정렬하고 싶다고 하자. 한 가지 방법으로, 거대한 크레인을 사용하여 마을의 집을 전부 물리적으로 재정렬하는 방법이 있다. 더 쉬운 방법으로는, 마을 사람들의 주소 목록을 만들고 성씨의 가나다순으로 그것을 정렬하는 방법이 있다. 참조에도 유사한 장점이 있다. 데이터에 대한 참조를 조작함으로써 데이터 자체를 변경하지 않고 다양한 작업을 할 수 있으며, 경우에 따라 그 편이 더 효율적이다.[1]

일상생활은 참조의 예로 가득하다. 전화번호, 이메일 주소, URL 등등. 이들은 모두 원격에 있는 자원을 가리키며, 그 자원에 대한 접근을 가능하게 한다.[1]

참조

[1] 서적 Paragon: A Language Using Type Hierarchies for the Specification, Implementation, and Selection of Abstract Data Types https://books.google[...] Springer Science & Business Media 1985-04-00
[2] 웹사이트 Reference (Java Platform SE 7) https://docs.oracle.[...] 2022-05-10
[3] 웹사이트 perlref http://perldoc.perl.[...] perldoc.perl.org 2013-08-19
[4] 웹사이트 Variable variables - Manual http://www.php.net/m[...] PHP 2013-08-19
[5] 웹사이트 Chapter 4. Types, Values, and Variables http://docs.oracle.c[...]
[6] 웹인용 perlref http://perldoc.perl.[...] perldoc.perl.org 2013-08-19
[7] 웹인용 Variable variables - Manual http://www.php.net/m[...] PHP 2013-08-19



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

문의하기 : help@durumis.com