Kim Seon Deok
[C++] 기초적인 사용법 본문
프로그램 완성과정
프로그램의 작성 > 작성한 프로그램 컴파일 > 컴파일 결과물 링크 의 과정을 거쳐야 한다.
debug mode
디버깅을 할 수 있도록 도와주는 모드
release mode
개발한 소프트웨어를 유저에게 배포하는 모드. debug모드보다 빠르다
기본 구조
# include <iostream> // 헤더파일 선언문
int main(void) // 출력에 대한 정보, 함수 이름, 입력에 대한 정보
{
return 0;
}
프로그램의 기본단위는 함수이다.
제일 먼저 호출되는 함수는 main함수이다.
return
- 함수를 호출한 영역으로 값을 반환
- 현재 실행중인 함수의 종료
변수
#include <iostream>
int main()
{
int x = 5 ; // initialization
x = 123; // assignment
std::cout << x << std::endl; //변수 출력
std::cout << &x << std::endl; // 변수의 주소값 출력
return 0;
}
변수를 선언하는 것은 메모리 공간을 할당하는 것이다.
initializaion : 선언된 변수에 처음 값을 저장
변수는 항상 초기화를 해주는 게 좋기 때문에 assignment를 통해 메모리에 공간을 할당해준다.
변수를 선언만 하고 초기화 하지 않으면 쓰레기 값이 저장된다.
입출력 스트림
int x = 1024;
double pi = 3.141592;
std::cout << "I love this lecture!\n" << std::endl; // \n은 줄바꿈
std::cout << "x is " << x << " pi is " << pi << std::endl;
std::cout << "abc" << "\t" << "def" << std::endl; // \t는 tab, 줄을 맞춰줌
std::cout << "ab" << "\t" << "cdef" << std::endl;
cout, cin, endl은 iostream 안에 정의되어 있다.
std는 namespace이다. cout, cin, endl는 namesapce 안에 정의되어 있고 이들을 사용하기 위해서는 iostream 필요하다.
std::>> 은 데이터의 출력에 사용
<< 은 output operator이다. 출력하고자 하는 stream이 cout으로 들어감
using nameapce std;
using namespace std;
int x = 1024;
double pi = 3.141592;
cout << "I love this lecture!\n" << endl; // \n은 줄바꿈
cout << "x is " << x << " pi is " << pi << endl;
cout << "abc" << "\t" << "def" << endl; // \t는 tab, 줄을 맞춰줌
cout << "ab" << "\t" << "cdef" << endl;
cout << "\a"; // 소리 출력
return 0;
using nameapce std;를 추가해주면 cout, endl 앞에 붙어있는 std::생략할 수 있다.
using namespace std;
int x ;
cin >> x ; // x 입력받음
cout << "Your input is " << x << endl; // x 출력
std::>>cin 은 데이터 입력에 사용된다.
>>은 input operator이다.
함수
#include <iostream>
using namespace std;
int addTwoNumbers(int num_a, int num_b)
{
int sum = num_a + num_b;
return sum ; // sum은 int형태로 반환
}
int main()
{
cout << addTwoNumbers(1,2) << endl;
cout << addTwoNumbers(3,4) << endl;
cout << addTwoNumbers(8,21) << endl;
return 0;
}
함수의 return값의 형태와 함수 선언 할 때의 앞에 있는 출력형태와 같아야 한다.
#include <iostream>
using namespace std;
void PrintHelloWorld(void) // return 할 게 없다면
{
cout << "Hello World" << endl;
return ; // main문으로 돌아감
}
int main()
{
PrintHelloWorld();
return 0;
}
함수 내에서 함수를 정의할 수 없다.
지역범위(Local scope)
int main()
{
int x=5;
{
int x = 1; // 다른 영역에 대한 식별자
cout << x << endl;
cout << &x << endl;
}
{
int x = 3; // 다른 영역에 대한 식별자
cout << x << endl;
cout << &x << endl;
}
cout << x << endl;
cout << &x << endl;
return 0;
}
{ }안에 선언된 지역변수는 { }를 벗어나면 사라진다. 지역변수가 차지하고 있던 메모리는 그 지역변수가 영역을 벗어날 때 stack 메모리로 반납된다. 반납된 메모리는 다음 지역변수가 사용할 수 있도록 대기한다.
연산자
int main()
{
int x = -2; // x is a variable, 2 is a literal. assignment, 단향연산
cout << x + 2 << endl; // 이항연산
int y = (x>0) ? 1 : 2 ; // (조건식) 참이면 1, 거짓이면 2 삼항연산
cout << y << endl;
return 0;
}
변수 : 메모리 주소를 가지고 있는 것
리터럴 : 소스코드에 고정된 값
단항연산자 : -2
이항연산자 : 1+3
삼항연산자 : conditional operator는 유일한 삼항연산자이다.
하드코딩은 프로그래머가 코드에서 변수값을 리터럴 처럼고정된 값으로 직접 대입해주는 방식이다.
소프트코딩은 프로그램 실행 중에 사용자의 입력이나 외부파일, 인터넷 통신 등으로 데이터를 가져오는 방식이다.
선언과 정의의 분리
#include <iostream>
using namespace std;
int add(int a, int b); //forward declaration
int main()
{
cout << add(1,2) << endl;
cout << sub(1,2) << endl;
cout << multiply(1,2) << endl;
return 0;
}
//definition
int add(int a, int b)
{
return a + b;
}
main함수 뒤에 add함수가 definition 되어 있을 때, 맨 위에 add함수를 미리 선언해주는 것을 forward declaration이라 한다.
헤더파일 생성
#include <iostream> // processor directive
#include "add.h" // 헤더파일 가져옴
using namespace std;
int main(void)
{
cout << add(1, 2) << endl;
return 0;
}
소스파일
int add(int a, int b)
{
return a + b;
}
헤더파일
헤더파일의 폴더가 바뀐 경우
# include "(폴더이름) / (헤더파일 명)"
네임스페이스
#include <iostream>
using namespace std;
namespace MySpace1
{
int doSomething(int a, int b)
{
return a+b;
}
}
int doSomething(int a, int b)
{
return a * b;
}
int main()
{
cout << MySpace1::doSomething(3,4)<<endl;
cout << doSomething(3,4) << endl;
return 0;
}
#include <iostream>
using namespace std;
namespace MySpace1
{
int doSomething(int a, int b)
{
return a+b;
}
}
namespace MySpace2
{
int doSomething(int a, int b)
{
return a * b;
}
}
int main()
{
using namespace MySpace1;
doSomething(3,4); // MySpace1의 doSomething 실행
cout << doSomething(3,4) << endl;
return 0;
}
namespace 안에 namespace를 넣을 수도 있다.
전처리기
#include <iostream>
using namespace std;
#define MY_NUMBER "Hello World" // 매크로
int main()
{
cout << MY_NUMBER << endl;
return 0;
}
매크로는 MY_NUMBER을 만나면 그 다음의 것으로 교체해주는 역할을 한다.
#include <iostream>
#include <algorithm>
using namespace std;
#define MAX(a,b) (((a) > (b)) ? (a) : (b)) // 매크로
int main()
{
cout << std::max(1+3,2) << endl;
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
#define LIKE_APPLE // 매크로
int main()
{
#ifdef LIKE_APPLE // 조건에 맞춰서 컴파일 >> O
cout << "Apple" << endl;
#endif
#ifndef LIKE_APPLE // X
cout << "Orange" << endl;
#endif
return 0;
}
전처리기는 빌드하기 전 main안에 있는 내용들을 결정해버리는 역할을 한다. → 선택적 컴파일 가능
#define은 정의되어있는 cpp파일 내에서만 유효하다.