CR(Carriage Return), LF(Line Feed)의 정의
- 컴퓨터에서 CR(Carriage Return, 이하 CR)과 LF(Line Feed, 이하 LF)는 줄바꿈 방식을 뜻한다.
방식 | 설명 | 이스케이프 문자 |
---|
CR | 커서를 현재 줄의 맨 앞으로 보낸다. | \r |
LF | 커서를 다음 줄로 내린다. | \n |
CRLF | CR과 LF방식을 혼용한다. | \r\n |
CR과 LF의 유래
- CR과 LF의 개념은 타자기(typewriter)에서 유래되었다.
- 타자기에 종이를 끼워 넣고 원하는 문자를 누르면 활자가 튀어나가 종이에 잉크를 찍어낸다.
글자는 정확히 타자기의 중앙에 찍히며 종이가 정해진 간격만큼 왼쪽으로 움직이게 된다.
이 때, 이 종이를 움직이게 만드는 장치가 바로 Carriage이다.
- Carriage Return Lever를 오른쪽으로 밀어 Carriage가 초기 위치로 복귀하게되고 그와 동시에 종이가 위로 올라가서 줄바꿈이 이루어진다. 그래서 Carriage를 처음 위치로 복귀한다는 뜻에서 Carriage Return 즉 CR이란 용어를 사용하고 , 종이를 올려 줄을 바꾼다는 뜻에서 Line Feed 즉 LF란 용어를 사용하게 된 것이다.
운영체제별 줄바꿈 방식
- 운영체제별로 줄바꿈 방식이 서로 다르다.
- Windows : 기본적으로 CR+LF 방식을 사용한다. (
\r\n
)
- Linux, Unix : 기본적으로 LF 방식을 사용한다. (
\n
)
유물이 되어버린 CRLF방식 (Feat. Windows)
※ 참고로 Apple은 mac OS X 부터 LF방식을 사용한다.
- 더이상 필요없게 된 CR방식
- 텍스트 처리 기술의 발전 : 현대의 텍스트 편집기와 IDE(Integrated Development Environment)는 기술의 발전으로 CRLF와 LF방식을 모두 처리할 수 있게 되었다. 따라서 어떤 운영체제에서 작업하더라도 줄바꿈 문자로 인한 문제가 발생하지 않게 되었다.
- 크로스 플랫폼 호환성 : Windows를 제외한 현대의 운영체제들(Linux, mac OS, Android 등)은 기본적으로 크로스 플랫폼 호환성이 뛰어난 LF방식을 사용하고 있다.
- 버전 관리 시스템 : 유명한 버전관리 시스템인 Git은 기본 설정으로 LF 방식을 선택하고 있다.
그리고 수많은 개발자들도 이에 따라 LF 방식의 프로젝트를 사용하고 있는 추세이다.
- 개발에 필요한 도구들은 모두 LF 방식을 사용한다.
- 개발자들이 많이 사용하는 HTML, CSS, JS, Git, Prettier까지도 LF 방식을 사용하고 있다. 개발자들의 입장에선 쓸데없는 CR까지 더한 CRLF방식은 메모리 낭비밖에 되지 않는다고 생각할 것이다.
(※ 참고로 CRLF문자는 2bytes, LF문자는 1byte를 차지한다.)
- LF방식을 사용하는 버전 관리 시스템(이하 VCS)으로 협업 시 CRLF와 LF 파일간 호환성 충돌로 문제가 발생할 수 있다.
같은 내용의 파일이더라도 줄바꿈 방식이 서로 다르다면 VCS는 두 파일이 다르다고 인식하고 엄청난 양의 변경사항을 쏟아내게 된다.
물론 각 VCS마다 이를 대비한 해결책을 마련해놓았지만, 일일이 세팅을 해줘야 한다는 귀찮음이 따른다.
(※ Git에서는 config파일의 core.autocrlf
속성에서 자동으로 LF방식변환을 지원한다. )
- 아직까지 CRLF 방식을 고집하는 Windows
- MS Windows 운영체제는 이러한 변화 속에서도 아직까지 CRLF 방식을 고집하고 있다.
- 역사적인 이유 : 옛날 MS-DOS 운영체제는 CRLF방식을 사용하고 있었다. 그러다가 Windows 운영체제가 등장하게 되었고 초기의 Windows는 MS-DOS와 강한 호환성을 가지고 있었다. 이로 인해서 Windows에서도 CRLF방식을 사용하게 되는 계기가 되었다.
- Legacy(오래된) 시스템과의 호환성 : Windows는 모바일 운영체제가 등장하기 전까지 항상 전세계 점유율 1위를 차지하던 독점과도 같은 운영체제였다. 그렇기 때문에 아직까지도 많은 레거시 시스템들은 Windows의 CRLF방식을 택하고 있으며 Windows가 이렇게 오랫동안 유지해온 방식을 함부로 변경하기 어려워하는 이유이기도 하다.
Reference
- 이미지 - typewriter (https://www.etsy.com/listing/1382871022/vintage-hermes-3000-rare-wide-carriage)
CR,LF Meme
(https://www.reddit.com/r/ProgrammerHumor/comments/6a6379/rn/)
- Aleksandr Hovhannisyan’s Blog - CRLF vs. LF: Normalizing Line Endings in Git
(https://www.aleksandrhovhannisyan.com/blog/crlf-vs-lf-normalizing-line-endings-in-git/)
- developheo’s blog - CRLF와 LF차이의 이해
(https://yongdev91.tistory.com/25)
- Prettier Docs - Configuring Prettier > Options > End of Line
(https://prettier.io/docs/en/options.html)