도슐랭스타

C++ 맛보기와 C 복습(3)-함수, 구조체 본문

C++

C++ 맛보기와 C 복습(3)-함수, 구조체

도도.__. 2023. 9. 27. 12:43

C 복습

main() 함수 에러

#include <iostream>
using namespace std;

int main() {
    cout << "Hello World!\n";
    return 0;
}
int main() {
    cout << "Hello World!\n";
    return 0;
}

main 함수는 프로그램에 하나만 있어야 하는데 두 개가 있기 때문에 에러가 난다.

#include <iostream>
using namespace std;
void main1() {
    cout << "Hello World!!\n";
}
int main() {
    main1();
    cout << "Hello World!\n";
    return 0;
}

이렇게 리턴값이 없는 void main1() 함수로 만들고 main() 함수에서 호출하는 것은 에러가 나지 않는다.

parameter(매개변수)는 수학에서 변수와 같은 존재이고, argument(전달인자)는 실매개변수로 변수에 대입하는 값이라고 생각하면 편하다.

void

  • 리턴값이 없으면 리턴형을 쓰는 자리에 void를 쓴다.
  • 매개변수가 없으면 매개변수를 쓰는 자리에 void를 쓴다.

lower camel case

  • 동사나 의미가 바뀌는 부분은 대문자, 나머지는 소문자로 이름을 만드는 방법이다.

C++ 맛보기

함수 정의

  • 함수의 이름, 매개변수, 리턴형, 기능, 실행문 등을 적어서 함수를 만드는 것이다.

함수 호출

  • 함수의 이름과 매개변수를 이용해서 함수를 사용하는 것이다.

함수 선언

  • 함수의 이름과 매개변수, 리턴형을 적어서 컴파일러에게 함수의 존재를 미리 알려주는 것이다.

함수 만들기

#include <iostream>
int main() 
{
    display(); //함수 호출, call
    return 0;
}
void display() //함수 정의
{
    std::cout << "도도" << std::endl;
}

이렇게 하면 에러가 난다.

main 함수를 먼저 읽기 때문에 밑에 있는 display() 함수의 존재를 모른다.

#include <iostream>
void display(void); //함수 선언, 프로토타입(prototype), 원형
int main() 
{
    display(); //함수 호출, call
    return 0;
}
void display() //함수 정의
{
    std::cout << "도도" << std::endl;
}

이렇게 main() 함수 위에 선언을 해주면 에러가 나지 않고 잘 출력이 된다.

#include <iostream>
void display(void); //함수 선언, 프로토타입(prototype), 원형
void display1(void);
int main() 
{
    display(); //함수 호출, call
    display1();
    return 0;
}
void display() //함수 정의
{
    std::cout << "도도" << std::endl;
}
void display1() //함수 정의
{
    std::cout << "ㅎㅎ" << std::endl;
}

이런 식으로 함수를 추가해 가며 코드를 짜면 된다.

매개변수가 있는 함수

#include <iostream>
void doubleNum(int x); //함수 선언, 프로토타입(prototype), 원형
int main() 
{
    doubleNum(4); //함수 호출, call
    return 0;
}
void doubleNum(int x) //함수 정의
{
    std::cout << x * 2;
}

void 에러

#include <iostream>
void doubleNum(int x);
void doubleNumReturn(int x);
int main() 
{
    doubleNum(4);
    doubleNumReturn(10);
    return 0;
}
void doubleNum(int x)
{
    std::cout << x * 2 << std::endl;
}
void doubleNumReturn(int x)
{
    return (x * 2);
}

리턴값이 있는데 void 함수를 사용하기 때문에 문제가 생긴다

#include <iostream>
void doubleNum(int x);
int doubleNumReturn(int x);
int main() 
{
    doubleNum(4);
    doubleNumReturn(10);
    return 0;
}
void doubleNum(int x)
{
    std::cout << x * 2 << std::endl;
}
int doubleNumReturn(int x)
{
    return (x * 2);
}

이렇게 해주면 에러는 나지 않는데 10*2의 값이 출력되지는 않는다. doubleNumReturn 함수는 그저 값을 리턴하는 함수지 출력은 하지 않으므로 출력은 따로 해줘야 한다.

#include <iostream>
void doubleNum(int x);
int doubleNumReturn(int x);
int main() 
{
    doubleNum(4);
    std::cout << doubleNumReturn(10);
    return 0;
}
void doubleNum(int x)
{
    std::cout << x * 2 << std::endl;
}
int doubleNumReturn(int x)
{
    return (x * 2);
}

여러 가지 함수

#include <iostream>
void doubleNum(int x);
int doubleNumReturn(int x);
int add(int x, int y);
char vending(int x);
int main()
{
    doubleNum(4);
    std::cout << doubleNumReturn(10) << std::endl;
    std::cout << add(1, 2) << std::endl;
    std::cout << vending(1) << std::endl;
    return 0;
}
void doubleNum(int x)
{
    std::cout << x * 2 << std::endl;
}
int doubleNumReturn(int x)
{
    return (x * 2);
}
int add(int x, int y)
{
    return (x + y);
}
char vending(int x)
{
    if (x == 1) return 'A';
    else return 'B';
}

자판기 함수

#include <iostream>
const char* vending1(int x);
int main()
{
    std::cout << vending1(1) << std::endl;
    return 0;
}
const char* vending1(int x) //문자열의 자료형에는 const char*를 쓴다.
{
    if (x == 1) return "커피";
    else return "유자차";
}

C언어에서 문자열 자료형은 const char* 를 사용해야 한다!

string 자료형

#include <iostream>
const char* vending1(int x); //C
std::string vending2(int x); //C++
int main()
{
    std::cout << vending1(1) << std::endl;
    std::cout << vending2(1) << std::endl;
    return 0;
}
const char* vending1(int x) //C
{
    if (x == 1) return "커피";
    else return "유자차";
}
std::string vending2(int x) //C++
{
    if (x == 1) return "aaa";
    else return "bbb";
}

문자열을 리턴하려면 C에서는 포인터를 사용해야 하는데 C++은 string을 사용할 수 있다!!

구조체

#include <iostream>
struct Man {
    int age; //멤버
    double weight; //멤버
};
int main()
{
    struct Man dodo;
    dodo.age = 100;
    dodo.weight = 20.5;
    std::cout << dodo.age << std::endl;
    std::cout << dodo.weight << std::endl;
    return 0;
}

"Man"이라는 자료형을 만든 것이고 구조체 안의 멤버는 "."으로 접근한다!

#include <iostream>
struct Man {
    int age; //멤버
    double weight; //멤버
};
int main()
{
    Man dodo; //struct 생략!
    dodo.age = 100;
    dodo.weight = 20.5;
    std::cout << dodo.age << std::endl;
    std::cout << dodo.weight << std::endl;
    return 0;
}

이렇게 C++에서는 struct를 생략해도 에러가 나지 않는다! 하지만 C에서는 생략하면 에러가 난다! 

#include <iostream>
struct Man {
    int age; //멤버
    double weight; //멤버
};
int main()
{
    Man dodo = {100, 20.5}; //한 번에 입력
    std::cout << dodo.age << "  " << dodo.weight << std::endl;
    return 0;
}

한 번에 구조체 멤버의 값을 입력할 수도 있다.

#include <iostream>
struct Man {
    int age; //멤버
    double weight; //멤버
    std::string name;
};
int main()
{
    Man dodo = { 100, 20.5, "도도"}; //한 번에 입력
    std::cout << dodo.age << "  " << dodo.weight << "  " << dodo.name << std::endl;
    return 0;
}

이름도 넣어보았다.

C언어의 구조체 멤버로는 변수만 넣을 수 있지만 C++의 구조체 멤버로는 변수와 "함수"를 넣을 수 있다!


기타 내용

  • Ctrl + M + O : 함수 접어서 보기
  • Ctrl + M + I : 함수 펼쳐서 보기

도슐랭스타
★★★★☆ : 재밌다!
C++에서는 "string"을 사용할 수 있다니~~ 너무 편하다! 처음에 C를 공부할 때 "const char*"를 왜 사용해야 하는지 사실 잘 이해하지 못했는데 이렇게 비교하며 공부하니까 이제는 너무나 잘 알겠다!! C++ 너무 좋다,, 체고,,♡

출처: https://www.youtube.com/@smilehan8416

 

Smile Han

 

www.youtube.com

 

반응형
Comments