맨위로가기

레코드 (컴퓨터 과학)

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

1. 개요

레코드(record)는 컴퓨터 과학에서 데이터를 구조화하는 데 사용되는 개념으로, 여러 개의 필드를 묶어 하나의 단위로 취급한다. 데이터베이스에서 레코드는 행(row)에 해당하며, 객체 지향 프로그래밍에서는 객체의 상태를 나타내는 필드로 사용된다. 레코드는 배열과 달리 서로 다른 데이터 유형의 필드를 가질 수 있으며, 함수 매개변수나 쿼리 언어의 데이터 저장 단위로 활용된다. 레코드 타입은 프로그래밍 언어에서 레코드의 구조를 정의하며, 할당, 비교, 해시 값 계산 등의 연산을 지원한다. 초기 컴퓨터에서는 천공 카드와 자기 테이프를 통해 레코드 개념이 사용되었으며, COBOL과 같은 프로그래밍 언어에서 레코드 유형을 지원하면서 널리 사용되기 시작했다. 현대 프로그래밍 언어에서는 레코드의 개념이 객체나 구조체 등의 형태로 발전하여 사용되고 있다.

더 읽어볼만한 페이지

  • 복합 자료형 - 리스트 (컴퓨팅)
    리스트는 컴퓨터 과학에서 항목들을 순서대로 저장하고 관리하는 기본적인 자료 구조이며, 다양한 연산을 지원하고 연결 리스트나 동적 배열 등으로 구현되며 큐, 스택 등 다른 자료형의 기반이 된다.
  • 복합 자료형 - 대수적 자료형
    대수적 자료형은 합 타입과 곱 타입을 조합하여 새로운 자료형을 정의하는 방법으로, 단일 연결 리스트나 이진 트리와 같은 자료 구조를 표현하고 패턴 매칭을 통해 자료형의 구조를 분해 및 처리하는 데 유용하며, 함수형 프로그래밍 언어에서 널리 사용된다.
  • 자료형 - 참조
    참조는 프로그래밍에서 메모리 주소나 다른 데이터를 가리키는 값으로, 데이터의 효율적인 전달과 공유를 위해 사용되며, 포인터, 파일 핸들, URL 등이 그 예시이다.
  • 자료형 - 익명 함수
    익명 함수는 이름이 없는 함수로, 람다 추상, 람다 함수, 람다 표현식, 화살표 함수 등으로 불리며, 함수형 프로그래밍 언어에서 람다식 형태로 많이 사용되고 고차 함수의 인수, 클로저, 커링 등에 활용되지만, 재귀 호출의 어려움이나 기능 제한과 같은 단점도 존재한다.
레코드 (컴퓨터 과학)
컴퓨터 과학에서의 레코드
유형복합 데이터 유형
다른 이름구조체
복합 데이터
설명
정의관련된 기본 데이터 유형을 포함할 수 있는 값입니다.
프로그래밍 언어와 데이터베이스에서 널리 사용되는 데이터 구조입니다.
유사성객체와 유사하지만 메서드가 없습니다.
접근 방법일반적으로 필드 이름으로 액세스합니다.

2. 용어

데이터베이스스프레드시트에서 레코드는 종종 ''으로 불리며, 각 필드는 ''이라고 불린다.[21]

객체 지향 프로그래밍에서 객체는 상태 필드와 메서드 필드를 포함하는 레코드이다. 객체는 기본적으로 레코드에 해당 객체 처리에 특화된 프로시저를 포함한다. 대부분의 객체 지향 언어에서 레코드는 객체의 특수한 경우로 취급된다.[21]

레코드는 수학튜플과 유사하지만, 튜플은 관례와 프로그래밍 언어에 따라 레코드로 간주될 수도 있고 그렇지 않을 수도 있다. 레코드 유형은 둘 이상의 수학적 집합의 데카르트 곱 또는 특정 언어에서 추상 곱 유형의 구현과 유사하다고 볼 수 있다.[21]

레코드는 배열과 다르다. 레코드의 요소(필드)는 레코드의 정의에 의해 결정되며 서로 다른 자료형을 가질 수 있지만, 배열은 동일한 유형의 요소 모음이다.[21]

함수의 매개변수는 레코드의 필드로 집합적으로 볼 수 있으며, 함수에 인수를 전달하는 것은 입력 매개변수를 레코드 필드에 할당하는 것으로 볼 수 있다. 낮은 수준에서 함수 호출에는 매개변수뿐만 아니라 지역 변수 및 반환 주소와 같은 다른 필드를 포함하는 '활성 레코드' 또는 '호출 프레임'이 포함된다.[21]

3. 역사

레코드의 개념은 오래전부터 사용된 다양한 유형의 표와 원장에서 유래되었다. 필드가 잘 정의된 유형과 크기를 가진 컴퓨터 과학에서의 현대적인 레코드 개념은 이미 배비지의 해석 기관과 같은 19세기 기계식 계산기에서 암묵적으로 존재했다.[7][8]

홀러리스 천공 카드 (1895)


데이터(제어가 아닌)에 사용된 최초의 기계 판독 매체는 1890년 미국 인구 조사의 레코드에 사용된 천공 카드였다. 각 천공 카드는 하나의 레코드였다. 1880년의 저널 항목과 1895년의 천공 카드를 비교해 보면, 레코드는 20세기 전반에 걸쳐 잘 확립되었으며, 당시 대부분의 데이터 처리는 천공 카드를 사용하여 수행되었다. 일반적으로 데이터 파일의 각 레코드는 특정 필드에 할당된 특정 열과 함께 하나의 천공 카드에 기록되었다. 일반적으로 레코드는 외부 저장소(예: 카드 리더, 테이프 또는 디스크)에서 읽을 수 있는 가장 작은 단위였다. 천공 카드 스타일의 레코드 내용은 원래 "단위 레코드"라고 불렸는데, 천공 카드가 미리 결정된 문서 길이를 가지고 있었기 때문이다.[9] 하드 디스크 드라이브자기 테이프의 사용으로 저장 시스템이 더욱 발전하면서 가변 길이 레코드가 표준이 되었다. 가변 길이 레코드는 바이트 단위의 레코드 크기가 필드의 크기 합과 거의 같은 레코드이다.

대부분의 기계어 구현과 초창기 어셈블리 언어는 레코드에 대한 특별한 구문을 가지고 있지 않았지만, 인덱스 레지스터, 간접 주소 지정, 자기 수정 코드를 사용하여 해당 개념을 사용할 수 있었다. IBM 1620과 같은 일부 초창기 컴퓨터는 레코드와 필드를 구분하는 하드웨어 지원과 이러한 레코드를 복사하기 위한 특수 명령어를 가지고 있었다.

레코드와 필드의 개념은 IBM의 보고서 프로그램 생성기(RPG)와 같은 초창기 파일 정렬 및 표 형식 유틸리티의 핵심이었다.

COBOL은 레코드 유형을 지원하는 최초의 널리 사용된 프로그래밍 언어였으며,[10] 당시 레코드 정의 기능은 매우 정교했다. 이 언어는 중첩된 레코드의 정의를 허용했다.

FORTRAN(FORTRAN IV까지) 및 ALGOL 60과 같은 수치 계산을 위해 개발된 초창기 언어는 레코드 유형을 지원하지 않았지만, FORTRAN 77 및 ALGOL 68과 같은 해당 언어의 후기 버전은 이를 추가했다. 파스칼 프로그래밍 언어는 레코드 유형을 다른 기본 유형과 논리적으로 일관된 유형 시스템으로 완전히 통합한 최초의 언어 중 하나였다. PL/I 언어는 COBOL 스타일의 레코드를 제공했다. C 언어는 `struct`를 사용하여 레코드 개념을 제공한다. 파스칼 이후에 설계된 대부분의 언어(예: Ada, Modula, Java)도 레코드를 지원했다.

레코드는 더 새로운 객체 지향 프로그래밍 언어와 관계형 데이터베이스 관리 시스템에 영향을 미쳤다. 레코드는 데이터를 저장하고 처리하는 방식에서 더 많은 모듈성을 제공했기 때문에, C++, Python, JavaScript, Objective-C와 같은 후기 언어에 영향을 미쳤다.[11] SQL 및 객체 쿼리 언어와 같은 쿼리 언어 역시 레코드의 개념에 영향을 받았다.[13]

4. 레코드 타입

레코드(record)는 필드들의 모임이며, 통상 고정된 수와 순서의 필드로 구성된다. 레코드의 필드는 언어에 따라 '멤버', '멤버 변수', 또는 인스턴스 변수라고도 불린다. 필드를 '요소'라고 부르기도 하지만, 컬렉션의 요소와 혼동될 수 있어 주의해야 한다.

예를 들어, 날짜 레코드는 수치형 연도, 월, 일 필드를 포함할 수 있다. 인사 레코드는 이름, 급여, 계급 등을 포함할 수 있다. 원 레코드는 중심 좌표와 반지름을 포함할 수 있으며, 이때 중심 좌표는 x, y 좌표를 가진 점 레코드로 표현될 수 있다.

레코드형은 필드 수가 고정되어 있고, 각 필드에 이름이 있으며, 필드 유형이 다를 수 있다는 점에서 배열과 다르다. 최신 프로그래밍 언어에서는 프로그래머가 레코드형을 정의할 수 있으며, 정의에는 각 필드의 데이터형과 필드에 접근할 수 있는 식별자 (이름 또는 레이블) 지정이 포함된다.

형 이론에서는 필드명이 없는 튜플형이 단순하여 선호되지만, 진정한 레코드형은 System F-sub 등의 언어에서 연구된다. 형 이론의 레코드는 데이터 외에 제1급 함수형 필드도 포함할 수 있어, 객체 지향 프로그래밍의 많은 기능을 표현할 수 있다.

레코드는 메인 메모리자기 테이프, 하드 디스크와 같은 대용량 기억 장치에 존재할 수 있다. 레코드는 대부분의 데이터 구조, 특히 링크된 데이터 구조의 기본적인 구성 요소이다. 많은 컴퓨터 파일은 논리 레코드의 배열로 구성되며, 효율성을 위해 더 큰 물리적 레코드 또는 블록으로 그룹화된다.

함수의 매개변수는 레코드 변수의 필드로 간주될 수 있으며, 함수에 전달되는 인수는 호출 시 변수에 할당되는 레코드 값으로 볼 수 있다. 콜 스택의 각 엔트리는 '활성화 레코드' 또는 '콜 프레임'으로, 프로시저 매개변수, 로컬 변수, 반환 주소 및 기타 내부 필드를 포함한다.

객체 지향 언어의 객체는 기본적으로 레코드 처리에 특화된 프로시저를 포함하는 레코드이다. 많은 객체 지향 언어에서 레코드는 객체의 특수한 경우로, PODS 또는 수동 데이터 구조라고 불린다.

데이터베이스스프레드시트에서 레코드는 행으로, 각 필드는 열로 불린다. 객체 지향 프로그래밍에서 객체는 상태 필드와 메서드 필드를 포함하는 레코드이다.

레코드는 수학 튜플과 유사하지만, 튜플은 관례와 프로그래밍 언어에 따라 레코드로 간주될 수도 있고 그렇지 않을 수도 있다. 레코드 유형은 데카르트 곱 또는 추상 곱 유형의 구현과 유사하다고 볼 수 있다. 레코드는 배열과 달리 요소(필드)가 레코드 정의에 의해 결정되며 이질적일 수 있다.

함수의 매개변수는 레코드의 필드로 볼 수 있으며, 함수에 인수를 전달하는 것은 입력 매개변수를 레코드 필드에 할당하는 것으로 볼 수 있다. 낮은 수준에서 함수 호출에는 매개변수, 지역 변수, 반환 주소 등을 포함하는 '활성 레코드' 또는 '호출 프레임'이 포함된다.

4. 1. 연산

레코드 유형에 대한 주요 연산은 다음과 같다:

  • 새로운 레코드 유형 선언: 각 필드의 위치, 유형, 이름을 포함한다.
  • 특정 레코드 유형을 가진 변수와 값 선언.
  • 지정된 필드 값과 이름을 사용하여 레코드 값 생성.
  • 레코드에서 명시적인 이름을 가진 필드 선택.
  • 레코드 변수에 레코드 값 대입.
  • 두 레코드의 동일성 비교.
  • 레코드의 표준 해시 값 계산.


일부 언어는 레코드의 모든 필드(또는 참조 가능한 필드)를 열거하는 기능을 제공하는데, 이는 디버거, 가비지 수집기, 직렬화 등 특정 서비스를 구현하는 데 필요하며, 어느 정도의 타입 다형성을 요구한다.

레코드 하위 유형을 지원하는 환경에서는 레코드 필드 추가 및 제거 연산도 포함될 수 있다.

4. 1. 1. 할당 및 비교

대부분의 프로그래밍 언어는 정확히 동일한 레코드 형식을 가진 레코드 간의 할당을 허용한다(동일한 필드 유형과 이름, 동일한 순서 포함). 그러나 언어에 따라, 별도로 정의된 두 개의 레코드 데이터 유형은 정확히 동일한 필드를 가지고 있더라도 서로 다른 유형으로 간주될 수 있다.[3]

일부 언어는 필드가 다른 이름을 가진 레코드 간의 할당도 허용하여, 각 필드 값을 레코드 내에서의 위치에 따라 해당 필드 변수와 일치시킨다. 예를 들어, `실수`와 `허수`라는 필드가 있는 복소수는 `X`와 `Y` 필드가 있는 데카르트 좌표 레코드 변수에 할당될 수 있다. 이때 두 피연산자는 동일한 필드 유형 시퀀스를 가져야 한다. 일부 언어는 해당 유형이 동일한 크기와 인코딩을 가져야 전체 레코드를 해석되지 않은 비트 문자열로 할당할 수 있도록 요구할 수도 있다. 다른 언어는 이보다 유연하여, 각 값 필드를 해당 변수 필드에 합법적으로 할당할 수 있으면 된다고 요구한다. 예를 들어, 짧은 정수 필드는 긴 정수 필드에 할당할 수 있고, 그 반대도 가능하다.[3]

COBOL과 같은 언어는 위치가 아닌 이름을 기준으로 필드와 값을 일치시킨다.[3]

이러한 가능성은 두 레코드 값의 동등성 비교에도 적용된다. 일부 언어는 개별 필드의 비교를 기반으로 사전식 순서를 사용하여 순서 비교('<' 및 '>')도 허용할 수 있다.[3]

PL/I은 앞선 두 가지 유형의 할당을 모두 허용하며, "a"가 PL/I 용어에서 레코드 또는 구조체인 `a = a+1;`과 같은 ''구조 표현식''도 허용한다.[3]

4. 1. 2. Algol 68의 분배 필드 선택

주어진 원본 소스에 Algol 68에 대한 내용이 없으므로, 해당 섹션은 작성할 수 없습니다. 따라서 이전 출력과 동일하게 빈 내용으로 출력합니다.

4. 1. 3. Pascal의 "with" 구문

주어진 원본 소스에는 파스칼의 "with" 구문에 대한 내용이 없으므로, 해당 섹션은 작성할 수 없습니다.

4. 2. 메모리 내 표현

레코드가 메모리에 저장되는 방식은 프로그래밍 언어에 따라 다르다. 일반적으로 필드는 레코드 유형에 선언된 순서대로 연속적인 메모리 위치에 저장된다. 이때문에 둘 이상의 필드가 메모리의 같은 워드에 저장될 수도 있다. 실제로 이 기능은 단어의 특정 비트에 접근하기 위해 시스템 프로그래밍에서 자주 사용된다.[21] 그러나 대부분의 컴파일러는 기계에서 요구하는 정렬 제약 조건을 맞추기 위해 프로그래머에게는 보이지 않는 패딩 필드를 추가한다. 예를 들어 부동 소수점 필드는 한 워드를 차지해야 한다.[21]

일부 언어에서는 레코드를 필드를 가리키는 주소 배열로 구현하기도 한다. 객체 지향 언어의 객체는, 특히 여러 클래스의 상속을 허용하는 언어에서, 더 복잡한 방식으로 구현되는 경우가 많다.[21]

4. 3. 자기 정의 레코드

자기 정의 레코드는 레코드 유형을 식별하고 레코드 내의 정보를 찾기 위한 정보를 포함하는 레코드 유형이다. 요소의 오프셋을 포함할 수 있으며, 따라서 요소는 임의의 순서로 저장되거나 생략될 수 있다.[14] 자기 정의 레코드에 저장된 정보는 레코드의 메타데이터로 해석될 수 있으며, 이는 레코드 생성 시간 및 레코드 크기(바이트 단위)와 같은 정보를 포함하는 유닉스 메타데이터에서 찾을 수 있는 것과 유사하다. 또는 요소 식별자를 각각 포함하는 레코드의 다양한 요소가 임의의 순서로 서로 따를 수 있다.[22]

5. 키

레코드(특히 행 기반 저장소의 맥락에서)는 검색을 위한 '''키''' 필드를 가질 수 있으며, 이를 통해 레코드 모음을 인덱싱할 수 있다. 기본 키는 저장된 모든 레코드에서 고유하며 단 하나만 존재한다.[15] 즉, 기본 키에 대해 중복이 존재할 수 없다. 예를 들어 직원 파일에는 직원 번호, 이름, 부서, 급여가 포함될 수 있는데, 직원 번호는 조직 내에서 고유하므로 기본 키가 된다. 저장 매체와 파일 구성에 따라 직원 번호는 ''인덱스''될 수 있으며, 즉, 조회를 더 빠르게 하기 위해 별도의 파일에 저장된다. 부서 코드는 반드시 고유할 필요는 없으며, 인덱싱될 수도 있는데, 이 경우 ''보조 키'' 또는 ''대체 키''로 간주된다.[16] 인덱싱되지 않은 경우, 특정 부서의 모든 직원을 나열하려면 전체 직원 파일을 스캔해야 한다. 키는 일반적으로 하나의 키에 여러 값이 실질적으로 매핑될 가능성을 최소화하는 방식으로 선택된다. 예를 들어, 많은 직원이 동일한 급여를 가질 가능성이 높기 때문에 급여 필드는 일반적으로 키로 사용할 수 있는 것으로 간주되지 않는다.

레코드는 0개 이상의 "키"를 포함할 수 있다. 키는 식별자 역할을 하는 레코드 내의 필드 또는 필드 집합이다. 고유한 키는 "주키" 또는 간단히 "레코드 키"라고 한다. 저장 매체와 파일 구성에 따라 직원 번호에 "인덱스"가 지정되어 검색 속도를 높이기 위해 별도의 파일에도 저장된다. 부서 코드는 고유하지 않을 수 있지만 인덱스를 지정할 수도 있다. 이 경우 "보조 키" 또는 "대체 키"로 간주된다. 인덱스가 생성되지 않은 경우, 특정 부서의 모든 직원 목록을 작성하려면 직원 파일 전체를 스캔해야 한다. 급여 필드는 일반적으로 키로 사용할 수 없다. 인덱스 생성은 파일을 설계할 때 고려되는 하나의 요소가 된다.

6. 사용법

레코드는 필드들의 모임이며, 일반적으로 고정된 수와 순서로 구성된다. 레코드의 필드는 언어에 따라 '멤버' 또는 '멤버 변수'라고도 불리며, 객체 지향 프로그래밍에서는 인스턴스 변수라고도 불린다.[21] '요소'라고 불리기도 하지만, 컬렉션의 요소와 혼동될 수 있으므로 주의해야 한다.

레코드에 대한 주요 연산은 다음과 같다:

연산 종류설명
레코드 유형 선언새로운 레코드 유형을 선언하고 각 필드의 위치, 유형, 이름을 지정한다.
변수 및 값 선언특정 레코드 유형을 가진 변수와 값을 선언한다.
레코드 값 생성지정된 필드 값과 이름을 사용하여 레코드 값을 생성한다.
필드 선택레코드에서 명시적인 이름으로 필드를 선택한다.
값 대입레코드 변수에 레코드 값을 대입한다.
비교두 레코드가 같은지 비교한다.
해시 값 계산레코드의 표준 해시 값을 계산한다.



레코드 값에서 필드를 선택하면 해당 필드의 값이 생성된다.

일부 프로그래밍 언어는 레코드의 모든 필드 또는 참조 가능한 필드를 열거하는 기능을 제공한다. 이 기능은 디버거, 가비지 수집기, 직렬화와 같은 서비스를 구현하는 데 필요하며, 어느 정도의 다형성을 요구한다.

7. 예시

다음은 다양한 프로그래밍 언어에서 레코드를 정의하는 예시이다.



자바의 레코드 타입은 버전 14에서 실험적으로 도입된 기능이며, 버전 16에서 정식 사양이 되었다. 단, 자바의 레코드는 내부적으로는 클래스로 구현되는 구문 설탕이다. 레코드 전용 구문이 없는 언어에서도 클래스 구문을 지원하는 경우, 대부분의 상황에서 클래스로 대체하는 것이 가능하다.

참조

[1] 서적 How To Design Programs https://archive.org/[...] MIT Press 2001
[2] 웹사이트 Computer Science Dictionary Definitions http://www.computing[...] 2018-01-22
[3] 서적 Database Management Systems https://www.tankonyv[...] Eszterházy Károly College 2018-09-23
[4] 서적 Introduction to Database Management Systems https://books.google[...] Pearson 2018-09-23
[5] 서적 Database Solutions: A Step by Step Guide to Building Databases https://archive.org/[...] Pearson 2004
[6] 간행물 Record data structures in racket: usage analysis and optimization https://dl.acm.org/d[...] 2017-01-13
[7] 간행물 Charles Babbage's Analytical Engine, 1838 https://dl.acm.org/c[...] 2018-09-23
[8] 웹사이트 Automatic Computation: Charles Babbage and Computational Method http://www.rutherfor[...] 2018-09-23
[9] 서적 Encyclopedia of computer science Wiley 2003
[10] 서적 Concepts of Programming Languages https://archive.org/[...] Addison-Wesley Publishing Company, Inc.
[11] 서적 Proceedings of the European conference on object-oriented programming on Object-oriented programming systems, languages, and applications - OOPSLA/ECOOP '90 https://lib.dr.iasta[...] ACM Press 1990
[12] 웹사이트 Index: The Software Quality Company https://www.tiobe.co[...] 2022-03-01
[13] 웹사이트 What is a Relational Database (RDBMS)? https://www.oracle.c[...] 2022-02-28
[14] 웹사이트 EPICS Input / Output Controller (IOC) Application Developer's Guide http://www.aps.anl.g[...] 2015-11-25
[15] 웹사이트 Add or change a table's primary key in Access https://support.micr[...] 2022-03-01
[16] 웹사이트 Alternate key - Oracle FAQ http://www.orafaq.co[...] 2022-03-01
[17] 웹사이트 Computer Science Dictionary Definitions http://www.computing[...] 2018-01-22
[18] 서적 Database Management Systems https://www.tankonyv[...] Eszterházy Károly College 2018-09-23
[19] 서적 Introduction to Database Management Systems https://books.google[...] Pearson 2018-09-23
[20] 서적 Database Solutions: A Step by Step Guide to Building Databases https://archive.org/[...] Pearson 2004
[21] 서적 How To Design Programs https://archive.org/[...] MIT Press 2001
[22] 웹사이트 EPICS Input / Output Controller (IOC) Application Developer's Guide http://www.aps.anl.g[...] 2015-11-25
[23] 웹인용 Computer Science Dictionary Definitions http://www.computing[...] 2018-01-22
[24] 서적 Database Management Systems https://www.tankonyv[...] Eszterházy Károly College 2018-09-23
[25] 서적 Introduction to Database Management Systems https://books.google[...] Pearson 2018-09-23
[26] 서적 Database Solutions: A Step by Step Guide to Building Databases https://www.amazon.c[...] Pearson 2018-09-23
[27] 서적 How To Design Programs https://www.amazon.c[...] MIT Press 2018-09-23



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

문의하기 : help@durumis.com