일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 파이썬
- 백엔드
- deep learning
- c++
- BOF
- Scala
- Shellcode
- Linux
- Javascript
- ChatGPT
- 경제
- webhacking
- 챗GPT
- hacking
- 딥러닝
- flask
- hackerschool
- 인공지능
- backend
- 러닝스칼라
- php
- Python
- 러닝 스칼라
- mysql
- hackthissite
- BOF 원정대
- 웹해킹
- 리눅스
- Web
- c
- Today
- Total
jam 블로그
[C++] 001. C기반의 C++ 1 본문
I. printf와 scanf를 대신하는 입-출력 방식
hello world의 출력 비교
- C 버전
- #include<stdio.h>
- int main()
- {
- printf("Hello World\n");
- return 0;
- }
- C++ 버전
- #include<iostream.h>
- int main()
- {
- cout<<"hello wolrd"<<endl;
- return 0;
- }
- C++ another 버전
- #include<iostream>
- int main()
- {
- std::cout<<"hello wolrd<<std::endl;
- return 0;
- }
cout의 쓰임새
- cout << 출력대상 << 출력대상1<<출력대상 2 ..... ;
- 위에 소스를 보다 보면 <<endl; 가 있는데 이건 C에서 \n 와 같은 역할을 한다.
- 작은 따옴표 '' 는 문자를 큰 따옴표 " "는 문자열을 나타낸다.
데이터 입력
- C 버전
- #include <stdio.h>
- int main()
- {
- int a;
- printf(" a 에 숫자를 넣으시오 : ");
- scanf("%d",&a);
- return 0;
- }
- C++ 버전
- #include<iostream>
- int main()
- {
- int a;
- std::cout<<"a에 숫자를 넣으시오";
- std::cin >> a;
- return 0;
- }
cin의 쓰임새
- cin >> 입력 변수 1>> 입력변수 2;
II. 함수 오버로딩
C에서는 안되지만 C++에서 되는 오버로딩에 대해서 보자
- #include <iostream>
int function()
{
return 10;
}
int function(int a, int b)
{
return a+b;
}
int main()
{
std::cout <<function()<<std::endl;
std::cout <<function(12,13)<<std::endl;
return 0;
}
- #include <iostream>
- function()와 function(12,13)이 들어갈 곳을 정확히 알고 같은 이름의 함수여도 알아서 집어 넣는게 오버로딩이다.
- 단, 함수의 이름은 같지만 매개변수의 타입이나 개수가 달아야만 한다.
- 또, 리턴값이 더라도 매개변수의 타입이나 개수가 같다면 오버로딩이 될 수 없다.
III. 디폴트 매개변수
- int function(int a = 0)
- {
- return a+1;
- }
- int main()
- {
- std::cout<<function();
- }
위와 같은 소스에서 매개 변수 int a = 0 에서 = 0 이 디폴트 매개 변수 이다.
- 메인 함수 안에 function()이 아무 매개변수를 설정 안하고 함수를 부르면 위에 function(int a =0)을 불러오면서 a=0으로 초기화 하고 실행 한다. 즉 결과 값은 1 이 나오게 된다.
- 디폴트 매개 변수와 함수의 오버로딩
- #include<iostream>
- int function(int a = 10){
return a + 1;
- }
- int function(void){
reutnr 10;
- }
- int main(void)
- {
std::cout<<function(10)<<std::endl;
std::cout<<function()<<std::endl;
- }
위에 소스를 보고 과연 컴파일이 제대로 될까?
- 답은 제대로 안된다. 여기서 약간 헷갈릴수도 있는데 function(10)을 부르면 처음에 나오는 function(int a = 10)을 호출하게 된다. (이유는 다 알꺼라 본다.)
- 그런데 그 아래 function()는 어떤 함수를 불러야 할까? function()이어도 funcrion(int a =10)을 부를 수도 있고 function()을 부를 수도 있다. 그래서 컴파일시에 어떤 함수를 불러야 할지 몰라서 오류가 나게 된다.
IV. 인라인(inline) 함수
매크로 함수의 정의와 장점
- 일단 매크로 함수에 대해서 예시를 보자
- #include<iostream>
- #define a 100;
- int main()
- {
- std::cout << a + 1 <<std:;endl;
- }
- 위에 #define이라고 되어 있는 부분이 있다. a를 100으로 치환 시킨다. 이것이 매크로 이다.
C++기반의 함수의 in-line화
- #include<iostream>
- inline int SQUARE(int x)
- {
- return x*x;
- }
- int main(void)
- {
- std::cout<<SQUARE(5)<<std::endl;
- return 0;
- }
C++ 에서는 함수 앞에 inline만 붙여주면 inline화 시킬수 있어서 매크로를 사용할 필요가 없다.
- 참고 . 컴파일러에 따라서는 inline 선언이 오히려 성능 향상에 해가 되면 무시해 버리기도 한다.
V. 이름공간(namespace)에 대한 소개
namespace
- 말그대로 이름공간 이다.
- 쓰는 이유는 어느 두 소스 또는 모듈들을 하나의 완성된 프로그램으로 옮길때 이름 충돌이 생길 수도 있기에 쓰인다.
- 예를 들어 살펴 보자
- #include<iostream>
- void function(void)
- {
- std::cout<<"A"<<std::endl;
- }
- void function(void)
- {
- std::cout<<"B"<<std::endl;
- }
- int main()
- {
- function();
- return 0;
- }
- 위와 같은 소스가 있을 때 메인에서 function()을 불러오려고 봤더니 함수가 겹쳐서 오류가 난다. 이럴때 이름공간을 정의해서 문제를 해결해 보자.
- #include<iostream>
- namespace a_com{
- void function(void)
{
std::cout<<"A"<<std::endl;
}
- }
- namespace b_com{
- void function(void)
- {
- std::cout<<"B"<<std::endl;
- }
- }
- int main()
- {
- a_com::function();
- b_com::function();
- return 0;
- }
- 위와 같이 namespace를 지정해주고 메인에서 부를 때 이름공간의 이름(a_com, b_com)을 붙어서 불러오면 각각의 함수를 불러
온다.
std::cout , std::cin, std::endl
위에서 이렇게 써왔는데 std::는 무엇일까?
- 여지껏 공부한 내용으로 보아 std라는 namespace에 cout을 쓰겠다는 뜻이 되지 않겠는가.
using
- std::cout 같이 std:: 를 계속 붙여서 쓰기 귀찮아 지므로 우리는 좀더 편하게 해보자.
- #include<iostream>
- using std::cout;
- using std::endl;
- int main()
- {
- cout <<"hello"<<endl;
- }
- using으로 std::cout, std::endl를 쓰겠다고 선언을 하고 그 다음 부터는 std 안붙이고도 쓸수 있게 된다.
- 위에 using을 더 간단하게 써보자
- #include<iostream>
- using namespace std;
- int main()
- {
- cout <<"hello"<<endl;
- }
- 위와 같은 소스를 쓰면 namespace std를 전부다 쓴다는 것이다. 처음 소스 처럼 using 2줄 쓰는 것 보다 한줄쓰는게 더 간단하지 않은가
- 전역 변수에 있는 것으로 접근 하려면 ::<변수명> 이렇게 써주면 된다.
VI. 문제
1-1
문제 1
사용자로부터 총 10개의 정수를 입력받아서 그 합을 출력하는 프로그램을 작성해보자.
문제 2
사용자로부터 이름과 전화번호를 입력받아서 배열에 저장한 다음, 그대로 출력해 주는 프로그램을 작성해 보자
문제 3
숫자를 하나 입력받아서 그 숫자에 해당하는 구구단을 출력하는 프로그램을 작성 해 보자. 예를 들어서 사용자가 5를 입력한다면 구구단에서 5단을 출력해야 한다.
문제 4
판매원들의 급여 계산 프로그램을 작성해 보자. 이 회사는 모든 판매원에게 매달 50만원의 기본 급여와 물품 판매 가격의 12%에 해당하는 돈을 지급한다. 예를 들어서 민수라는 친구의 이번 달 물품 판매 금액이 100만원이라면, 50+100*0.12 = 62만원을 급여로 지급받는다.
1-2
문제 1
다음 main 함수에서 필요로 하는 swap 함수를 구현 하라.
'개발 및 관련 자료 > C' 카테고리의 다른 글
[C++] 003. 클래스의 기본 (0) | 2013.05.12 |
---|---|
[C++] 002. C기반의 C++ 2 (0) | 2013.05.12 |
[C] 26. 매크로와 전처리기 (0) | 2013.05.12 |
[C] 25. 메모리 관리와 동적 할당 (0) | 2013.05.12 |
[C] 24. 파일입.출력 (0) | 2013.05.12 |