C++

01. C++ 기초사항

til_t 2021. 1. 21. 11:11

 

C++ 기초 사항

 

- 프로그램 구조

  • main 함수
    • 프로그램의 진입점(entry point)
  • #include
    • 외부 프로그램 소스를 포함시키는 메크로
  • iostream
    • 입출력 관련 기본 라이브러리
    • std 네임스페이스를 정의
  • ::
    • 스코프 연산자
    • 어디에 정의된 것인지 지정할 때 사용
  • using namespace
    • 네임스페이스 생략을 위해 지정 (std::cout -> cout)

     


 

< ex01_hello.cpp >

 

#include <iostream>
// # 붙으면 c++에선 추상의미 전처리를 하라! preprocessing
// <iostream> 모듈! 인클루드가 파이썬에서 쓰는 용어로 import 
// 입출력과 관련된 모듈(c++에선 라이브러리라고 부름)

using namespace std;
// standard 표준 의미
// 기본으로 namespace std로 쓰겠다

int main(int argc, char const *argv[]) // 괄호에 매개변수 있으면 함수
// 파이썬에선 def, c++에선 바로 함수 명을 이용해서 정의내림
// 데이터타입을 사전에 명시해줘야 함, 정의한 데이터타입만 사용할 수 있음
//함수의 리턴타입도 명시해줘야 함 -> 지금 보는 데에선 int
// 변수도 데이터 타입 명시해줘야 함
{ // 파이썬에선 코드블럭을 들여쓰기로 했지만 c++에선 중괄호{} 이용해서 코드블럭 지정
    cout << "Hello I am Jonga" << endl;
    // cout(console out), 데이터의 값을 출력할 때 사용하는 객체
    // << -> 데이터 전송하겠다 그 옆에 전송할 데이터 적어준다
    // 이 데이터를 cout으로 보내라(왼쪽객체에게)
    // 또 전송할 데이터가 있다면 <<를 또 쓰면 된다
    // endl -> 줄 바꾸는 상수
    std::cout << "Hello I am Jonga" << std::endl << "종아";
    // cout의 사용법은 두 가지
    // cout은 std라는 namespace에 정의되어 있음, using문 안 써줬다면 이렇게 적어줘야 함
    return 0;
    // int로 리턴한다고 했으니! 데이터타입 일치해야 함
    // 이 함수의 실행을 끝내겠다는 의미로 리턴
}

// 모든 언어에서는 이름충돌이 생기기 마련이다
// c++에선 namespace로 이름충돌 다룬다
// cout이라는 식별자는 std의 범주 아래 정의하고 있는 것
// std::cout -> 다른::cout이 아니라 std에서 정의한 cout이다

// 코드러너로 실행 -> ctrl + alt + N

// ex01_hello.cpp:16:5: error: 'cout' was not declared in this scope
// using namespace 안 쓰면 생기는 오류, cout이 어디 소속인지 모르겠다

// 코드를 실행하면 .exe라는 실행파일이 생긴다
// 파이썬과 c++ 차이, 파이썬은 소스를 매번 파이썬이 실행시키는 방식
// c++은 컴파일해서 .exe를 만들어준다

 

 


 

< ex02_cout.cpp >

 

#include <iostream>
using namespace std;

int main(int argc, char const *argv[]){

    cout << 10;
    cout << "개의 사과가 있습니다" << endl;

    cout << 10 << "개의 사과가 있습니다 ";

    return 0;
}

 


 

< ex03_variable.cpp >

 

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char const *argv[])
{
    int i;
    i = 1000;
    // int i = 1000;
    // int i {1000};

    cout << i << endl;

    string s {"hello"}; // string s = "hello";
    cout << s << endl;
    return 0;
}

 

  • c++에선 문자열 표현할 때, 무조건 큰따옴표 ""로 묶어줘야 한다 (파이썬과 다르게 작은따옴표 안 된다'')
  • c++에선 세미콜론;이 나와야 문장이 끝났다는 것

 

primitive datatype(기본데이터 타입)

 

자료형 설명바이트수

정수형 short short형 정수 2
  int 정수 4
  long long형 정수 4
  long long 64비트 정수 8
문자형 char 문자 및 정수 1
부울형 bool 참이나 거짓을 나타낸다 1
부동소수점형 float 단일정밀도 부동소수점 4
  double 두배정밀도 부동소수점 8
  long double 두배정밀도 부동소수점 8

 


 

< ex04_boolean.cpp >

 

#include <iostream>
using namespace std;

int main(int argc, char const *argv[])
{
bool b;
b = true;

cout <<  b << endl;

b  = false;
cout << b;

return 0;

}

 

  • boolean
    • true / false만 가질 수 있는 타입

      • true -> 0이 아닌 모든 값, 일반적으로 1로 표현
      • false -> 0

 

< ex05_char.cpp >

 

#include <iostream>
using namespace std;

int main(int argc, char const *argv[])
{
char ch;
ch = 'a';

cout << ch;

// ch = 'ab'; -> error
// ch = "a"; -> error
// ch = ''; -> error
return 0;
}

 

  • 컴파일되려면 적어도 문법에러(context error)가 없어야 한다

  • char
    • 글자 하나를 저장하는 데이터 타입
    • 작은 따옴포로 묶어서 글자 표현

 

< ex06_string.cpp >

 

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

int main(int argc, char const *argv[]){
    
    string s1 = "Good";
    string s2 = "Morning";
    string s3 = s1 + " " + s2 + "!";

    cout << s3 << endl;

    string s4 = "Good";
    string s5 = "good";
    bool b = (s4 == s5); 
    cout << b << endl;

    return 0;
}

 

string

  • 가장 적합한 데이터타입을 선정해야 한다
  • string은 라이브러리의 객체로 지원된다, 기본데이터타입이 아니다
  • 문자열을 저장하는 데이터 타입
  • +연산자로 문자열 결합 가능
  • ==로 내용 비교 가능

 

< ex07_const.cpp >

 

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

int main(int argc, char const *argv[])
{
    const double TAX_RATE = 0.25;
    int income = 1000;
    income = income - TAX_RATE * income;
    cout << income << endl;

    return 0;
}

 

  • const

    • 한 번 초기화하면 수정 불가

    • 관례로 대문자로 이름 지정

    • 상수 정의

    • const를 바꾸려고 하면 문법오류(신텍스?)가 난다 -> 실행파일이 안 만들어진다

       

에러에는 두 가지

문법오류, 런타임에러가 있다

 


 

< ex08_auto.cpp >

 

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

auto add(int x, int y){
    return x + y;
}

int main(int argc, char const *argv[]){
    auto d = 1.0;
    auto sum = add(3, 4);

    cout << d << " " << sum << endl;
    return 0;
}

 

  • auto

    • 데이터타입을 직접 기입하는 것이 아니라 코드를 컴파일러가 분석해서 자동으로 결정할 때 사용하는 것이 auto

     

  • 함수 안에 선언된 변수, 지역변수

  • 함수 밖에 선언된 변수, 전역변수

     


 

< ex09_cout.cpp >

 

#include <iostream> 
#include <string>

using namespace std;

int main(int argc, char const *argv[]) { 
int i = 100;
cout << "변수 i의 값은 "; cout << i; cout << "입니다.";
cout << endl; cout << "변수 i의 값은 " << i<< "입니다." << endl;
// 연속사용 가능
return 0; 
}

 

  • cout

    • 객체

    • c(consol : 디폴트 입출력장치(키보드, 모니터))

    • << (오른쪽의 데이터를 콘솔로 보내라)

    • 연속 작업 사용 가능

       


 

< ex10_cin.cpp >

 

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

int main(int argc, char const *argv[]){
    int i;
    cout << "integer : ";
    cin >> i;

    double d;
    cout << "double : ";
    cin  >> d;
    
    cout << i << " " << d << endl;
    return 0;

}

 

  • cin

    • 콘솔로부터 값을 입력받는 객체

    • 변수의 데이터타입에 따라 자동으로 형변환해준다

    • 데이터가 오른쪽으로 흘러가는 느낌 (>>)

       

  • cin에서 선언한 데이터타입이 아닌 것을 입력했을 경우

    • 런타임에러가 난다
    • 지금 내가 입력하는 데이터타입을 신경써야 한다

 

< ex11_cin.cpp >

 

#include <iostream> 
#include <string> 

using namespace std;

int main(int argc, char const *argv[]) { 
string name;
cout << "이름을 입력하세요: ";
cin >> name; cout << name << "을 환영합니다." << endl;
return 0; 
}

 

 


 

< ex12_op.cpp >

 

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

int main(int argc, char const *argv[]){
    int x = 100;
    int y = 200;

    int result = x + y;
    cout << "x+y : " << result << endl;
    cout << "x-y : " << x - y << endl;
    cout << "x/y : " << x / y << endl;
    cout << "x/y : " << x /(double)y << endl;
    cout << "x % 3 : " << x % 3 << endl;
    cout << 1/2 << endl;
    cout << 1/2. << endl;

    return 0;
}

 

  • 연산자

    • / 조심 -> 정수 / 정수 = 정수 (실수로 나오지 않는다)

    • ex) 1/2 => 0.5이지만 c++에서는 데이터타입이 고정되어 있기 때문에

    • 정수 / 정수는 결과도 정수이다

    • 0.5를 강제로 정수 0으로 만든다(소수점 나머지 버린다)

    • 다른말로 말하면 몫연산

    • / 의 결과값을 실수로 받고 싶다면 피연산자의 값을 float 혹은 double로 바꿔주면 된다

       

 


 

< ex13_incdec.cpp >

 

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

int main(int argc, char const *argv[]){
    int x = 100;
    x++;
    cout << x << endl;

    x--;
    cout << x << endl;

    cout << ++x << endl;
    cout << x++ << endl;
    cout << x << endl;
    cout << --x << endl;
    cout << x-- << endl;
    cout << x << endl;
    return 0;
}

 

print

101 100 101 101 102 101 101 100

 

  • 증감연산자(변수 앞, 뒤에 붙는 경우에 따라서 달라짐)

    • ++ : 현재 값에서 1 증가
    • -- : 현재 값에서 1 감소