3. Objects, Types, and Values

3.1. Input

“Hello, World!” 프로그램은 출력만 할 뿐이지만 이 장에서는 입력도 다뤄 보자. 입력을 다루기 위해서는 입력을 받을 오브젝트를 만들어야 한다.

// read and write a first name
#include <iostream>
#include <string>

int main()
{
     std::cout << "Please enter your first name (followed by 'enter'):\n";
     std::string first_name;              // first_name is a variable of type string
     std::cin >> first_name;             // read characters into first_name
     std::cout << "Hello, " << first_name << "!\n";
}

위의 코드에서는 문자열을 받을 오브젝트 std::string first_name;을 선언해서 표준 입력 스트림인 std::cin으로 입력을 받았다. 이 때 콘솔에 개행 문자를 쳐 주는 것이 입력을 완료시키는 데 필요하다는 사실을 알아 두자. 표준 입출력 스트림의 연속된 입출력은 std::cout << “Hello, ” << first_name << “!\n”; 처럼 붙여 쓸 수 있다.

3.2. Variables

데이터를 저장하는 곳을 오브젝트라고 한다. 오브젝트에 접근하는 수단을 이름이라고 한다. 이름을 가진 오브젝트를 변수라고 한다. 변수는 타입을 가진다. 변수에 준 데이터를 이라 한다. 변수에 값을 대입하는 선언문을 정의문이라 한다. 정의문은 초기값을 선언해 주어야 한다. 변수에는 타입이 여러 가지가 있지만 지금은 정수형 int, 실수형 double, 문자형 char, 문자열형 std::string, 참거짓형 bool만 알아 두어도 괜찮다.

3.3. Input and type

입력 스트림의 >> 연산자는 입력받는 값을 변수의 타입에 맞게 집어넣는다. 타입이 맞지 않는다면 입력이 되지 않는다. 변수가 초기화되지 않았다면 쓰레기 값이 들어가며 초기화되었다면 그 값으로 유지된다. std::string의 >> 연산자는 공백 문자에서 입력을 끊는다.

3.4. Operations and operators

변수에 대해서 정의된 연산자만 쓸 수 있다. 연산자의 의미는 변수마다 다를 수 있다. 숫자형에 대해서 +는 덧셈이지만 std::string에 대해서는 문자열 이어붙이기 연산을 한다. 숫자형에 대해서 -는 뺄셈이지만 std::string에 대해서는 – 연산자가 없기 때문에 컴파일 에러가 난다.

대입 연산자에 대해서는 의미에 맞지 않는 숫자를 넣을 수 있다. int age = -100; 에서 나이가 -100인 건 말이 안 되지만 int형은 어쨌든 음의 정수를 담을 수 있기 때문에 컴파일러는 이를 신경쓰지 않는다. 이런 것을 체크하는 것은 프로그래머의 몫이다.

3.5. Assignment and initialization

대입 연산자는 = 를 통해 이루어진다. a = a + 7; 은 a가 a와 같다는 뜻이 아니다. a를 a에 7을 더한 값으로 업데이트한다는 뜻이다. 초기화 연산자도 =를 통해 이루어지는데, 대입 연산자와 비슷하지만 초기화 연산자는 오브젝트의 선언과 동시에 초기값을 주는 것이고 대입 연산자는 오브젝트에 현재 담긴 값을 비워 버리고 새 값을 채워 넣는 것이다.

3.5.1. An example: detect repeated words

#include <iostream>
#include <string>

int main()
{
    std::string previous = " ";       // previous word; initialized to “not a word”
    std::string current;                             // current word
    while (std::cin >> current) {                // read a stream of words
        if (previous == current)    // check if the word is the same as last
            std::cout << "repeated word: " << current << '\n';
        previous = current;
    }
}

위의 코드는 단어를 계속 입력받으면서 연속되어 반복되는 단어가 있는지를 검사한다. 직전에 입력받은 단어는 previous에 저장되어 현재 입력받은 단어인 current와 비교를 수행한다. 위의 while 루프는 파일 종료 문자를 입력받을 때 끝난다.

3.6. Composite assignment operators

이항 연산자 +=, -= 등은 a = a +, b = b – 등을 줄여서 쓴 것이다. ++, –은 += 1, -= 1과 같다.

3.6.1. An example: find repeated words

위의 코드를 변형해서 연속된 단어가 몇 번이나 등장했는지도 구할 수 있다. 이렇게 기존의 문제의 해법을 재활용하는 것은 좋은 방법이다.

#include <iostream>
#include <string>

int main()
{
    int number_of_words = 0;
    std::string previous = " ";       // previous word; initialized to “not a word”
    std::string current;                             // current word
    while (std::cin >> current) {                // read a stream of words
        ++number_of_words;
        if (previous == current)    // check if the word is the same as last
            std::cout << "word number " << number_of_words
                      << " repeated: " << current << '\n';
        previous = current;
    }
}

3.7. Names

변수나 함수명으로 _로 시작하는 단어들이나 키워드는 쓸 수 없다. 이름은 알파벳, 숫자, _ 문자로만 이루어질 수 있으며 시작 문자는 알파벳이어야 한다. 의미 있는 이름을 짓고, 오타에 취약한 이름을 짓지 말자.

3.8. Types and objects

타입은 오브젝트에 담길 수 있는 값과 행할 수 있는 연산을 정의한다. 오브젝트는 어떤 타입의 값을 담는 메모리이다. 은 어떤 타입의 메모리의 비트 표현이다. 변수는 이름 있는 오브젝트이다. 선언문은 오브젝트에 이름을 주는 문장이다. 정의문은 오브젝트에 값을 주는 문장이다. 오브젝트의 메모리상 비트 표현을 어떻게 읽는지는 그 타입에 달려 있다.

3.9. Type safety

타입 안정성은 중요하다.

3.9.1. Safe conversions

bool -> char, int, double / char -> int, double / int -> double은 자료형이 손실되지 않으므로 안전한 형변환이다.

3.9.2. Unsafe conversions

다른 형변환은 값 손실이 생기므로 안전하지 않다. C++이 이를 허용하는 이유는 역사적 이유에 근거한다. 좋지는 않지만 프로그래머가 신경쓰는 수밖에 없다. 초기화를 { } 초기화자로 하면 형변환에 의한 값 손실을 막을 수 있다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중