음악, 삶, 개발

3. Objects, Types, and Values 본문

개발 공부/Principles And Practice Using C++

3. Objects, Types, and Values

Lee_____ 2020. 7. 13. 20:28

< 목차 >

 


    3.1 Input

    "Hello, World!" 프로그램은 사용자로부터 input을 받지 않고 output 만을 출력한다.

    실제 프로그램들은 사용자의 input에 근거하여 결과를 produce 한다.

    사용자 입력을 받는 간단한 코드.

    #include <iostream>
    
    void main() {
    
        // "본인의 성을 입력하세요! : " 를 콘솔창에 출력.
        std::cout << "본인의 성을 입력하세요! : " << std::endl;
    
        // std::cin을 통한 input을 저장하기위해 변수 생성
        std::string firstName; 
    
        // 콘솔창에 입력된 단어를 firstName 에 저장.
        std::cin >> firstName; 
    
        // firstName 를 콘솔창에 출력. 
        std::cout << "안녕하세요, " << firstName << "!" <<std::endl;
    
        // 결과
        // firstName 이 "홍길동" 이라면
        // "안녕하세요, 홍길동!" 출력.
    
    }
    

     

    p60. 

    "A statement that introduces a new name into a program and sets aside memory for a variable is called definition. " 

     

    코드를 Ctrl + F5 를 눌러 실행하면 뜨는 창 std::cin 이 입력을 기다리는 상태.

    위의 하얀색 깜빡임을 prompt라고 한다.

    prompt : 사용자의 명령을 받아들일 준비가 되었음을 모니터에 나타내는 표시.

     

    홍길동을 입력하니 "안녕하세요, 홍길동!" 이 std::cout 을 통해 출력되었다.

    3.2 Variables

    기본적인 용어 몇가지를 외우고 넘어가자.

    • object :  data 를 저장하기 위한 장소 

    • name :  object 를 접근하기 위한 이름

    • variable :  이름이 있는 object

    • value : variable 이 가지고있는 값

    • definition : variable 을 정의하는 문장

    아래와 같이 작성할수있다.

    int numberOfSteps = 39;
    double flyingTime = 3.5;
    char decimalPoint = '.';
    std::string name = "Kim";
    bool isPossible = true;

    3.3 Input and Type

    variable을 이용하여 아래와 같은 예제 코드를 만들어 볼 수 있다.

    #include <iostream>
    
    void main() {
        
        std::cout << "이름과 나이를 입력하세요 : " << std::endl;
    
        std::string yourName;
        int yourAge;
    
        std::cin >> yourName;
        std::cin >> yourAge;
    
        std::cout << "안녕하세요, 당신의 이름은 " << yourName << ", 나이는 " << yourAge << std::endl;
    
    }

    위의 코드를 실행 후, "홍길동 24"를 입력하면, 정상적으로 출력이 되지만, 

    "24 홍길동"을 입력할 경우, 24를 문자로 인식하여 24는 정상적으로 출력되지만,

    "홍길동" 은 int형이 아니므로, garbage value 가 출력된다.

    이렇게 input 이 다른 경우 발생하는 것을 input format error라고 한다.

    string을 띄어쓰기해가며 입력할 경우 아래와 같이 작성해볼 수 있다.

    #include <iostream>
    
    void main() {
        
        std::cout << "이름을 띄워쓰기하여 입력하시오 : " << std::endl;
    
        std::string first;
        std::string second;
        std::string third;
    
        std::cin >> first;
        std::cin >> second;
        std::cin >> third;
    
        std::cout << first << second << third << std::endl;
    
        // "홍 길 동" 으로 입력시, "홍길동" 으로 출력된다.
    
    }

    3.4 Operations and operators (연산과 연산자)

    각 data type 은 우리가 어떤 식의 연산을 할 수 있는지 할 수 없는지 결정한다.

    연산의 예제를 보자.

    #include <iostream>
    
    int number_1 = 1;
    int number_2 = 2;
    int numberSum = number_1 + number_2; // 3 
    int numberSub = number_1 - number_2; // -1 
    
    std::string str_1 = "Hello";
    std::string str_2 = "World";
    std::string strSum = str_1 + str_2; // "HelloWorld"
    std::string strSub = str_1 - str_2; // string 은 - 연산을 할수없다. (error)

    위의 str_1 - str_2 같은 연산을 시도할 시, compiler는 컴파일을 거부한다.

    compiler 는 정확히 어떠한 연산이 data type 간에 가능한지 알고 있고, 우리의 실수를 막아준다.

    (compiler는 우리에게 가장 소중한 친구이다 없으면 안 됨..)

    아래의 연산자 표를 외우도록 하자.

     

    연산표 (64p)

    위의 표를 보면, 비어있는 공간이 있는데, 저 부분의 type 은 연산할 수 없다는 것이다.

    예를 들어, bool type의 경우, 더하기(+), 빼기(-) 연산을 할 수 없다.


    3.5 Assignment and initialization (대입과 초기화)

    긴 말 필요 없이 아래의 예제 코드로 설명하겠다. 

    #include <iostream>
    
    void main() {
    
        /* int 예제 */
        int a = 3; // a 를 3으로 초기화 (Initialization)
        int b = a; // b 에다가 a 를 copy 하여 3. (Assignment)
        b = a + 5; // b 는 3 + 5 인 8 로 바뀜.
    
        /* string 예제 */
        std::string str_a = "alpha"; // str_a 를 "alpha" 로 초기화
        str_a = "beta"; // beta 로 변경.
        std::string str_b = str_a; // str_b 에 str_a 인 beta 를 copy.
        str_b = str_a + "gamma"; // str_a 의 현재값은 "beta" + "gamma" 따라서 "bettagamma"
        
    }

    3.5.1 An example : detect repeated words

    생략


    3.6 Composite assignment operators (대입 연산자)

    긴 말 필요없이 아래의 예제 코드로 설명하겠다. 

    int a = 0;
    
    ++a;    // a = a + 1
    a += 2; // a = a + 2
    a -= 2; // a = a - 2
    a *= 2; // a = a * 2
    a /= 2; // a = a / 2
    a %= 2; // a = a % 2

    *=/=scaling 이라고 부르기도 한다.


    3.6.1 An example : find repeated words

    생략


    3.7 Names

    코드 블락으로 설명하겠다.

    /* 하면 안되는 예 */
    
    int 2x // 숫자로 시작하면 안됨.
    int time$to$ // 특수문자 들어가면안됨. 
    int Start menu // 빈칸 들어가면 안됨.
    int _mine // 가능하지만, 시스템 관련 변수가 _로 시작하는게 많으므로 사용하지말것.
    int if // c++ keyword 이므로 변수명으로 사용불가.
    
    /* 나쁜 예 */
    int myw // 약어를 사용하지말라, 나중에 몇년뒤에 보고 무슨 변수를 의도했는지 모름
    int ALL_CAPITAL_LETTERS // 관습적으로 c++ 에서 marco 를 사용할때 쓰므로 하지말것.
    
    /* 좋은 예 */
    int elementCount; // 코멘트로 때우려 하지말고 코드의 의도를 변수명에 담도록 한다.
    
    /* 짧지만 예외 */
    int i = 0; // for loop 에 쓰이거나, 함수의 parameter 이름일 경우.

    또한, 소문자로 시작하게끔 하는 게 좋다. 대문자로 시작하는 (예를 들어 Point) 같은 경우 class 명을 명명할 때 사용하는 것이 일반적.

    타이핑하다가 오타를 내기 쉬운 이름 또한 피하도록 한다.


    3.8 Types and objects

    순살을 일단 정리해본다.

    • type : object 를 위한 가능한 값과 연산을 결정한다.

    • object : 주어진 type 의 값을 쥐고있는 memory 이다.

    • value : 주어진 type 에 따른 memory 안에 bits 의 set.

    • variable : 이름을 가진 객체 

    • declaration : object에게 이름을 주는 선언.

    • definiton :  object를 위한 메모리안에 선언.

    각 타입은 서로 다른 size 를 가지고있다.

    bit 는 컴퓨터 메모리의 단위이며, 0 1 만을 가질수있다.

    int 인 120 을 메모리로 보면 다음과 같다.

    120 을 메모리에 나타낸 그림

    3.9 Type saftey

    variable 을 생성시 꼭! 초기화 해주도록 하자.

    초기화 하지않아 type-safe 하지못한 연산의 예를 코드로 보도록 한다.

    void main() {
    
        double x;           // 초기화하는것을 깜빡했다. x 는 undefined
        double y = x;       // y 역시 undefined
        double z = 2.0 + x; // + 연산을 해도 undefinded
    
    }

    typesafe 를 지향하는것은 코드 작성에서 굉장히 중요하다.


    3.9.1 Safe conversions

    안전한 type conversion 의 의미는 type 이 바뀔때 정보가 유실되지않는것이다.

    아래의 type conversion 은 안전하다.

    • bool to char

    • bool to int

    • bool to double

    • char to int

    • char to double

    • int to double

    예제 코드를 보도록 한다.

    /* char to int */
    
    char c = 'x';
    int i = c; // 'x' 는 ASCII 에서 120을 의미하여, i1 은 120이 된다.
    char c2 = i; // 120 은 x 로 c2 에 대입된다.
    
    /* int to double */
    
    int a = 2;
    double b = 2.3;
    double c = a + b; // int a 는 2 에서 2.0 으로 변환되어 b 와 더해진다. 따라서 값은 4.3
    
    

    3.9.2 Unsafe conversions

    Safe conversion 과 반대로 데이터가 변환시 유실되는것을 의미한다.

    C++ 는 unsafe (implict) conversion 또한 허용하는데, 

    타입 변환시 원래의 값과 동일하지않은 결과를 초래한다.

    아래는 unsafe type conversion.

    • double to int

    • double to char

    • double to bool

    • int to char

    • int to bool

    • char to bool

    값이 유실되는 예를 보자.

    double x = 2.7;
    int y = x; // y 는 0.7을 버리고 2가 된다.

    이렇게 값이 유실되는 것을 "narrowed" 라고 한다.

    우리가 y 를 봤을때 코드가 길어지게 되면 추후 원래는 double 이었다고 절대 유추할수없다.

    부연으로, char to int 는 안전하지만, int to char가 안전하지않은 이유는

    char  1 byte 인 반면 int  4 bytes 이다.

    int a = 1000 을 char 로 대입하면 유실이 발생한다.

    char 는 매우 작은 int 만 가질수있다. 

    컴퓨터에 따라 다르지만, char 의 범위는 0:127 또는 -128:127 또는 0:255 이기때문이다.

    char 와 int 의 크기 차이.

    위와 같은 narrowing conversion 이 발생시 compiler 는 우리에게 warn 해줄것이다.

    하지만 이런 unsafe converion 을 애초에 차단하기위해 C+11 의 새로운 기능이 있다.

     

    Uniform Initialization

     

    = 대신 { } 을 사용하여 초기화를 한다.

    그러면 narrowing 발생시 compiler 가 경고가 아니라, 컴파일 error 를 발생시킨다.

     

    예제

    double x  {2. 7}; 
    int y { x } // error : double-> int mought narrow
    
    int a { 1000 };  
    char b { a }; // error : int ->char might narrow
    
    char b1 { 1000 }; // error : narrowing (assuming 8 -bit chars)

    variable 의 초기화는 우연한 실수를 방지하기 위해 무조건 { } 을 사용하도록 한다


    Review

    1.  What is meant by the term prompt

    2.  Which operator do you use to read into a variable?

    3.  생략

    4.  What is \n called and what purpose does it serve?

    5.  What terminates input into a string?

    6.  What terminates input into an integer?

    7.  생략

    8.  What is an object?

    9.  What is a literal?

    10.   What kinds of literals are there?

    11.  What is a variable?

    12.  What are typical sizes for a char, and int, and a double?

    13.  What measures do we use for the size of small entities in memory, such as ints and strings?

    14.  What is the difference between = and == ?

    15.  What is a definition?

    16.  What is an initialization and how does it differ from an assignment?

    17.  What is string concatenation and how do you make it work in C++?

    18.  생략 

    19.  Give five examples of legal names that you shouldn't use because they are likely to cause confusion.

    20.  What are some good rules for choosing names? 

    21.  What is type safety and why is it important?

    22.  Why can conversion from double to int be a bad thing?

    23.  Define a rule to help decide if a conversion from one type to another is safe or unsafe.


    Terms

    • assignment

    • cin

    • concatenation

    • conversion

    • declaration

    • decrement

    • definition

    • increment

    • initialization

    • name

    • narrowing

    • object

    • operation

    • operator

    • type

    • type safety

    • value

    • variable


    Postscript

    언제나 type-saftey 언제나! 절대 잊지마세요.