맨위로가기

Void 타입

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

1. 개요

void 타입은 C/C++, Haskell, Java, .NET, ECMAScript 등 다양한 프로그래밍 언어에서 사용되는 개념이다. C와 C++에서는 함수의 반환 타입으로 사용되어 함수가 값을 반환하지 않음을 나타내며, void 포인터를 통해 임의의 형의 데이터를 가리킬 수 있다. Haskell에서는 거주자가 없는 빈 타입을 나타내며, void 타입으로의 함수는 결과를 반환하지 않는다. Java에서는 인스턴스를 생성할 수 없는 자리 표시자 클래스로, .NET에서는 System.Void 구조체로, ECMAScript에서는 undefined를 반환하는 연산자로 사용된다.

2. 역사적 배경

ALGOL 68의 `proc`(프로시저)[6] 개념에서 영향을 받아, C 언어는 유의미한 값을 반환하지 않는 서브루틴(함수)의 반환형으로 `void`를 도입했다. 또한 함수 프로토타입의 매개변수 목록에 `void`를 사용하여 해당 함수가 매개변수를 받지 않음을 명시적으로 나타낼 수 있게 되었다.

초기 C 언어에서는 함수가 반환형을 명시하지 않으면 기본적으로 `int` 형으로 간주했으며, 매개변수가 없는 함수는 단순히 빈 괄호 `()`를 사용했다. 특정 타입이 정해지지 않은 데이터를 가리키는 포인터는 `char`나 `int`에 대한 포인터로 선언되기도 했다. 일부 초기 컴파일러는 함수의 반환값을 사용하지 않는 코드에 대해 경고를 발생시켰는데, 이를 피하기 위해 함수 호출 결과를 `void`로 캐스트하는 방식(예: `(void)printf("Hello");`)이 사용되기도 했다.

비야네 스트롭스트룹이 1979년에서 1980년경 C++ 개발을 시작했을 당시, `void` 타입과 `void` 포인터는 이미 AT&T에서 파생된 컴파일러가 지원하는 C 언어 방언의 일부였다.[1][9]

시간이 흐르면서 C 언어 표준에도 변화가 있었다. 함수 반환형을 명시하지 않으면 `int`로 간주하는 규칙은 ANSI C (C89) 및 ISO/IEC 9899:1990 (C90)에서 표준화되었으나, C99 규격에서는 이 내용이 삭제되었다. 현재 이러한 코드는 대부분의 컴파일러에서 경고를 발생시킨다.

함수 프로토타입에서 매개변수 목록을 어떻게 쓰는지에 따라 C와 C++에서 의미가 달랐던 부분도 있다.[16][2][10]

함수 인수 목록 표기법과 그 의미
코드C에서의 의미C++에서의 의미비고
void f(void);인수 없음인수 없음C++에서는 이 표기법보다 아래의 void f();가 더 선호된다.[11]
void f();인수의 개수나 타입을 명시하지 않음 (알 수 없는 개수의 인수를 받음)
(C99부터 사용이 권장되지 않음[17][3][13])
(C23부터 인수 없음으로 의미 변경[4][5][12])
인수 없음 (선호되는 표기법[11])과거 C와 C++에서 의미가 달랐으나, C23 표준부터 통일되었다.



이처럼 C 언어에서 `void f()` 형태의 선언은 원래 매개변수 정보를 생략하는 방식이었으나, C99에서 비권장되었고 C23에서는 C++와 동일하게 매개변수가 없음을 명시하는 방식으로 의미가 변경되었다.[12]

3. C/C++ 에서

C와 C++에서 `void`는 주로 두 가지 목적으로 사용된다. 첫째, 함수가 어떤 값도 반환하지 않음을 나타내기 위해 함수의 반환형으로 사용된다. 이 경우 함수는 코드 블록의 끝에 도달하거나, 값을 명시하지 않은 `return 문`을 실행하여 종료된다.[16] 둘째, 함수가 어떠한 매개변수도 받지 않음을 명시하기 위해 함수 프로토타입의 매개변수 목록에 사용될 수 있다.

함수 프로토타입에서 `void`를 명시적으로 사용하는 것과 매개변수 목록을 비워두는 것은 C와 C++에서 다른 의미를 가진다.[16][2]

함수 프로토타입에서의 void 사용 비교
코드C에서의 의미C++에서의 의미비고
void f(void);인수 없음인수 없음C++에서는 이 표기법은 권장되지 않는다 (C 링키지를 제외).
void f();상수이지만 알 수 없는 수의 인수를 허용
(C99부터 비권장[17][3], C23부터 인수 없음으로 변경[4][5])
인수 없음C++에서는 이 표기법이 선호된다.[11]



C 언어의 초기 버전에서는 반환형이 명시되지 않은 함수는 기본적으로 `int`형으로 간주되었고, 인수가 없는 함수는 단순히 빈 괄호 `()`를 사용했다. 당시 일부 컴파일러는 함수의 반환값을 사용하지 않는 모든 함수 호출에 대해 경고를 발생시켰는데, 이를 억제하기 위해 함수 호출을 `(void)`로 형 변환하는 코드가 사용되기도 했다. 비야네 스트롭스트룹이 C++ 개발을 시작하던 1979-1980년경, `void` 타입과 `void` 포인터는 AT&T에서 파생된 C 컴파일러 방언의 일부로 이미 존재했다.[1][9]

C에서 매개변수 목록을 비워두는 것(''void f();'')은 오랫동안 "알 수 없는 개수의 인수를 받는다"는 의미였으나, 이러한 방식은 C99 표준부터는 사용하지 않는 것이 권장되었다.[17][3] C23 표준부터는 C에서도 C++와 마찬가지로 빈 괄호 `()`가 매개변수가 없음을 명시적으로 나타내게 되었다.[4][5][12]

3. 1. void 포인터

C 언어와 C++에서는 '''void형의 포인터'''가 있으며, void *와 같이 표기한다. 이는 "특정되지 않은"(임의의) 형의 데이터를 가리키는 포인터이다. 즉, 이 문맥에서 void는 범용 포인터로 취급된다. 프로그램에서 어떤 형의 데이터도 void *로 가리킬 수 있으며, 반대로 원래 데이터를 참조할 수도 있다. 이러한 특징 때문에 콜백 함수의 인수로 임의의 사용자 정의 데이터의 주소를 전달하여 처리하는 것과 같은 다형적인 함수를 작성할 때 유용하다.

ISO C 표준 규격에서는 함수 포인터에 대한 취급이 다르며, void *와의 상호 변환을 보장하지 않는다[7]. 그러나 POSIXdlsym() 함수는 dlopen()으로 동적으로 로드한 모듈에서 변수나 함수의 심볼 주소를 void *로 취득할 수 있는데, 이 동작은 POSIX를 준수하는 구현이 void *에서 함수 포인터로의 변환을 정상적으로 실행할 수 있다는 것을 전제로 하고 있다[8].

4. 하스켈(Haskell)에서

함수형 프로그래밍 언어인 Haskell에서 void 타입은 거주자가 없는 빈 타입을 나타낸다[https://hackage.haskell.org/package/void]. void 타입으로의 함수는 결과를 반환하지 않으며, 타입 시그니처가 `IO Void`인 부작용을 가진 프로그램은 종료되지 않거나 충돌한다. 특히, void 타입으로의 전체 함수는 없다.

5. 자바(Java)에서

자바에는 `java.lang.Void` 클래스가 있다. 이는 인스턴스를 생성할 수 없는 자리 표시자 클래스이며, 키워드 `void`를 나타내는 `java.lang.Class` 객체에 대한 참조를 유지하는 데 사용된다.

6. 닷넷(.NET)에서

.NET에는 System.Void 구조체가 있다.[14] C#의 경우 void 키워드로 매핑된다.

7. ECMAScript에서

ECMAScript에서 `void`는 키워드이며 (예약어 참고), 단항식 앞에 붙여 단항식을 만드는 전치 연산자 중 하나이다.[15] 문법 규칙상 void 단항식의 형태이므로 void(식)의 형태로 사용되는 경우가 많다. 식을 평가하고 그 값을 가져오지만, 그 값을 특별히 처리하지 않고 항상 "undefined"를 반환한다. 주로 HTML 내에서,

<a href="javascript:void(0)">foo</a>

와 같이 표기하여 링크로서의 기능을 하지 않도록 하기 위해 사용된다.

참조

[1] 웹사이트 "The Development of the C Language" http://cm.bell-labs.[...] Association for Computing Machinery, Inc. via the author and Lucent Technologies Inc. 1996 1993
[2] 서적 Programming: Principles and Practice Using C++ Addison-Wesley
[3] 간행물 C and C++: Case Studies in Compatibility. Reconcilable differences? You decide http://www.ddj.com/c[...] Dr. Dobb's 2002-09-01
[4] 웹사이트 WG14-N2432 : Remove support for function definitions with identifier lists proposal https://www.open-std[...] 2019-09-25
[5] 웹사이트 WG14-N2841 : No function declarators without prototypes https://www.open-std[...] 2021-10-10
[6] 문서 Informal Introduction to ALGOL 68 https://inria.hal.sc[...]
[7] 웹사이트 Generic Function Pointers In C And Void https://web.archive.[...] 2018-10-19
[8] 문서 dlsym - get the address of a symbol from a symbol table handle https://pubs.opengro[...] The Open Group Base Specifications Issue 7, 2018 edition / IEEE Std 1003.1-2017 (Revision of IEEE Std 1003.1-2008)
[9] 웹사이트 The Development of the C Language https://web.archive.[...] 2018-10-19
[10] 서적 Programming: Principles and Practice Using C++ Addison-Wesley
[11] 문서 CppCoreGuidelines/CppCoreGuidelines.md at master · isocpp/CppCoreGuidelines · GitHub https://github.com/i[...]
[12] 문서 Function declarations - cppreference.com https://en.cpprefere[...]
[13] 웹사이트 C and C++: Case Studies in Compatibility http://www.drdobbs.c[...] UBM 2002-09-01
[14] 문서 Void Struct (System) | Microsoft Learn https://learn.micros[...]
[15] 웹사이트 12.5.4 The void Operator https://tc39.github.[...] Ecma International 2018-10-18
[16] 서적 Programming: Principles and Practice Using C++ https://archive.org/[...] Addison-Wesley
[17] 간행물 C and C++: Case Studies in Compatibility. Reconcilable differences? You decide http://www.ddj.com/c[...] Dr. Dobb's 2002-09-01



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

문의하기 : help@durumis.com