C++ Chapter 17.2 : std::string의 여러가지 생성자들과 형변환

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 17. std::string 문자열 클래스

std::string의 여러가지 생성자들과 형변환

🔔 std::string 생성자 종류

여러 생성자들로 문자열을 다양한 방식으로 초기화 할 수 있다.

디폴트 생성자

#include <iostream>
#include <string>
#include <vector>

int main()
{
	std::string my_string;
	std::cout << my_string << std::endl;  // 아무것도 출력 안함

	return 0;
}
  • 빈 문자열을 생성한다. my_string은 빈 문자열이므로 아무것도 출력하지 않는다.


매개 변수 1개 생성자

  • 문자열 리터럴을 넘길 때
    • 해당 문자열 리터럴로 초기화 한다.
      #include <iostream>
      #include <string>
      #include <vector>
      
      int main()
      {
          std::string str1("my string");
          std::cout << str1 << std::endl;  // my string 출력
      
          return 0;
      }
      
  • std::string객체를 넘길 때
    • 복사 생성자가 호출된다.
      #include <iostream>
      #include <string>
      #include <vector>
      
      int main()
      {
          std::string str1("my string");
      	
          std::string str2(str1);
      
          std::cout << second_string << std::endl;  // my string 출력
      
          return 0;
      }
      


매개 변수 2개 생성자

  • 어떤 문자열의 반복자 2 개를 넘기면 두 반복자가 표현하는 범위만큼의 문자열을 생성한다.
    • [ 시작반복자, 끝반복자 )
      • 시작 반복자를 포함한 위치에서 끝 반복자의 바로 이전 위치까지.
        #include <iostream>
        #include <string>
        #include <vector>
        
        int main()
        {
            std::vector<char> vec;
          or (auto e : "Today is a good day")
              vec.push_back(e);  // 빈 벡터 vec에 "Today is a good day" 한글자 한글자씩 원소로 삽입
        
            std::string second_string(vec.begin() + 3, vec.end());   // vec[3] ~ 마지막 원소까지
            std::cout << second_string << std::endl;  // ay is a good day 출력
                  
            std::string third_string(vec.begin(), std::find(vec.begin(), vec.end(), 'g'));  // 시작 부터 'g'가 있는 위치 전까지 
            std::cout << third_string << std::endl;  // Today is a  출력
        
            return 0;
        }
        


매개변수 3개 생성자

  • (문자열, 정수1, 정수2)
    • 정수 1 번째 이후부터(정수 1번째는 포함 안됨) 저장하되 정수 2 개의 문자를 저장
      #include <iostream>
      #include <string>
      #include <vector>
      
      int main()
      {
          const char * my_stirng = "my string";  // <- C스타일 문자열에도 잘 작동한다.
      
          std::string second_string(my_string, 4, 2);  // my_string의 4번째 글자 이후부터 2 글자만 
      
          std::cout << second_string << std::endl;  // tr 출력
      
          return 0;
      }
      


🔔 std::string 형변환

다른 데이터 타입 👉🏻 문자열

to_string(A) : A가 어떤 데이터 타입이던간에 string으로 변환시켜 준다.

  • to_string 함수가 수 많은 데이터 타입으로 오버로딩 되있기에 가능한 일.
#include <iostream>
#include <string>
#include <vector>

int main()
{
	std::string my_str(std::to_string(1004)); // "1004" 문자열이 된다.

	my_str += std::to_string(128); // "1004"에 "128" 더해진다. 문자열끼리 더한 것이므로 이어 붙여지고 "1004128"이 된다.

	std::cout << my_str << std::endl;  // "1004128" 출력

	return 0;
}


문자열 👉🏻 다른 데이터 타입

  • stoi 👉🏻 문자열을 정수로 변환한다.
    #include <iostream>
    #include <string>
    #include <vector>
    
    int main()
    {
      std::string my_str(std::to_string(1004));
    
      int i = std::stoi(my_str);
    
      std::cout << i << std::endl;  // 1004 출력
    
      return 0;
    }
    
  • stof 👉🏻 문자열을 실수(float)로 변환한다.
    #include <iostream>
    #include <string>
    #include <vector>
    
    int main()
    {
      std::string my_str(std::to_string(1004))
    
      float f = std::stof(my_str);
    
      std::cout << f << std::endl;  // 1004.0 출력
    
      return 0;
    }
    


형변환 함수 직접 만들기 : sstream 헤더

#include <sstream>

  • 문자열에서 원하는 정보만 빼낼 때 유용하게 사용할 수 있는 헤더다.
  • ostringstream, istregstream 클래스를 가지고 있다.

다른 데이터 타입 👉🏻 문자열 함수 만들기 : ostringstream

  • std::ostringstream 타입인 oss 객체에
    • oss << x 어떤 데이터 타입이든 무언가를 << 연산자를 통해 oss에 넣으면
    • oss.str() 넣어 주었던 x를 std::string 타입으로 형변환하여 리턴한다.
  • 다양한 데이터 타입을 받기 위해 템플릿 함수로 구현해보자.
#include <iostream>
#include <string>
#include <vector>
#include <sstream>

template <typename T>
std::string MyToString(T x)
{
	std::ostringstream oss;

	oss << x;
    return oss.str();
}

int main()
{
	std::string my_str(MyToString(3.141592));

	std::cout << my_str << std::endl;
	
	return 0;
}

문자열 👉🏻 다른 데이터 타입 함수 만들기 : istreagstream

  • 인수로 받은 str 문자열을 담고 있는 std::istringstream 타입인 iss 객체
  • 인수로 문자열과, 문자열을 변환하여 넣을 다른 데이터 타입의 변수를 넘기면 첫번째 인수로 넘긴 문자열을 형변환하여 두번째 인수로 넘긴 변수가 담을 수 있도록 만드는 템플릿 함수를 구현해보자.
    • bool FromString(const std::string & str, T & x)
      • 문자열 str을 형변환하여X에 담을 것
        • 참조로 받으므로 인수에도 적용 된다.
      • 성공하면 True, 실패하면 False 리턴
    • (iss >> x) ? true : false
      • strX에 형 변환하여 넣는 것에 성공했다면 true, 실패했다면 false 리턴.
#include <iostream>
#include <string>
#include <vector>
#include <sstream>

template <typename T>
bool FromString(const std::string & str, T & x)
{
	std::istringstream iss(str);

  return (iss >> x) ? true : false;
}

int main()
{
	std::string my_str("3.141592");

	double d;

	if (FromString(my_str, d))  // "3.141592"를 double형 3.141592로 바꾸려는 경우
		std::cout << d << std::endl;  // 3.14159 출력
	else    // "Hello" 이런걸 정수로 바꾸려는 경우엔 실패할 것
		std::cout << "Cannot covert string to double" << std::endl;

	return 0;
}


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

댓글남기기