카테고리 없음

코딩연습 #3 문자열 저장(문자열 포인터)

마쿠어 2023. 5. 29. 23:15
#include <iostream>
#include <string>

void printString(const std::string& str) {
    std::cout << str << std::endl;
}

int main() {
    std::string str = "abcd";
    printString(str);
    return 0;
}

위의 코드는 string을 통해서 문자열 abcd를 출력하는 함수이다.

 

위의 코드에서 특징은 다음과 같다

 

1. printstring 함수의 매개변수는 string& 형태라는 점

 

이는 메모리 절약을 위해서 메인 함수에서 전달받는 문자열을 별도로 복사하지 않고, 그대로 참조하기 위함이다.

물론 매개변수를 string으로 해도 되겠지만 이 경우는 메인 함수의 문자열과 출력 함수의 문자열이 형태만 같을 뿐 다른 주소를 가지게 된다는 점을 숙지해야 한다.

 

2. const를 활용해서 읽기 전용으로 전달 받는 다는 점

 

만일의 오작동을 방지하기 위해서 print 함수에서는 const를 통해서 문자열을 전달 받고 있다.

 

 

 

**char 와 char* 의 차이

애초에 char 은 1비트 짜리 문자 한개를 나타내는 변수이며, char*는 문자열을 나타내는 문자이다.

char ch = 'A';        // 단일 문자를 저장하는 char 변수
char* str = "Hello";  // 문자열을 가리키는 char* 포인터

 

사용에 있어서도 완전히 다른 모습을 보이고 있다.

 

 

ps. 과제를 하면서 자주 보이는 클래스 출력용 오버로딩에 대한 공부

 

ostream& operator<<(ostream& os, CPoint<T> pt)
{
	os << pt.x << " " << pt.y << endl;
}

이와 같은 오버로딩을 활용하게 되면, CPoint 에 << 연산자가 대입되는 경우 위의 함수를 따르게 되므로, 출력은 pt.x pt.y 가 나오게 된다.

이를 뜯어서 분석해보자면 먼저 ostream&이 붙은거는 해당 연산자가 어떠한 형태의 값을 반환하는가에 의해서 정해진다.

 

만일 int형 반환을 한다면, int operator의 형태로 작성이 될 것이다.

 

이후 operator<< 는 "<<"에 대한 오버로딩을 할 것이다 라는 의미이며

(ostream& os, CPoint<T> pt)는 매개변수이다. 여기서 ostream& os는 암묵적으로 iostream에서 전달받게 될 것이며, CPoint<t> pt는 메인 함수에서 전달을 받게 된다. 그리고 나서 os는 실행이 되는것이다.

 

여기서 중요한 점은 os가 정해진 이름이 아니라 바꿀 수 있다는 점이다 핵.심은 ostream& operator << (ostream& [이름 자유] , CPoint<T> pt) 의 구조이다.