본문 바로가기
언리얼_엔진_게임개발_공부/C++

[C++] cin vs. getline / istream 입력 버퍼 / 난수 생성 / constant 멤버 함수 / 그 외 수학 공식

by jaboy 2024. 12. 23.

*함수 오버로딩 - 암묵적 형변환 implicit type conversion

#include <iostream>
using namespace std;

void process(int value) {
    cout << "(int) 호출" << value << endl;
}

void process(int value, int value2) {
    cout << "(int, int) 호출" << value * value2 << endl;
}

void process(float value) {
    cout << "(float) 호출" << value << endl;
}
void process(float value, float value2) {
    cout << "(float, float) 호출" << value * value2 << endl;
}


int main() {

    process(10);    //(int) 호출
    process(3, 4.3);//(int, int) 호출
    process(4.3, 3);

    return 0;
}

- main() 에서 process 함수에 전달하는 인자는 (3, 4.3)이고 4.3은 double 형이기 때문에, double에 해당하는 함수가 없으므로 int 로의 암묵적 형변환이 일어난다.

- process(3, 4.3f) 로 float를 명시하는 경우 매개변수의 데이터 타입(int, float)이 모호해 컴파일 에러가 난다.

(강의에서는 float 에서 int 로 형변환이 일어난다고 잘못 설명하고 있었다...)

 

cin vs. getline (참고: https://kyu9341.github.io/C-C/2020/01/17/C++getline()/)

- cin

>> 공백이나 개행 문자 기준으로 입력을 parse한다.

 

- cin.getline()

cin.getline(char* str, streamsize n);
cin.getline(char* str, streamsize n, char dlim);

>> istream 라이브러리에 속한다.

>> \0 (null 문자, terminator) 를 마지막으로 하는 c-string 을 str 에 저장

>> n-1 개의 문자를 입력받고 n 번째 문자는 '\0' 로 저장

>> 세번째 인수는 구분 기준이 되는 문자. 미입력시 기본값인 '\n' (개행문자)를 구분자(delimiter)로 사용

 

- getline()

getline(istream& is, string str);
getline(istream& is, string str, char dlim);

>> string 라이브러리에 속한다.

>> 최대 문자수 입력이 필요하지 않고, 구분자(delimiter) 까지 스트링으로 저장.

>> 첫번째 인자는 인풋스트림 오브젝트. 예: getline(cin, str);

 

- cin.get() : 문자를 하나만 가져온다. (공백, 개행 포함)

 

- cin.ignore() - 입력 버퍼의 데이터 제거

 

---------

cin 으로 입력된 데이터를 char 문자열과 string 에 저장하는 프로세스를 살펴보았다.

#include <iostream>

using namespace std;
const int kSize = 5;

int main() {
	// 문자열에 저장
	char Array[kSize];
	for (int i = 0; i < kSize; i++) {
		cout << i + 1 << "번째 문자를 입력하세요: " << endl;
		cin >> Array[i];
		cout << "저장: " << Array[i] << endl;
	}

	// 스트링에 저장
	string input;
	cout << "텍스트를 입력하세요: " << endl;
	cin >> input;
	cout << "저장: " << input << endl;
	
	// Array 에 저장한 문자열 출력
	for (int i = 0; i < kSize; i++) {
		cout << Array[i] << " ";
	}

	// input 에 저장한 스트링 출력
	cout << input;
	
	return 0;
}

 

결과: 

- cin 에 elevator 가 입력됐을 때

1. 첫번째 반복문 실행 시  cin 에 elevator 가 입력된다

2. 'e' 'l' 'e' 'v' 'a' 가 Array[i] 에 대입된다.

3. 반복문을 빠져나왔을 때 아직 입력버퍼에 데이터('t', 'o', 'r', '\0')가 남아 있다.

4. cin >> input 은 새로 입력을 받는 것이 아니라 입력 버퍼에 남아있는 데이터를 input 에 대입한다. ('\0' delimiter 전까지)

 

----

클래스 멤버 함수 - const

https://www.geeksforgeeks.org/const-member-functions-c/

 

Const member functions in C++ - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

----

static : 최초 선언을 실행할 때 초기화, 메모리가 할당 되고 계속해서 같은 위치를 가리킴. global variable 과 비슷한 느낌. (global variable 처럼 액세스할 수는 없지만)

 

----

난수

#include <stdlib>
#include <ctime>
...
srand(static_cast<unsigned int>(time(NULL))); 
int num = rand() % 100 + 1;

 

----

 

수학 공식

 

모르면 못푸는 수학 공식들(계속 수정)

중학교, 고등학교 수학시간에 배우고 써먹었던 간단한 공식들이지만 코딩에 적용해야할 때 까먹는 경우가 빈번한 것 같아서 몇가지 수학 공식들을 적어둡니다.(계속 추가 및 수정할 예정입니다

jow1025.tistory.com

 

----

Vector

https://hwan-shell.tistory.com/119

 

C++ vector사용법 및 설명 (장&단점)

C++의 vector는 C++ 표준라이브러리(Standard Template Library)에 있는 컨테이너로 사용자가 사용하기 편하게 정의된 class를 말합니다. vector를 생성하면 메모리 heap에 생성되며 동적할당됩니다. 물론 속도

hwan-shell.tistory.com

 

----

과제하며 실수한 것들

- destructor 선언시 virtual 함수로 만들어서 delete 실행 시 자손 클래스의 destructor 가 호출될 수 있도록 하기

- class 정의 후 세미콜론;;;;;;

- 객체 포인터 생성 --> 멤버 함수 호출 시 -> 로 접근