this 포인터
this는 객체 자신에 대한 포인터로서 클래스 내의 멤버 함수에서 사용합니다. 때문에 전역 변수도 지역 변수도 아니며, 객체를 생성하면 만들어진 객체마다 서로 다른 this 포인터가 만들어지고 객체에 대한 주소를 가리킵니다.
멤버가 아닌 함수는 객체에 속하지 않으므로 this 포인터와 같이 사용할 수 없습니다. 정적 멤버 함수에서도 쓸 수 없지만 이내용은 5장에서 다룹니다.
this 포인터는 다음과 같이 선언할 수 있습니다.
class Rectangle {
int width;
public:
Rectangle() { this->width =1; }
Rectangle(int width) { this->width = width; }
void a(int width){ this->width = width; }
}
위의 생성자 함수에 " this -> width =1 "처럼 선언했는데 자기 자신을 가리키는 포인터기에 " this -> "를 생략해도 됩니다.
Rectangle(){ this->width = 1; } Rectangle(){ width =1; }
// 둘이 같은 뜻입니다.
this 포인터를 왜 쓰나요?
생략해도 되는 걸 굳이 왜 쓰나 싶지만, 멤버 변수의 이름과 동일한 이름으로 매개 변수 이름을 지을 때 사용합니다.
즉, 객체의 멤버 함수를 가리키는 this 덕분에 같은 width변수를 써도 멤버함수의 width인지 매개변수로써의 width인지 구분할 수 있게 됩니다.
그럼 당연히 멤버 함수의 이름은 width로 두고 매개변수를 w와 같이 다른 이름을 쓰면 간단히 해결할 일이라고 생각할 수 있지만, 매개 변수 이름으로 주석역할을 대신한다고 생각할 수 있습니다.
또한 this->만 써주면 코드를 작성할 때 멤버함수인지 매개 변수인지 구분하기 쉬워집니다.
두 번째 이유는 객체의 멤버 함수에서 객체 자신의 주소를 리턴 하고 싶을 때 " return this; "가 반드시 필요하기 때문입니다.
class a{
public:
a* f(){
...
return this;
}
}
string 클래스
C++에서 문자열을 다루는 방법 중 하나입니다. C-스트링처럼 '\0'로 문자 배열을 문자열 배열로 취급하는 것이 아닌 문자열을 객체로 다루는 방법입니다.
string 클래스를 사용하기 위해 #include <string.h>를 작성하면 문자열을 저장하는 버퍼와 문자열을 다루는 다양한 함수와 연산자를 사용할 수 있게 됩니다.
C-스트링을 다룰 때 항상 메모리를 주의했어야 했지만, string 클래스는 문자열 크기에 맞추어 스스로 메모리를 조절하므로 매우 편리합니다.
- string 객체 생성
string str; // 빈 문자열을 가진 스트링 객체 생성
string str("문자열 입력") // 문자열로 리터럴 초기화
string Copystr(str); // str을 복사해 초기화한 Copystr 생성
char str[] = {'t','e','x','t'}; // c-스트링 배열로 스티링 객체 생성
string Copystr(str); // c-스트링 배열과 string 객체를 동시에 사용할 수 있습니다.
입력된 문자열은 다음과 같이 출력할 수 있습니다.
cout << str << endl;
- string 객체의 동적 생성
string *p= new string("문자열"); // string 객체 동적 생성
cout << *p; // "문자열" 출력
p->append("문자열_a") // p가 가리키는 문자열이 "문자열_a"이 됩니다.
cout << *p // "문자열_a" 출력
delete p; // 스트링 객체 반환
- string 객체에 문자열 입력
공백 문자를 포함하지 않은 문자열을 입력할 때는 cin <<를 쓰면 됩니다.
string str;
cin >> str;
공백까지 받으려면 getline() 전역 함수를 사용하면 됩니다. <string> 헤더파일에 선어 되어 있습니다.
string str;
getline(cin,str,'\n'); // cin.getline()와 비슷하게 입력 마지막 문자를 정해줍니다.
cin.getline()과는 다르며 코드의 의미는 " \n를 만나기 전까지 키보드(cin)로부터 문자열을 읽어 str에 저장해라 "입니다.
- 문자열 다루기
string 클래스를 다루는 방법 몇 가지를 소개합니다.
- 문자열 치환
string a = "C" , a="C++";
a = b; // a = "C++" , a는 b를 복사한 문자열을 가집니다.
- 문자열 비교
C언어의 strcmp와 같은 역할을 합니다.
string a_1 = "abc";
string a_2 = "def";
int v = a_1.compare(a_2);
compare( ) 함숫값이 0이면 같은 문자열이고, a_2가 a_1보다 사전순으로 앞에 오면 음수, a_2가 a_1보다 사전순으로 뒤에 오면 양수값을 가집니다.
- 문자열 연결
두 개의 문자열을 연결하기 위해 append( ) 함수를 이용합니다.
string a("안녕");
a.append("하세요."); // a = "안녕하세요."
" +, += 연산자 "를 이용할 수도 있습니다.
string a_1("안녕하세요");
string a_2(".");
string b;
b = a_1 + a_2; // b = "안녕하세요."
c += a_2; // b = "안녕하세요.."
- 문자열 삽입
insert(인덱스 위치, "넣을 문자열") : 인덱스 위치에 문자열을 넣습니다.
replace(인덱스 시작 위치, 인덱스 끝 위치, "바꿀 문자열") : 인덱스 시작위치에서 끝위치까지 바꿀 문자열을 넣습니다.
string a("I love you");
a.insert(2,"really "); // 2번 인덱스인 'l' 위치에 'really '를 삽입합니다.
// a = "I really love you"
a.replace(2,11,"want"); // "really love"를 "want"로 대체합니다.
// a = "I want you"
- 문자열 길이
string a("I love you");
int length = a.length(); // 빈공간 포함 a의 문자열 길이는 10개 입니다. length = 10
int size = a.size(); // length와 같습니다. size = 10
int capacity = a.capacity(); // 문자열 a의 현재 용량을 나타냅니다. 값이 변할수 있습니다.
- 문자열 삭제
erase(인덱스 시작 위치, 인덱스 끝 위치) : 문자열 인덱스 시작위치부터 끝 위치까지 문자를 삭제합니다.
clear() : 문자열을 완전히 삭제합니다.
string a("abcdefg");
a.erase(0,3); // a = "efg"
a.clear(); // a = " "
- 서브스트링
substr(인덱스 시작 위치, 인덱스 끝 위치) : 문자열 인덱스 시작 위치부터 끝 위치에 있는 문자열을 반환합니다.
substr(인덱스 시작 위치) : 문자열 인덱스 시작 위치부터 끝까지 문자열을 반환합니다.
string a("abcdefg");
string b = a.substr(0,3); // b = "abcd"
string c = a.substr(2); // c = "cdefg"
- 문자열 검색
find() : 문자열에서 특정 문자나 문자열을 발견하면 첫 번째 인덱스를 반환합니다. 찾지 못할 경우 '-1'을 리턴합니다.
string str = "I love love you";
int index = str.find("love") // index = 2
index = str.find("love",index+1); // 3번째 인덱스 이후부터 "love" 찾기 index = 7
index = str.find("C++"); // index = -1
- 문자열의 각 문자 다루기
at( ) : 문자열의 특정 위치에 있는 문자를 리턴합니다.
[ ] : at( )의 기능과 특정 문자를 다른 문자로 수정할 수 있습니다.
string f("I love you");
char c_1 = f.at(7); // 인덱스 7에 있는 문자 반환 c_1 = 'y'
char c_2 = f[7]; // 배열만 생각해도 알수 있죠. c_2 = 'y'
f[7] = 'C'; // f = "I love Cou"
- 문자열의 숫자 변환
stoi( ) : 문자열을 숫자로 변환해 줍니다. (엑셀에 문자를 숫자로 바꿔주는 " *1 "이라고 생각하면 됩니다.)
stirng number_str = "123456789";
int n = stoi(number_str); // n은 정수 123456789를 가집니다.
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 5장. #2 참조와 복사 생성자 (1) | 2023.12.08 |
---|---|
[C++] 5장. #1 함수 호출 시 객체 전달 (2) | 2023.12.08 |
[C++] 4장. #1 객체 포인터와 객체 배열 (0) | 2023.12.04 |
[C++] 3장. #2 접근 지정자와 인라인 함수 (1) | 2023.12.03 |
[C++] 3장. #1 클래스와 객체 (0) | 2023.12.02 |