1. 변수

1) 변수?

프로그래밍에서 변수는 데이터를 저장하고 처리하는 데 사용되는 구성 요소이다. 

 

2) 스칼라

스칼라 타입은 하나의 데이터를 저장하는 타입을 의미한다. 대표적으로 정수형(int), 부동 소수형(float or double), 논리형(bool), 문자형(char)가 있다.

 

3) 배열

배열은 하나의 이름으로 동일한 타입의 변수를 묶어서 관리할 수 있다. 

배열의 각 원소는 메모리상에 연속적인 공간에 저장되므로, 인덱스를 사용해 원하는 위치의 원소에 바로 접근할 수 있다. 인덱스는 0부터 시작하므로 예를들어 score[1]은 배열의 2번째 원소를 의미하게 된다.

배열은 타입 특성상 전체 배열을 직접 대입하는 것이 불가능하다.

#include <iostream>
using namespace std;

int main(void) {
	int score[5] = { 70, 80, 90, 85, 75 };
	int sum = 0;

	for (int i = 0; i < 5; i++) {
		sum += score[i];
	}
	double average = sum / 5.0;
	cout << "평균: " << average << endl;

	return 0;
}

ex) 배열의 합


2. 문자열

문자열은 문자들이 연속적으로 나열된 데이터다. C++에서는 문자열을 사용하기 위해 #include<string> 헤더를 포함해야 한다.

1) 문자열 찾기

문자열 안에서 특정 문자 또는 문자열을 찾을 수 있는데 이때 find() 메서드를 사용한다. 값을 찾았다면 시작 위치를 인덱스로 반환하고, 찾지 못했다면 string::npos라는 이미 정의되어있는 값을 반환한다.

#include <iostream>
#include <string>
using namespace std;

int main(void) {
	string text = "Winner Chicken Dinner!";

	size_t pos1 = text.find("Chicken");
	size_t pos2 = text.find("!");
	size_t pos3 = text.find("Pizza");
	
	cout << "Chicken 위치: " << pos1 << endl;
	cout << "! 위치: " << pos2 << endl;
	if (pos3 = string::npos) {
		cout << "No Pizza." << endl;
		}
	return 0;
}

 

2) 문자열 추가, 수정

문자열을 추가/결합하기 위해서 + 연산자 혹은 += 연산자를 사용할 수 있다.

만약 문자열 내의 특정 문자를 수정하고 싶으면 [ ] 연산자 혹은 replace() 메서드를 사용할 수 있다.

#include <iostream>
#include <string>
using namespace std;

int main(void) {
	string text = "Winner Chicken Dinner!";

	string text2 = "Winner " + text;
	cout << text2 << endl;

	text2 += "!!";
	cout << text2 << endl;

	text2.replace(text2.find("Chicken"), 7, "PIZZA");
	cout << text2 << endl;

	text2[text2.find("!")] = '?';	//"" 가 아니라 ''에 주의
	cout << text2 << endl;

	return 0;
}

//결과값 : 
Winner Winner Chicken Dinner!
Winner Winner Chicken Dinner!!!
Winner Winner PIZZA Dinner!!!
Winner Winner PIZZA Dinner?!!

3) 그 외 중요 문자열 메서드

  1. length() : 문자열의 길이를 반환. str.length()
  2. size() : 문자열의 길이를 반환. str.size()
  3. empty() : 문자열이 비어있으면 true, 아니면 false. str.empty()
  4. clear() : 문자열을 비움. str.clear()
  5. insert() : 삽입 위치에 문자열을 삽입. str.insert(삽입위치, 문자열)
  6. erase() : 시작 위치부터 삭제할 길이만큼 삭제. str.erase(시작위치, 삭제할 길이)
  7. substr() : 시작 위치부터 길이만큼 문자열 반환. str.substr(시작위치, 길이)
  8. compare() : 사전 순 비교해서 < 0 , = 0 , > 0 반환. str.compare()
  9. push_back : 문자열의 끝에 문자를 추가. str.push_back()
  10. pop_back : 문자열의 마지막 문자 제거. str.pop_back()
  11. toupper() : 변환할 문자의 소문자를 대문자로 변환 (대문자를 소문자로는 tolower()
#include <iostream>
#include <string>
using namespace std;

int main(void) {
	string text = "hello, world!";

	for (int i = 0; i < text.length(); i++) {
		text[i] = toupper(text[i]);
		
	}
	cout << text;
	return 0;
}

대표적으로 문자열 전체를 대문자로 바꾸는 코드를 작성해보았다. toupper()는 문자 하나에 사용하기 때문에 반복문을 활용해서 전체 문자열을 대문자로 바꾸어보았다.

마찬가지로 특정 조건을 만족했을 때에만 대문자로 바꿀 수 있게 할 수 있다.

#include <iostream>
#include <string>
using namespace std;

int main() {
	string ID = "2025_KIM";

	string year = ID.substr(0, 4);	//4번째 인덱스 이전까지.
	string name = ID.substr(5);	//길이는 생략해도 됨.

	cout << "년도: " << year << endl;
	cout << "이름: " << name << endl;

	return 0;
}

substr() 을 이용해서 ID를 입력했을 때 년도와 이름을 구분할 수 있다.


3. 코딩테스트 할 때 필수 체크 사항

  1. And && 연산자와 Or || 연산자를 사용할 때 잘 구분하자(단락평가 주의).
  2. && 연산자와 || 연산자 + 조건문의 형식에서는 true (=1), false (=0) 값을 잘 구분하자.
  3. 배열 접근 시 인덱스가 경계를 벗어나지 않도록 주의하자. 인덱스 i는 0부터 시작하고 end()는 마지막 원소의 다음을 지칭한다.
  4. 나누기, 나머지 연산자 사용시 0으로 나누는 상황이 발생하지 않도록 조심하자. 만약 0으로 나눌 수 있는 상황이 있다면 조건문으로 분모가 0인지 검사하자.
  5. 자료형에 맞는 크기의 값을 사용하는지 확인하자(오버플로우 발생에 주의).
  6. 중간 계산 과정에서 오버플로우가 발생하지 않도록 주의하자(나누기를 곱셈보다 먼저 하는 게 좋은 이유).

ex) 단락평가

논리 연산자 && 와 || 는 조건식에서 첫 번째 피연산자의 평과 결과만으로 전체 표현식의 값을 결정할 수 있는 경우 두 번째 피연산자를 평가하지 않는다. 이를 단락 평가라고 한다.

  1. A && B에서 A가 false인 경우, B는 평가되지 않는다. 어차피 전체 조건식이 무조건 false이기 때문.
  2. A || B 에서 A가 true인 경우, B는 평가되지 않는다. 어차피 전체 조건식이 무조건 true이기 때문.

그럼 편한거 아니냐, 할 수 있는데 사실은 주의해야 할 점이 있다.

나는 두 조건을 모두 평가한 뒤에 결과값을 도출한다고 생각하고 코드를 작성했지만, 실제로는 하나만 평가되어 예상치 못한 동작이 발생하게 되는 경우가 생길 수 있다. 이러한 오류를 최소화하려면 조건식에서는 함수 호출 결과를 직접 사용하지 않는 것이 좋다.

bool is_ready = true;
if (is_ready || update_system()) { ..... }

예를 들어 위에서 볼 수 있듯, is_ready가 true니까 뒤의 update_system() 함수는 아예 쳐다도 안보게 된다. 결국 시스템은 업데이트를 하지 않은 채 다음 로직으로 넘어가게 되는 것이다.

+ Recent posts