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. "
위의 하얀색 깜빡임을 prompt라고 한다.
prompt : 사용자의 명령을 받아들일 준비가 되었음을 모니터에 나타내는 표시.
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는 우리에게 가장 소중한 친구이다 없으면 안 됨..)
아래의 연산자 표를 외우도록 하자.
위의 표를 보면, 비어있는 공간이 있는데, 저 부분의 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 을 메모리로 보면 다음과 같다.
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 이기때문이다.
위와 같은 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
-
What is meant by the term prompt?
-
Which operator do you use to read into a variable?
-
생략
-
What is \n called and what purpose does it serve?
-
What terminates input into a string?
-
What terminates input into an integer?
-
생략
-
What is an object?
-
What is a literal?
-
What kinds of literals are there?
-
What is a variable?
-
What are typical sizes for a char, and int, and a double?
-
What measures do we use for the size of small entities in memory, such as ints and strings?
-
What is the difference between = and == ?
-
What is a definition?
-
What is an initialization and how does it differ from an assignment?
-
What is string concatenation and how do you make it work in C++?
-
생략
-
Give five examples of legal names that you shouldn't use because they are likely to cause confusion.
-
What are some good rules for choosing names?
-
What is type safety and why is it important?
-
Why can conversion from double to int be a bad thing?
-
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 언제나! 절대 잊지마세요.