jam 블로그

[C++] 001. C기반의 C++ 1 본문

개발 및 관련 자료/C

[C++] 001. C기반의 C++ 1

kid1412 2013. 5. 12. 19:55
728x90

I. printf와 scanf를 대신하는 입-출력 방식

  • hello world의 출력 비교

    • C 버전
    1. #include<stdio.h>
    2. int main()
    3. {   
    4. printf("Hello World\n");
    5. return 0;
    6. }
    • C++ 버전
    1. #include<iostream.h>
    2. int main()
    3. {
    4. cout<<"hello wolrd"<<endl;
    5. return 0;
    6. }
    • C++ another 버전
    1. #include<iostream>
    2. int main()
    3. {
    4. std::cout<<"hello wolrd<<std::endl;
    5. return 0;
    6. }
    • cout의 쓰임새

      • cout << 출력대상 << 출력대상1<<출력대상 2 ..... ;
      • 위에 소스를 보다 보면 <<endl; 가 있는데 이건 C에서 \n 와 같은 역할을 한다.
      • 작은 따옴표 '' 는 문자를 큰 따옴표 " "는 문자열을 나타낸다.
  • 데이터 입력

    • C 버전
    1. #include <stdio.h>
    2. int main()
    3. {
    4. int a;
    5. printf(" a 에 숫자를 넣으시오 : ");
    6. scanf("%d",&a);
    7. return 0;
    8. }
    • C++ 버전
    1. #include<iostream>
    2. int main()
    3. {
    4. int a;
    5. std::cout<<"a에 숫자를 넣으시오";
    6. std::cin >> a;
    7. return 0;
    8. }
    • cin의 쓰임새

      • cin >> 입력 변수 1>> 입력변수 2;

II. 함수 오버로딩

  • C에서는 안되지만  C++에서 되는 오버로딩에 대해서 보자

    1. #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;
      }
  • function()와 function(12,13)이 들어갈 곳을 정확히 알고 같은 이름의 함수여도 알아서 집어 넣는게 오버로딩이다.
  • 단, 함수의 이름은 같지만 매개변수의 타입이나 개수가 달아야만 한다.
  • 또, 리턴값이 더라도 매개변수의 타입이나 개수가 같다면 오버로딩이 될 수 없다.

III. 디폴트 매개변수

  1. int function(int a = 0)
  2. {
  3. return a+1;
  4. }
  5. int main()
  6. {
  7. std::cout<<function();
  8. }
  • 위와 같은 소스에서 매개 변수 int a = 0 에서 = 0 이 디폴트 매개 변수 이다.

    • 메인 함수 안에 function()이 아무 매개변수를 설정 안하고 함수를 부르면 위에 function(int a =0)을 불러오면서 a=0으로 초기화 하고 실행 한다. 즉 결과 값은 1 이 나오게 된다.
  • 디폴트 매개 변수와 함수의 오버로딩
  1. #include<iostream>
  2. int function(int a = 10){
  3. return a + 1;

  4. }
  5. int function(void){
  6. reutnr 10;

  7. }
  8. int main(void)
  9. {
  10. std::cout<<function(10)<<std::endl;

  11. std::cout<<function()<<std::endl;

  12. }
  • 위에 소스를 보고 과연 컴파일이 제대로 될까?

    • 답은 제대로 안된다. 여기서 약간 헷갈릴수도 있는데 function(10)을 부르면 처음에 나오는 function(int a = 10)을 호출하게 된다. (이유는 다 알꺼라 본다.)
    • 그런데 그 아래 function()는 어떤 함수를 불러야 할까? function()이어도 funcrion(int a =10)을 부를 수도 있고 function()을 부를 수도 있다. 그래서 컴파일시에 어떤 함수를 불러야 할지 몰라서 오류가 나게 된다.

IV. 인라인(inline) 함수

  • 매크로 함수의 정의와 장점

    • 일단 매크로 함수에 대해서 예시를 보자
    1. #include<iostream>
    2. #define a 100;
    3. int main()
    4. {
    5. std::cout << a + 1 <<std:;endl;
    6. }
    • 위에 #define이라고 되어 있는 부분이 있다. a를 100으로 치환 시킨다. 이것이 매크로 이다.
  • C++기반의 함수의 in-line화

    1. #include<iostream>
    2. inline int SQUARE(int x)
    3. {
    4. return x*x;
    5. }
    6. int main(void)
    7. {
    8. std::cout<<SQUARE(5)<<std::endl;
    9. return 0;
    10. }
    • C++ 에서는 함수 앞에 inline만 붙여주면 inline화 시킬수 있어서 매크로를 사용할 필요가 없다.

      • 참고 . 컴파일러에 따라서는 inline 선언이 오히려 성능 향상에 해가 되면 무시해 버리기도 한다.

V. 이름공간(namespace)에 대한 소개

  • namespace

    • 말그대로 이름공간 이다.
    • 쓰는 이유는 어느 두 소스 또는 모듈들을 하나의 완성된 프로그램으로 옮길때 이름 충돌이 생길 수도 있기에 쓰인다.
    • 예를 들어 살펴 보자
    1. #include<iostream>
    2. void function(void)
    3. {
    4. std::cout<<"A"<<std::endl;
    5. }
    6. void function(void)
    7. {
    8. std::cout<<"B"<<std::endl;
    9. }
    10. int main()
    11. {   
    12. function();
    13. return 0;
    14. }
    • 위와 같은 소스가 있을 때 메인에서 function()을 불러오려고 봤더니 함수가 겹쳐서 오류가 난다. 이럴때 이름공간을 정의해서 문제를 해결해 보자.
    1. #include<iostream>
    2. namespace a_com{
    3. void function(void)
    4. {

      std::cout<<"A"<<std::endl;

    5. }

    6. }   
    7. namespace b_com{
    8. void function(void)
    9. {
    10. std::cout<<"B"<<std::endl;
    11. }
    12. }
    13. int main()
    14. {
    15. a_com::function();
    16. b_com::function();
    17. return 0;
    18. }
    • 위와 같이 namespace를 지정해주고 메인에서 부를 때 이름공간의 이름(a_com, b_com)을 붙어서 불러오면 각각의 함수를 불러
      온다.
  • std::cout , std::cin, std::endl

    • 위에서 이렇게 써왔는데 std::는 무엇일까?

      • 여지껏 공부한 내용으로 보아 std라는 namespace에 cout을 쓰겠다는 뜻이 되지 않겠는가.
  • using

    • std::cout 같이 std:: 를 계속 붙여서 쓰기 귀찮아 지므로 우리는 좀더 편하게 해보자.
    1. #include<iostream>
    2. using std::cout;
    3. using std::endl;
    4. int main()
    5. {
    6. cout <<"hello"<<endl;
    7. }
    • using으로 std::cout, std::endl를 쓰겠다고 선언을 하고 그 다음 부터는 std 안붙이고도 쓸수 있게 된다.
    • 위에 using을 더 간단하게 써보자
    1. #include<iostream>
    2. using namespace std;
    3. int main()
    4. {
    5. cout <<"hello"<<endl;
    6. }
    • 위와 같은 소스를 쓰면 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
Comments