빈 문자열
1. 개요
빈 문자열은 형식 언어 이론에서 길이가 0이고 어떤 기호도 포함하지 않는 문자열을 의미하며, 프로그래밍 언어에서는 다양한 방식으로 표현된다. 형식 언어에서 빈 문자열은 λ, Λ 또는 ε로 표기되며, 공집합 언어와는 구분된다. 프로그래밍 언어에서 빈 문자열은 널 참조와는 다르게 유효한 문자열로 취급되며, 문자열 비교 함수를 통해 동일한 것으로 인식된다. 빈 문자열은 기수법에서 0을 표현하거나 텍스트 파일의 빈 줄을 나타내는 데 사용될 수 있으며, 널 종료 문자열로 해석될 수도 있다.
-
문자열 -
문자열 연결
문자열 연결은 프로그래밍 언어에서 문자열을 결합하는 연산으로, `+` 연산자나 별도의 연산자를 사용하며, 런타임 또는 컴파일 시점에 수행될 수 있고, 형식 언어 이론으로 확장되어 음성 합성 등 다양한 분야에서 활용된다. -
문자열 -
문자열 검색 알고리즘
문자열 검색 알고리즘은 텍스트에서 특정 문자열(패턴)을 찾는 알고리즘으로, KMP, 보이어-무어 등의 효율적인 알고리즘을 거쳐 다양한 방식으로 발전해 왔으며, 웹 검색 엔진, 생물 정보학 등 여러 분야에 응용되고 한국어 검색에서는 특별한 고려 사항이 필요하다. -
형식 언어 -
문자열
문자열은 사람이 읽을 수 있는 텍스트를 저장하고 정보를 전달하거나 받는 데 사용되는 순서가 있는 문자들의 시퀀스로, 다양한 형태의 데이터를 표현하며 유한한 길이를 가지고, 프로그래밍 언어에서 기본 또는 복합 자료형으로 제공되고, 문자 집합과 인코딩 방식에 따라 표현 방식이 달라진다. -
형식 언어 -
튜링 기계
튜링 기계는 앨런 튜링이 제시한 계산 모델로, 테이프 위에서 기계적으로 작동하며, 유한한 상태, 테이프, 헤드, 명령 표를 통해 작동하고, 계산 가능성과 알고리즘의 한계를 연구하는 데 사용된다.
2. 형식 언어 이론에서의 빈 문자열
형식 언어에서 빈 문자열은 λ로 표기된다. (λ의 대문자인 Λ 또는 ε를 사용하는 경우도 있다). 빈 문자열은 길이가 0이며, 어떤 심볼도 포함하지 않고, 반드시 하나만 존재한다.
빈 문자열을 공집합 언어∅와 혼동하지 않도록 주의해야 한다. 공집합 언어는, 형식 언어(문자열의 집합)에서, 빈 문자열조차 포함하지 않는 공집합을 의미한다.
빈 문자열의 성질은 다음과 같다.
* : 빈 문자열의 길이는 0이다.
* : 어떤 문자열에 빈 문자열을 연결해도, 원래의 문자열과 같다. 빈 문자열은, 문자열 연결에서의 항등원이다 (어떤 문자 집합 Σ에서 자유 모노이드를 구성한다).
* : 빈 문자열은 반전해도 빈 문자열 그대로이다.
* 사전식 순서에서는, 빈 문자열은 어떤 문자열보다 앞에 위치한다. 이는 빈 문자열이 가장 짧은 문자열이기 때문이다.
3. 프로그래밍 언어에서의 빈 문자열
대부분의 프로그래밍 언어에서 문자열은 자료형으로 취급되며, 일반적으로 별개의 메모리 주소에 저장된다. 따라서 빈 문자열("")도 메모리에 저장될 수 있으며, 이는 널 포인터와는 다르다. 널 포인터는 아무 문자열도 가리키지 않는 상태를 의미한다.
길이가 0인 문자열(빈 문자열)도 저장 형식에 따라 메모리가 필요할 수 있다. 형식 이론상으로는 빈 문자열이 하나뿐이지만, 실제 프로그래밍 환경에서는 메모리에 여러 개의 빈 문자열이 존재할 수 있다. 그러나 문자열 비교 함수는 이러한 빈 문자열들을 모두 같다고 판단한다.
빈 문자열은 유효한 문자열이며, 대부분의 문자열 연산에 사용될 수 있다. 일부 언어에서는 빈 문자열, 널 포인터, 정수 0, 부동 소수점 0, 부울 값 false, ASCII의 NUL 등을 유사하게 처리하기도 한다.
일반적으로 빈 문자열은 다른 문자열과 유사하게 표현된다. 널 종료 문자열을 사용하는 경우, 빈 문자열은 단일 널 문자로 표현된다.
오라클 데이터베이스에서는 빈 문자열과 널(SQL)을 구분하지 않는다.
3.1. 다양한 프로그래밍 언어에서의 빈 문자열 표현
| λ 표현 | 프로그래밍 언어 |
|---|---|
"" | C, C++, 자바, C#, 펄, PHP, 파이썬, 자바스크립트, Go, 비주얼 베이직 닷넷, 하스켈, 오브젝티브-C (C 문자열로서), OCaml, 표준 ML, 스칼라, Tcl, 루아, Julia, M, Swift, Rust |
'' | SQL, 펄, PHP, 파이썬, 자바스크립트, 델파이, 파스칼, Matlab, APL, R, Ruby, 스몰토크 |
{'\0'} | C, C++, 오브젝티브-C (C 문자열로서) |
std::string() | C++ |
@"" | 오브젝티브-C (상수 NSString 객체로서) |
[NSString string] | 오브젝티브-C (새로운 NSString 객체로서) |
q(), qq() | 펄 |
%{} | 루비 |
""""""''''''str() | 파이썬 |
string.Empty | C#, 비주얼 베이직 닷넷 |
String.make 0 '-' | OCaml |
{} | Tcl |
character(0) | R |
""s | C++ (2014 표준 이후) |
str() | Python |
%{}%() | Ruby |
String::new() | Rust |
| Lua |
System.String.Empty | .NET 언어 전반 (C#의 string 및 VB.NET의 String은 System.String에 대한 별칭) |
3.2. 빈 문자열 처리 시 주의사항
대부분의 프로그래밍 언어에서 빈 문자열은 널 포인터(또는 널 참조)와 구별되는데, 널 참조는 빈 문자열조차 포함하여 문자열을 전혀 가리키지 않기 때문이다. 빈 문자열은 정당한 문자열이므로, 대부분의 문자열 연산이 정상적으로 작동한다.
C/C++의 표준 라이브러리에서 문자열 조작 함수 및 문자열 클래스에 널 포인터(`NULL` 또는 `nullptr`)가 전달된 경우의 동작은 정의되지 않으며, 통상적으로 프로그램이 비정상 종료되는 원인이 된다.
일부 언어는 빈 문자열, 널 참조, 정수 0, 부동 소수점 숫자 0, 부울 값 false, ASCII 문자 NUL 등을 유사하게 처리하기도 한다.
프로그래밍 언어별 빈 문자열 표현은 다음과 같다.
| 표현 | 프로그래밍 언어 |
|---|---|
"" | C, C#, C++, Go, Haskell, Java, 자바스크립트, Julia, Lua, M, Objective-C (C 문자열), OCaml, Perl, PHP, Python, Ruby, Scala, 표준 ML, Swift, Tcl, Visual Basic .NET |
'' | APL, Delphi, 자바스크립트, Lua, MATLAB, Pascal, Perl, PHP, Python, R, Ruby, 스몰토크, SQL |
character(0) | R |
{'\0'} | C, C++, Objective-C (C 문자열) |
std::string() | C++ |
""s | C++ (2014 표준 이후) |
@"" | Objective-C (상수 NSString 객체) |
[NSString string] | Objective-C (새로운 NSString 객체) |
q(), qq() | Perl |
str() | Python |
%{}%() | Ruby |
String::new() | Rust |
string.Empty | C#, Visual Basic .NET |
String.make 0 '-' | OCaml |
{} | Tcl |
| Lua |