클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

C++ 시작하기 2 : C++ 기타 구문과 함수 본문

프로그래밍 언어/C++

C++ 시작하기 2 : C++ 기타 구문과 함수

huenuri 2024. 8. 25. 11:01

이제 C++의 기타 구문과 함수에 대해서 학습해보기로 하자. 이 포스트에서 학습할 내용은 다음과 같다.

 

3. C++의 기타 구문

  • cin 사용법
  • cout에 의한 출력의 결합
  • cin과 cout 클래스 맛보기

 

4. 함수

  • 리턴값이 있는 함수
  • 변이 함수들
  • 사용자 정의 함수
  • 리턴값이 있는 사용자 정의 함수
  • 복수 함수 프로그램에 using 지시자 넣기

 

지금 학습할 필요가 없는 내용은 생략하며 중요한 내용 위주로 정리해보겠다.



 

3. C++ 기타 구문

예제 3번 : getinfo.cpp

// getinfo.cpp -- 입력과 출력
#include <iostream>

int main()
{
    using namespace std;

    int carrots;

    cout << "당근을 몇 개나 가지고 있니?" << endl;
    cin >> carrots;    // C++ 입력
    cout << "여기 두 개가 더 있다. ";
    carrots = carrots + 2;
// 다음 라인은 출력을 연결한다.
    cout << "이제 당근은 모두 " << carrots << "개이다." << endl;
    return 0;
}

 

당근의 개수를 입력하면 2개를 더해 합을 출력하는 예제이다.

 

cin 사용법

cin >> carrots;

출력은 프로그램 안에서 바깥 세상으로 흘러 나오는 문자들의 스트림이고, 입력은 바깥 세상에서 프로그램 안으로 흘러 들어가는 문자들의 스트림이다. 화살표의 방향에 주의해야 한다.

 

cout에 의한 출력의 결합

iostream 파일에는 << 연산자가 여러 개의 출력을 하나로 결합할 수 있도록 정의되어 있다.

cout << "이제 당근은 모두 " << carrots << "개이다." << endl;

 

각각 떼어서 4개의 문장으로 만들 수도 있다.

 

cin과 cout : 클래스 맛보기

 

클래스는 사용자가 정의하는 데이터형이다. 클래스를 정의하려면, 클래스로 표현할 수 있는 정보의 종류는 무엇이고, 그것으로 수행할 수 있는 동작은 무엇인지 서술해야 한다.

클래스와 객체의 관계는 데이터형과 변수의 관계와 같다.

  • 클래스 : 데이터 형식과 그것이 사용되는 방법을 서술
  • 객체 : 클래스에 서술된 데이터 형식에 따라 실제로 생성되는 구체물

클래스는 어떤 범주를 나타내는 추상적 개념이고, 객체는 실제 존재하는 것이다. 객체를 객체 인스턴스 또는 인스턴스 변수라고 부르기도 한다.

ostream과 istream처럼 사용자가 클래스를 만든 적이 없으나 미리 정의되어 있는 클래스가 있다. 클래스 정의는 그 클래스의 객체를 대상으로 수행할 수 있는 모든 동작들을 서술한다. 어떤 특정 객체를 대상으로 허용된 어떤 동작을 수행하려면 해당 객체에 메시지를 전달하면 된다.

 

클래스에 메시지를 전달하는 방법 2가지

  1. 클래스 메서드를 사용하는 함수 호출
  2. cin과 cout처럼 연산자를 오버로딩하는 것


 

4. 함수

C++ 함수는 두 가지 유형이 있다. 리턴값이 있는 것과 리턴값이 없는 것.

 

리턴값이 있는 함수

 

리턴값이 있는 함수는 변수에 대입할 수 있는 하나의 값을 만들어 낸다.

x = sqrt(6.25);

 

sqrt(6.25)를 함수 호출이라 하고, 이것에 의해 호출되는 sqrt() 함수를 피호출 함수라 한다. 함수 호출이 들어 있는 함수를 호출 함수라고 한다.
괄호 안에 있는 값이 함수에 전달되는 정보이다. 이러한 방식으로 함수에 전달되는 값을 매개변수라고 한다.

  • 리턴값 : 호출 함수에게 다시 돌려받는 값

 

함수가 작업을 끝내면 구문에 있는 함수 호출이 그 리턴값으로 대체된다. 따라서 리턴값 2.5가 변수 x에 대입된다.
C++ 컴파일러는 그 함수가 어떤 종류의 매개변수를 사용할 것이며, 어떤 종류의 리턴값을 리턴하는지 알고 있어야 한다.

 

함수 원형을 제공하는 방법 2가지

  1. 함수 원형을 소스 코드 파일에 직접 입력
  2. 함수 원형이 들어있는 cmath 헤더 파일을 포함시킴

2번째 방법이 실수를 저지를 위험이 적다.

  • 함수 원형 : 함수의 인터페이스만 알려주는 것. 그 함수에 전달하는 정보와 그 함수가 리턴하는 정보만을 서술
  • 함수 정의 : 그 함수가 수행할 작업을 위한 실제 코드를 포함


예제 4번 : sqrt.cpp

// sqrt() 함수를 사용한다

#include <iostream>
#include <cmath>    // 또는 math.h

int main()
{
    using namespace std;

    double area;
    cout << "마루 면적을 평방피트 단위로 입력하시오: ";
    cin >> area;
    double side;
    side = sqrt(area);
    cout << "사각형 마루라면 한 변이 " << side
         << "피트에 상당합니다." << endl;
    cout << "멋지네요!" << endl;
    return 0;
}
  • C++에서는 변수를 선언할 때 값도 함께 대입할 수 있음double side = sqrt(area);

이러한 과정을 초기화라고 부른다.


 

 

변이 함수들

 

어떤 함수는 하나 이상의 정보를 요구한다. 그러한 함수는 여러 개의 매개변수를 콤마로 분리한다.

double pow(double, double);

 

매개변수를 사용하지 않는 함수도 있다. void를 생략하고 괄호 안을 비워두면 매개변수를 사용하지 않는다는 것을 묵시적으로 밝히는 것이다.

myGuess = rand();

 

값을 리턴하지 않는 함수도 있다. 이 함수는 값을 화면에 표시하는 것이기 때문에 호출 함수에게는 값을 리턴하지 않는다.

void bucks(double);


 

사용자 정의 함수

 

표준 C 라이브러리는 140개 이상의 미리 정의된 함수를 제공한다. 어떤 경우에는 사용자가 직접 함수를 작성해야 한다.
main() 함수는 사용자 정의 함수이다. 함수를 사용하기 전에 반드시 그 함수의 원형을 두어야 한다.

 

예제 5번 : ourfunc.cpp

// 사용자가 작성하는 함수를 정의한다
  
#include <iostream>
void simon(int);    // simon()을 위한 함수 원형

int main()
{
    using namespace std;
    simon(3);       // simon() 함수를 호출한다
    cout << "정수를 하나 고르시오: ";
    int count;
    cin >> count;
    simon(count);   // simon() 함수를 다시 호출한다
    cout << "끝!" << endl;
    return 0;
}

void simon(int n)   // simon() 함수를 정의한다
{
    using namespace std;
    cout << "Simon 왈, 발가락을 " << n << "번 두드려라." << endl;
}                   // void형 함수에는 return 명령문이 필요 없다

 

C++에서는 어떤 함 수 안에 다른 함수를 넣을 수 없다. 각각의 함수는 서 로 독립되어 있다.

 

함수 머리

 

simon() 함수는 값을 리턴하지 않기 때문에 다음과 같은 방법으로는 사용할 수 없다.

simple = simon(3);

  • int n은 simon() 함 수가 하나의 int형 매개변수를 전달받는다는 것을 뜻한다. 여기서 n은 새로운 변수로서 함수가 호출될 때 매개변수로 전달되는 값이 여기에 대입된다.

 

리턴값이 있는 사용자 정의 함수

예제 6번 : convert.cpp

// 스톤을 파운드로 환산한다

#include <iostream>
int stonetolb(int);     // 함수 원형
int main()
{
    using namespace std;
    int stone;
    cout << "체중을 스톤 단위로 입력하시오: ";
    cin >> stone;
    int pounds = stonetolb(stone);
    cout << stone << " 스톤은 ";
    cout << pounds << " 파운드입니다." << endl;
    return 0;
}

int stonetolb(int sts)
{
     return 14 * sts;
}

 

예제에서 리턴값

 

return 구문을 사용하여 main()으로 리턴한다. 이렇게 하면 새로운 변수를 만들고, 수식을 계산한 결과는 그 변수에 대입하고, 마지막에 가서 그 값을 리턴하는 여러 단계의 번거로운 작업을 피할 수 있다.
이 방식이 마음에 들지 않는다면 다음과 같이 더 긴 코드를 작성할 수도 있다.

int stonetolb(int sts)
{
     return 14 * sts;
     return pounds;
}

 

함수 원형은 그 함수가 프로그램의 다른 부분들과 정보를 주고받는 방심을 나타낸다. 매개변수 리스트는 그 함수에 전달할 정보들의 종류를, 함수형은 그 함수가 리턴하는 값의 데이터형을 나타낸다.

흔히 프로그래머들은 정보가 안으로 들어가 가공된 후 다시 밖으로 나온다는 의미에서 함수를 블랙박스에 비유한다. 함수 원형이 이러한 정보의 흐름을 표현한다.

함수의 특징

  • 함수 머리와 함수 몸체를 가지고 있다
  • 매개변수를 받아들인다
  • 값을 리턴한다
  • 함수 원형을 요구한다

 

 

2장 학습을 마치고

여기까지 해서 개념 학습은 모두 마쳤다. 처음 시작하는 장인데도 불구하고 학습할 부분이 참 많았다. 여기까지 공부하는데 2시간 반 정도 걸린 것 같다. 아무래도 학습 일정을 수정해야 할 것 같다.
오늘 담당자께서 함수는 아직 공부하지 않아도 된다고 하셨지만 기초 과정에서 함수가 등장하며 그냥 모두 학습했다. 가장 중요한 개념이기도 했다. 전에는 이 부분이 잘 이해되지 않았는데, 오늘 책을 꼼꼼이 읽으며 대부분 이해가 되었다.

이제 연습문제를 풀며 단원 정리를 해볼 것이다. 전에 한번 풀었지만 아마 다 잊어버렸을 것 같다.