비교.C+,C#,파이슨 리터럴 문자열 사용법

리터럴이란? 리터럴이란 말 그대로 ‘문자 그대로’라는 뜻이다. 변수나 정수 심볼과는 달리 코드에 직접 입력한 숫자나 문자열 등을 리터럴이라고 한다. 예를 들면 123, 1.24, “hello”, true 등이 있다. 리터럴도 표기하는 방법에 따라 유형과 진수 등을 명시할 수 있다. C++로 float접미사 ‘-f’, 16진수접두사 ‘0x’ 등이 있다.How to declare and define string and characterliteralsin C+.docs.microsoft.com 일반적으로 리터럴 타입에 대해 크게 신경쓰지 않지만 변수 유형에 맞게 암시적으로 유형 변환이 일어나기 때문이다.다만 리터럴 유형이 중간 계산에 영향을 미쳐 최종 계산 결과가 달라질 수 있으므로 주의해야 한다.상기 예에서 숫자 리터럴은 기본적으로 int 타입이므로 31비트 시프트를 하면 음수가 된다. 여기서 2로 나눠도 역시 음수다.

리터럴을 unsigntint 타입으로 하면 31비트 시프트하면 양수를 유지하고, 여기서도 역시 2로 나누어도 양수이다.

여기서는 시프트로 했지만 실제로는 ‘+’와 같이 데이터가 누적되는 경우에 자주 문제가 발생한다. 최종 결과는 int 타입으로 충분하지만 중간 계산에서 정수 오버플로우가 일어나 최종 계산이 엉뚱할 수 있다. 리터럴 타입을 명시하여 대처해야 한다.

오버로드된 함수 중 어떤 함수를 호출할지, 낮출 때도 리터럴이 중요하다. 오버로드 함수 안에 unsignedint 파라미터용 함수를 호출하고자 할 때는 리터럴에 접미사 ‘U’를 붙여 unsignedint 타입임을 명시해야 한다.C++11 이후 auto 타입이 광범위하게 사용되고 있다. 리터럴 타입이 변수 유형을 결정하기 때문에 그 어느 때보다 리터럴 타입의 중요성이 높아지고 있다.여기까지가 리터럴에 대한 배경이며, 여기부터는 문자열 리터럴에 대해 알아본다. C++ 큰 따옴표와 작은 따옴표 C/C+는 큰 따옴표와 작은 따옴표의 구분이 확실하다. 큰따옴표는 문자열, 작은따옴표는 단일문자이다.

여러 쥬리터럴 문자열의 긴 문자열을 여러 열로 나눌 경우 역슬래시를 사용할 수도 있지만 단순히 문자열을 나누는 것이 편하고 읽기 쉽다. C/C++는 문자열을 연속하고 있으면 한 문자열에 맞추어 인식한다.리터럴 문자열 그대로 좀 말장난 같다. 리터럴에 대한 리터럴이라고 할까? 정렬

”처럼 역슬래시를 이스케이프로 인식하지 않고 코드상의 리터럴을 그대로 인식하는 방식이다. 그동안 C/C++에는 이 기능이 없어 불편했지만 C+11부터는 R”() 안에 문자열을 넣으면 된다.std::string 리터럴 C++에서 리터럴 문자열 타입은 const char[ ]이다. 리터럴 문자열을 std::string 유형으로 지정할 수 없는가? 문자열 조작을 하면 std: string의 멤버 함수나 연산자를 사용하면 가독성이나 메모리 관리에 이점이 많다. 그러나 리터럴 문자열은 std::string 유형이 없기 때문에 임시 객체를 생성해야 하는데 그다지 깔끔한 방법은 아닌 것 같다.C++14에 새로 도입된 std::string_literals는 문자열에 접미사’-s’만 붙이면 std::string 유형으로 지정할 수 있다. (그 방법 3) 단, 문법이 없고 라이브러리에서 제공하는 기능이므로 사용하기 전에 using namespace std ::string_literals를 선언해 주어야 한다.std::literals::string_literals::operator”s Defined in header <string>(1) std::string operator”s (const char*str, std::size_tlen); (sinceC+14)(untilC+20) constexpr std::string operator”s (constchar*str, std:size_tlen); (sinceC++20) constd:constd sprintf( )는 버퍼 크기를 미리 지정해야 하므로 불편할 뿐만 아니라 버퍼 오버플로우의 온상이 되기 쉽다. 반면 std: string stream은 스트림 방식이기 때문에 문자열에서는 그다지 직관적이지 않고 가독성도 상당히 떨어진다.

그래서 나는 종종 C+용 format() 함수를 만들어 사용한다.sampes/format.hat master dychoe 80/sampes(github.com) format 문법은 printf()를 그대로 사용하는데 함수 내부에서 버퍼 크기를 계산하고 std:string을 리턴하고 있어 편하다.

C++20에 새로 도입된 std:format( )은 C#, Python과 문법이 비슷하다. 문자열, 인터폴레이션 기능은 없지만 C++ 포머팅 함수에서는 가장 진보적으로 보인다. 아쉽지만 아직 비주얼 스튜디오 2019, g++에는 구현이 안 돼서 조금 기다려야 할 것 같다.std::format Defined in header <format> template <class…Args> std::string format (std:string_view fmt, const Args&…args);(1) (since C+20) template <class…Args> std::wstring format (std::wstring_view fmt, const Args&…args);(2)C# 큰따옴표와 작은따옴표 C/C++와 마찬가지로 큰따옴표와 작은따옴표의 구분이 확실하다. 큰따옴표는 문자열, 작은따옴표는 단일문자이다.

복수의 쥬리터럴 문자열 긴 리터럴 문자열을 복수의 열로 나눌 때는 단순히 각 문자열을 “+”로 붙이기만 하면 된다. 정렬까지 포함한 긴 문자열을 모두 표현하려면 접두사 @를 이용하면 된다.리터럴 문자열 그대로 접두사 ‘@’를 붙이면 역슬래시를 이스케이프하지 않고 리터럴 문자 그대로 인식한다.문자열 포맷의 문자열 포맷 방법은 전반적으로 파이슨과 매우 유사하다. 문자열 인터폴레이션을 사용할 때는 접두사 “$”를 붙여준다.Converts the value of objects to strings based on the formats specified and inserts them into another string. If you are new to the String.Format method, see the Get started with the String.Format method section for a quick overview. See the Remarks section for general documentation for the String.F…docs.microsoft.comString interpolation provides a more readable and convenient syntax to format string output thantraditional string composite formatting.docs.microsoft.com 파이썬 큰따옴표와 작은따옴표 C/C+, C#과는 달리 파이썬에는 문자열을 표현할 때 큰따옴표를 사용해도 되고 작은따옴표(‘)를 사용해도 된다. 개인적으로는 작은 따옴표를 선호한다. 문자열마다 어딘가는 작은 따옴표, 어딘가는 큰 따옴표를 사용하면 바쁘지 않아 보이기 때문에 통일하는 것이 좋다.

복수의 쥬리터럴 문자열 C/C++와 같이 복수의 문자열을 연달아 나열하면 자동으로 붙여준다. 다만 파이썬에서는 한 문장(statement)을 여러 줄로 나누기 위해서는 역슬래시를 사용해야 한다. 블록 주석을 사용할 수도 있는데 이때는 정렬까지 포함된다.리터럴 문자열 그대로 접두사 ‘r’를 붙이면 역슬래시를 이스케이프하지 않고 리터럴 문자열 그대로 인식한다.문자열 포맷 파이슨은 연산자 “%”(modulooperator)를 사용한 문자열 포맷을 지원한다. 사용법은 Csprintf()와 유사하다.파이썬 3부터 새로운 포맷 방법을 지원한다. C#과 비슷하다.파이썬 3.6부터 문자열 인터폴레이션을 지원한다. 가독성 측면에서 새로운 포맷 방법을 강력히 추천한다.Learn the four main approaches to string for matting in Python, as well as their strengths and weaknesses. You’ll alsoget a simple of thumb for how to pick the best general purpose string for matting approach in your programs.realpython.com

error: Content is protected !!