*23.03.31 수정
자바를 쓰다보면 System.out.print("\n"); 을 쓸 때가 있다.
이러면 줄바꿈이 되어 한 줄 밑으로가서 새로운 라인을 추가하게 된다.
즉, "\n"은 개행문자(줄바꿈 문자)인 것이다.
우리가 흔히 쓰는 Enter키처럼 줄을 바꿔주는 문자라고 생각하면 편하다.
실제로 Enter키와 "\n"이 어떤 값으로 쓰이는지 살펴보자.
🚀 '\n' 과 Enter키의 인코딩 값
이렇게 실행하고 콘솔에 Enter키를 입력하면 10이라는 인코딩값이 나온다.
'a'는 97이라는 인코딩 값이 나온다.
왜 '\n'와 Enter키는 10이 나오고, 'a'는 97이 나올까?
이것은 해당 문자를 표현하기 위한 인코딩 값이다.
인코딩값은 대부분 1~127까지 똑같으니 아스키코드표를 살펴보자.
빨간색으로 되어있는 'a' = 97 과 LF(Line Feed) = 10 으로 나와있다.
즉, 엔터(Enter)를 누르면 LF가 실행되어 줄바꿈이 실행된다는 뜻이다.
이 LF은 자바의 문자에서 '\n'으로 표시된다.
🧐 어? 저는 13이랑 10이 나왔어요??
이것은 운영체제마다 줄바꿈 문자가 다르기 때문이다.
- 윈도우(Windows) : CRLF
- 유닉스(Unix) 계열 OS (Linux, macOS 등) : LF
- 맥 (macOS 9 이전 버전) : CR
CR(Carriage Return) 은 줄의 끝에서 시작위치로 돌아간다는 뜻이다. (줄의 시작위치로 이동)
LF(Line Feed)는 커서를 한칸 아래로 이동하여 새로운 라인을 추가한다는 뜻이다. (줄바꿈)
그렇다면 위 아스키코드표를 살펴보자.
CR = 13, LF = 10 으로 표기되어 있다.
그래서 운영체제마다 13과 10이 나올때도 아닐때도 있는 것이다.
🧐 OS마다 줄바꿈이 다른데 좀 편한 방법이 없을까요?
이럴 때 쓰는 것이 System.lineSeparator() 이다.
이것은 실행되는 OS의 줄바꿈 문자를 사용하기때문에 모든 OS에서 줄바꿈이 동일하게 사용가능하다.
이렇게 코드를 작성하여 실행해보면 줄바꿈이 된 것을 알 수 있다.
🧐 lineSeparator()는 어떻게 동작하는 건가요??
저 lineSeparator() 를 Ctrl 또는 command와 함께 누르면 System.java에 작성되어 있는 코드로 가게된다.
번역해보면 다음과 같다.
Returns the system-dependent line separator string.
시스템에 종속된 줄 구분자(line separator) 문자열을 반환한다.
It always returns the same value - the initial value of the system property line.separator.
항상 시스템 소유 줄 구분자(line.separator)의 초기값과 똑같은 값을 반환한다.
On UNIX systems, it returns "\n"; on Microsoft Windows systems it returns "\r\n".
유닉스 시스템에서는 "\n"을 반환하고, 마이크로소프트 윈도우 시스템에서는 "\r\n"을 반환한다.
return : the system-dependent line separator string
반환 : 시스템에 종속된 줄 구분자(line separator) 문자열
since : 1.7
자바 1.7부터 제공되었음
이렇게 읽어보면 우리가 "\r\n" 또는 "\n" 이렇게 OS에 맞게 구분할 필요없이 lineSeparator() 만 쓰면 걱정안해도 된다라는 의미이다.
그런데 중간에 system property line.separator의 초기값과 똑같은 값을 반환한다는데 이것은 무슨 의미일까?
🧐 system property line.separator의 초기값이란?
system property (시스템 프로퍼티) 란 시스템 환경에 관한 정보를 의미한다.
그래서 System클래스의 getProperty() 메서드를 이용한다면 현재 사용하고 있는 OS의 환경 정보를 얻을 수 있다.
이것 역시 System 클래스에서 찾아보면 아래와 같다.
간단하게 번역해보자면 아래와 같다.
Gets the system property indicated by the specified key.
지정한 키로 표시된 시스템 속성(system property)을 가져온다.
parameter : key - the name of the system property.
매개변수에는 시스템 속성의 이름이 들어온다.
return : the string value of the system property, or null if there is no property with that key.
반환값에는 시스템 속성의 문자열 값 또는 해당 키가 있는 속성이 없는 경우 null을 넣는다.
System.getProperty로 line.separator를 가져와서 줄바꿈을 해보자.
이렇게 줄바꿈이 된 것을 알 수 있다.
📝 결론
System.lineSeparator() 는 OS에 상관없이 줄바꿈을 해주는 메서드이다.
이 메서드의 줄바꿈 값은 system property의 line.separator의 초기값과 동일하다.
그래서 System.getProperty("line.separator")와 동일하게 사용가능하다.
차이점이라면 System.lineSeparator()는 자바 1.7부터 제공되었다.
즉, OS에 종속적이지 않은 줄바꿈을 더 간편하게 쓰도록 지원된 것이니 이것을 사용하면 되겠다.
'\n' 문자는 컴퓨터에서 Enter키를 입력한 것과 동일하다. (OS에 따라서 달라짐)
println() 메서드도 살펴보면 print()으로 문자를 출력하고 System.lineSeparator()로 줄바꿈을 해주고 있다.
참고
'프로그래밍 > Java' 카테고리의 다른 글
Queue 인터페이스 (0) | 2022.02.22 |
---|---|
List 인터페이스 (0) | 2022.02.22 |
JVM(자바가상머신)이란? - Part 3, ClassLoader (0) | 2022.02.01 |
자바 getBytes() (0) | 2022.01.28 |
자바 toCharArray() (1) | 2022.01.28 |