2023 목표 기록/기타 기록

[Java] Escape Sequences

부업태태 2022. 1. 26. 11:16
반응형

Java에서 특수문자를 출력하기 위해서는 어떻게 해야 할까?

물론 Java에서 제공하는 기본 출력 명령어인 System.out.println(); 을 사용하면 된다. 그러나 모든 특수문자를 그리 쉽게 출력할 수 있는 것은 아니다.

다른 특수문자는 문제가 없지만, \(\, 백슬래시 혹은 역슬래시라고 함)과 "(큰 따옴표)는 문제가 된다.

자세히 보면 ;(세미콜론)이 다른 문구와는 달리 초록색으로 보인다. 이는 ;을 문자열로 보기 때문이다.

 

Java에서 특수문자를 다루는 방법이 있다. 해당 내용은 Oracle의 java관련 튜토리얼에 자세히 명시되어 있다.

Oracle The Java™ Tutorials 링크

 

 

Characters (The Java™ Tutorials > Learning the Java Language > Numbers and Strings)

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated

docs.oracle.com

해당 문서의 Escape Sequences를 보면 특수문자나 특별한 이미를 가진 탈출 문자를 알 수 있다.

 

번역하자면,

\t는 tab 역할을 한다. (띄어쓰기 4번 정도의 간격, 코드를 들여쓰기 할 때 tab을 사용함)

\b는 backspace 역할을 한다.

\n은 개행(줄바꿈) 역할을 한다.

\r도 개행 역할을 한다.

\f는 프린트 출력 시 현재 페이지 마침 역할을 한다.

\'는 '를 출력한다.

\"는 "를 출력한다.

\\는 \를 출력한다.

 

즉, 위 java코드의 문제를 해결하기 위해

System.out.println("\");  => System.out.println("\\");

System.out.println("""); => System.out.println("\"");

위와 같이 변경해야 한다.

 

변경 한 후 실행하면, 모든 특수문자가 잘 나오는 것을 확인할 수 있다.

 

이번엔, 다른 Escape Sequences에 대해 알아보자.

튜토리얼에 명시된 탈출문을 모두 사용하게 되면

이러한 결과가 나온다. \t나 \n, \r은 설명한 대로 결과가 나오지만 \b나 \f는 알 수 없는 기호가 포함되어 출력된다. 이에 대해 StackOverFlow에서 힌트를 얻을 수 있었다.

해당 링크에 따르면, 옛날에는 프린터가 ASCII로 사용 되었기 때문에 프린터를 제어하기 위해 사용된 탈출문이 존재한다는 것이다.

 

그렇다면, \n과 \r은 어떤 차이가 있을까?

둘 다 개행 역할을 하기 때문에 둘 중에 아무거나 써도 된다는 의미는 절대 아닐 것이다.

모든 시스템이나 운영체제에는 출력 기능이 반드시 들어있는데, 각 시스템마다 개행 역할을 하는 명령어가 다르다.

\n은 unix에서 사용되고, \r은 mac, \r\n은 window에서 사용된다.

 

당신이 만약 window 환경에서 Java개발을 하던 중, 개발 환경을 mac으로 바꾼다면 위의 개행 문자를 모조리 다 바꿔야 할 것이다. 이를 개선하기 위해 Java에서 1.7 버전부터 제공하는 System.lineSeparator() 메소드를 사용하는 것이 좋다.

 

Java8 API에서 찾아보면 알 수 있듯이 시스템의 개행 명령어를 유닉스(\n), 맥(\r) 윈도우(\r\n) 상관 없이 항상 동일한 값을 반환한다

직접 코드를 활용해보면, 다음과 같다.

 

\n이나 \r과 같은 역할을 하지만, 개발 환경을 바꿨을 때, 혹은 출력을 담당하는 시스템이 바뀌어도 언제나 개행을 해주기 때문에 System.lineSeparator()를 사용할 것을 권장한다.

반응형