1. 개요


문자

의미

기호[각주:1]

16

10

8

2진 표현

CR

복귀(Carriage Return)

\r

0x0D

13

015

0000 1101

LF

개행(Line Feed)

\n

0x0A

10

012

0000 1010


캐리지리턴라인피드는 텍스트에서 다음 행으로 줄갈이를 할 때 한 줄이 끝났음을 표시하기 위해서 쓰는 특수문자입니다.


이들을 새줄 문자; 개행 문자; 줄바꿈 문자; 행갈이 문자라고도 부르고 영어로는 newline; line ending; end of line (EOL); line break이라고 합니다[각주:2].


이런 종류의 특수문자는 종이에 하나의 기호로 출력되지 않는다는 점에서 전산 용어로 제어문자(control character) 또는 비인쇄문자(non-printing character)라고도 합니다[각주:3].


2. 역사



그런데 궁금한 것은 줄바꿈을 하기 위한 문자가 왜 두 개나 있어야 하는가 하는 점이에요. 캐리지리턴과 라인피드라는 각 문자의 용도와 차이가 있을 것입니다.


결론부터 말하면 줄바꿈을 할 때에 커서가 수평으로 이동하는 것이 캐리지리턴이고 라인피드는 커서의 수직이동을 의미합니다. 그리고 이 말을 이해하려면 타자기의 역사를 알아야 해요.


입력을 한 글자씩 받아서 그 때마다 한 자 한 글자 느리게 출력하던 구식 타자기에는 글자를 종이의 원하는 위치에 찍어낼 수 있도록 좌우로 움직이는 캐리지(Carriage)라는 장치가 있었다고 합니다.


타자기로 글자를 칠 때마다, 이 캐리지가 오른쪽으로 조금씩 이동하면서 종이에 글자를 하나씩 출력하는 것입니다.


이런 구식 타자기에서는 줄바꿈을 위해서 두 단계의 행동이 필요합니다.


첫 단계는 이 캐리지가 수평 왼쪽으로 이동하여 종이의 맨 왼쪽에서 다음 줄의 글자를 찍을 준비를 하는 것입니다. 이 동작을 캐리지가 처음 위치로 돌아온다(복귀한다)고 하여 캐리지 리턴(Carriage return)이라고 부릅니다.


두 번째 움직임은 캐리지가 행의 맨 앞쪽으로 이동한 직후에, 다음 줄로 이동하기 위해서 수직으로 종이를 조금 위로 올리는 것입니다. 이를 라인 피드(Line feed)라고 부릅니다.


그러니까 옛날 타자기에서 줄바꿈이란 캐리지리턴과 라인피드라는 두 가지 동작의 혼합입니다.


오늘날의 문자표에 캐리지리턴과 라인피드라는 두 문자가 존재하는 것은 그런 역사를 반영하고 있습니다[각주:4][각주:5][각주:6][각주:7][각주:8].


3. 결론


타자기가 느려서 줄바꿈을 하기 위해서 2글자를 출력할 만큼의 시간이 필요했던 옛날에는 줄바꿈이 CR과 LF라는 두 제어 문자의 조합으로 이루어졌었습니다.


하지만 오늘날과 같은 디지털 시대에는 둘 중 한 글자만 있어도 줄바꿈을 표현하기에 충분합니다. 그래서 컴퓨터 키보드의 엔터키를 누르면 CR 문자만이 입력됩니다.


여기서 컴퓨터 프로그래머가 알아야 하는 것은 한 가지뿐인데, 이 세상에는 줄바꿈 문자가 2개나 존재하기 때문에 텍스트를 파일로 저장할 때에 시스템(운영체제)별로 줄바꿈의 표현 방식이 다르다는 점입니다. 엄청 헷갈리니까 정리합니다.


  1. "\r\n"
    MS-DOS나 Windows 같은 마이크로소프트의 운영체제에서는 구식 장치와 호환될 수 있도록 텍스트의 줄바꿈을 CR+LF로 표현합니다. 두 문자를 모두 사용해서 용량이 약간 더 커진다는 단점이 있지만 1바이트냐 2바이트냐일 뿐입니다. 가장 근본적이고 전통적인 줄바꿈의 표현 방법입니다.

  2. "\n"
    Unix-like 운영체제(Unix, GNU/Linux)에서는 줄바꿈을 LF로만 표현합니다. 키보드의 엔터를 눌렀을 때에 입력되는 것은 CR이지만 텍스트 에디터를 통해 파일에 기록되는 문자는 LF입니다.

  3. "\r"
    구형 Mac 운영체제에서는 줄바꿈을 CR로 표현합니다. 또한 운영체제를 떠나서 보통의 키보드 엔터를 눌렀을 때 컴퓨터에 입력되는 문자 데이터도 LF가 아닌 CR입니다.


  1. 이스케이프 시퀀스 [본문으로]
  2. https://en.wikipedia.org/wiki/Newline [본문으로]
  3. https://ko.wikipedia.org/wiki/%EC%A0%9C%EC%96%B4_%EB%AC%B8%EC%9E%90 [본문으로]
  4. https://en.wikipedia.org/wiki/Newline [본문으로]
  5. https://kldp.org/node/46637 [본문으로]
  6. http://ohgyun.com/554 [본문으로]
  7. https://stackoverflow.com/questions/1552749/difference-between-cr-lf-lf-and-cr-line-break-types [본문으로]
  8. https://blog.codinghorror.com/the-great-newline-schism/ [본문으로]
Top