JavaRush /Java Blog /Random-KO /이스케이프 문자

이스케이프 문자

Random-KO 그룹에 게시되었습니다
안녕하세요! 이전 강의에서 우리는 이미 Java에서 클래스로 표현되는 문자열에 대해 익숙해졌습니다 String. 아마 기억하시겠지만, 문자열은 일련의 문자입니다. 기호는 문자, 숫자, 구두점 등 무엇이든 될 수 있습니다. 가장 중요한 것은 문자열을 생성할 때 전체 시퀀스를 따옴표로 묶는다는 것입니다.
public class Main {
   public static void main(String[] args) {
       String sasha = new String ("Меня зовут Саша, мне 20 лет!");
   }
}
하지만 내부에 따옴표도 포함된 문자열을 생성해야 한다면 어떻게 될까요? 예를 들어, 우리는 우리가 가장 좋아하는 책에 대해 세상에 알리고 싶습니다.
public class Main {
   public static void main(String[] args) {
       String myFavoriteBook = new String ("Моя любимая книга - "Сумерки" Стефани Майер");
   }
}
컴파일러가 뭔가 마음에 들지 않는 것 같습니다! 오류의 원인이 무엇이라고 생각하며, 특히 따옴표와 함께 오류가 발생한 이유는 무엇입니까? 사실 컴파일러는 엄격하게 정의된 방식으로 따옴표를 인식합니다. 즉, 따옴표 안에 문자열을 래핑합니다. 그리고 그는 문자를 볼 때마다 "동일한 문자가 뒤따르기를 기대하며, 그 사이에는 컴파일러인 그가 작성해야 하는 줄의 텍스트가 있을 것입니다. 우리의 경우 "Twilight"라는 단어 주위의 따옴표는 다른 따옴표 안에 있습니다 . 그리고 컴파일러는 이 텍스트 조각에 도달할 때 자신이 원하는 것이 무엇인지 이해하지 못합니다. 따옴표가 있는 것 같습니다. 이는 문자열을 생성해야 함을 의미합니다. 하지만 그는 이미 그렇게 하고 있어요! 이것이 바로 이유입니다. 간단히 말해서, 이 시점에서 컴파일러는 원하는 것을 오해합니다. "또 다른 인용문? 이건 일종의 오류인가요? 이미 문자열을 생성하고 있습니다! 아니면 다른 인용문을 만들어야 할까요? 윽...:/" 인용문이 명령인 경우 컴파일러에 설명해야 합니다(" 문자열을 생성하세요!"), 간단한 기호인 경우("따옴표와 함께 "Twilight"라는 단어를 표시하세요!") 이를 달성하기 위해 Java는 문자 이스케이프를 사용합니다 . 이는 특수 문자를 사용하여 수행됩니다. 이와 같이: \. 일상 생활에서는 "백슬래시"라고 부르지만 Java에서는 (이스케이프할 문자와 함께) 이스케이프 시퀀스 라고 합니다 . 예를 들어, \"화면에 따옴표를 표시하는 제어 시퀀스는 다음과 같습니다. 코드 내에서 이러한 구성을 접하면 컴파일러는 이것이 화면에 표시되어야 하는 "따옴표" 문자일 뿐이라는 것을 이해하게 됩니다. 책을 사용하여 코드를 변경해 보겠습니다.
public static void main(String[] args) {
       String myFavoriteBook = new String ("Моя любимая книга - \"Сумерки\" Стефани Майер");
       System.out.println(myFavoriteBook);
   }
}
두 개의 "내부" 따옴표를 \. 메소드를 실행해 보겠습니다 main(). 콘솔 출력:

Моя любимая книга - "Сумерки" Стефани Майер
좋습니다. 코드가 필요에 따라 정확히 작동했습니다! 따옴표는 문자 이스케이프가 필요한 유일한 경우가 아닙니다. 예를 들어, 우리는 누군가에게 우리 작업에 대해 이야기하고 싶었습니다.
public class Main {
   public static void main(String[] args) {
       String workFiles= new String ("Мои рабочие файлы лежат в папке D:\Work Projects\java");
       System.out.println(workFiles);
   }
}
그리고 또 실수! 그 이유가 무엇인지 이미 추측할 수 있나요? 컴파일러는 무엇을 해야할지 다시 이해하지 못합니다. 결국, 그에 대한 상징은 제어 시퀀스\ 에 지나지 않습니다 ! 슬래시 뒤에는 특별한 방식으로 해석해야 하는 문자(예: 따옴표)가 있을 것으로 예상합니다. 그러나 여기에는 일반 문자가 따릅니다. 그래서 컴파일러는 다시 혼란스러워집니다. 무엇을 해야 할까요? 지난번과 똑같습니다. 우리 항목에 하나만 더 추가하세요 ! \\\
public class Main {

   public static void main(String[] args) {

       String workFiles= new String ("Мои рабочие файлы лежат в папке D:\\Work Projects\\java");
       System.out.println(workFiles);

   }
}
다음 결과를 살펴보겠습니다. 콘솔 출력:

Мои рабочие файлы лежат в папке D:\Work Projects\java
감독자! 컴파일러는 이것이 나머지 \문자와 함께 콘솔에 출력되어야 하는 일반 문자라는 것을 즉시 결정했습니다. Java에는 꽤 많은 이스케이프 시퀀스가 ​​있습니다. 전체 목록은 다음과 같습니다.
  • \t 탭 문자.
  • \b 한 단계 뒤로 텍스트의 반환 문자 또는 줄에서 한 문자 삭제(백스페이스).
  • \n 개행 문자.
  • \r 캐리지 리턴 문자.
  • \f 페이지 실행.
  • \' 작은따옴표 문자.
  • \" 큰따옴표 문자.
  • \\백슬래시 문자(\).
따라서 컴파일러가 텍스트에서 기호를 발견하면 \n이는 콘솔에 출력해야 하는 기호와 문자가 아니라 이에 대한 특수 명령인 "줄바꿈을 하세요!"라는 것을 이해하게 됩니다. 예를 들어, 시 한 편을 콘솔에 출력하려는 ​​경우 다음이 유용할 수 있습니다.
public class Main {
   public static void main(String[] args) {
       String borodino = new String ("Скажи-ка, дядя, \nВедь не даром \nМосква, спаленная пожаром, \nФранцузу отдана?");
       System.out.println(borodino);
   }
}
그리고 이것이 우리가 얻은 것입니다: 콘솔 출력:

Скажи-ка, дядя, 
Ведь не даром 
Москва, спаленная пожаром, 
Французу отдана?
정확히 필요한 것! 컴파일러는 이스케이프 시퀀스를 인식하고 4줄의 구절을 출력합니다.

유니코드

문자 이스케이프와 관련하여 알아야 할 또 다른 중요한 주제는 유니코드 입니다 . 유니코드 는 전 세계 거의 모든 언어의 문자를 포함하는 문자 인코딩 표준입니다. 즉, 이것은 모든 언어의 거의 모든 문자에 대한 코드가 포함된 특수 코드 목록입니다! 당연히 이 목록은 매우 방대하며 아무도 그것을 암기하지 않습니다. :) 그것이 어디서 왔는지, 왜 필요한지에 관심이 있다면 Habrahabr 에 대한 정보 기사를 읽으십시오 . 유니코드의 모든 문자 코드는 "문자 u+ 16진수"입니다. 예를 들어 유명한 저작권 기호는 u00A9 코드로 표시됩니다 . 따라서 Java에서 텍스트 작업을 할 때 이 문자를 사용해야 하는 경우 텍스트에서 이 문자를 이스케이프 처리할 수 있습니다! 예를 들어, 우리는 이 강의의 저작권이 JavaRush에 있음을 모든 사람에게 알리고 싶습니다.
public class Main {
   public static void main(String[] args) {
       System.out.println("Лекция \"Экранирование символов\", \u00A9 2018 Javarush");
   }
}
콘솔 출력:

Лекция "Экранирование символов", © 2018 Javarush
좋아요, 모든 일이 잘 풀렸어요! 하지만 특수문자가 전부는 아닙니다! 유니코드와 문자 이스케이프를 사용하면 서로 다른 언어로 작성된 텍스트를 동시에 인코딩할 수 있습니다. 심지어 같은 언어의 여러 다른 방언으로도 가능합니다!
public class Main {
   public static void main(String[] args) {

       System.out.println("\u041c\u0430\u0301\u043e " +
               "\u0426\u0437\u044d\u0434\u0443\u0301\u043d " +
               "\u0028\u043a\u0438\u0442\u002e \u0442\u0440\u0430\u0434\u002e " +
               "\u6bdb\u6fa4\u6771\u002c \u0443\u043f\u0440\u002e " +
               "\u6bdb\u6cfd\u4e1c\u002c \u043f\u0438\u043d\u044c\u0438\u043d\u044c\u003a " +
               "\u004d\u00e1\u006f \u005a\u00e9\u0064\u014d\u006e\u0067\u0029 " +
               "\u2014 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 " +
               "\u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 " +
               "\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 " +
               "\u0434\u0435\u044f\u0442\u0435\u043b\u044c \u0058\u0058 \u0432\u0435\u043a\u0430\u002c " +
               "\u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u043a " +
               "\u043c\u0430\u043e\u0438\u0437\u043c\u0430\u002e");
   }
}
콘솔 출력:

Ма́о Цзэду́н (кит. трад. 毛澤東, упр. 毛泽东, пиньинь: Máo Zédōng) — китайский государственный и политический деятель XX века, главный теоретик маоизма.
이 예에서는 문자 코드를 알고 키릴 문자와 세 가지(!) 한자 쓰기 유형(고전, 간체 및 라틴어(병음))으로 구성된 문자열을 작성했습니다. 기본적으로 그게 다야! 이제 작업에 이 도구를 사용하기 위해 캐릭터 탈출에 대해 충분히 알게 되었습니다 :) 모든 것이 완전히 명확하지 않은 경우 이 기사를 읽어 보시기 바랍니다 . 좋은 추가 내용이 될 것입니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION