2025. 4. 16. 21:07ㆍProgramming Language/C++
우리는 이전에 여러개의 함수를 사용해봤다.
printf, scanf, swap 등등의 여러 함수를 사용했었는데 이번엔 우리가 함수를 만들어서 사용해볼 것이다.
놀랍게 우리는 여태까지 계속 함수를 만들어 사용했었는데 그 함수는 바로 main함수이다.
함수의 형태는 기본적으로
반환타입 함수명( 매개변수1, 매개변수2, ...){
//함수가 시작되면 실행될 코드들
//반환타입이 있다면
retrun 반환값;
}
의 형태로 생성할 수 있다.
main함수를 이 구성 방식에 따라 확인해보면 반환값이 int형이고 함수의 이름은 main이며 매개변수를 받지 않는 함수라는 것을 알 수 있다.
그런데 main의 경우는 return값을 따로 전달하지 않는데 그 이유는 main함수는 예외적으로 암시적으로 0을 리턴해주기 때문이다.
기존에 함수를 실행해보면
이렇게 끝에 코드: 0개 라고 하면서 종료되는 것을 볼 수 있는데 만약 main함수에 return값으로
이렇게 값을 반환해주면
그 값이 코드: 값 으로 출력되는 것을 볼 수 있다.
정상적으로 종료되면 0이 출력되는 것이고 이걸 종료코드, exit 코드라고 한다.
1. 사용자 지정 함수
이제 main함수 외에 다른 함수를 한번 만들어보자.
함수는 단순한 덧셈 연산을 하는 함수를 만들어 볼건데
이렇게 매개변수 a, b를 받아 내부에서 덧셈을 한 결과를 int로 반환해주는 sum함수를 만들었다.
이 함수는 main에서
이렇게 호출함으로써 값을 함수를 실행할 수 있게 된다.
1) 반환을 하지 않을때 사용하는 void
함수를 만들때 반환 타입에 void를 넣는다면 return문을 추가해줄 필요도 없고 값을 반환하지도 않는다.
2) 함수내부에서 함수를 찾지 못하는 경우
하나의 예시를 보자.
우리가 메인 함수의 위로
절대값을 구하는 함수 하나
덧셈을 하는 함수 하나가 존재할때 전달하는 전달인자의 절대값 끼리의 덧셈을 만드는
이렇게 절대값 덧셈 함수를 만들때 위에서 만든 절대값 함수, 덧셈 함수를 사용해서
이렇게 절대값 덧셈 함수를 만들었다고 해보자.
이제 이 함수를 main함수 내부에서 호출해서 사용해보면
에러가 발생한다.
보면
myAbs와 mySum을 찾을수 없다고 하는데
이렇게 떡하니 존재하는데 왜 못찾는다고 나올까
사실 컴파일러의 경우는 순서대로 코드를 읽기 때문에 myAbsSum의 내부에 코드에서 myAbs와 mySum을 읽을 시점에는 저 함수들이 코드 내부에 존재하는지 인식하지 못한다.
그렇기에 해당 함수가 존재하지 않는다고 에러를 띄운 것으로
이렇게 순서를 바꿔주면
문제 없이 출력한다.
그런데 사실 이 함수는 이것 처럼 하나의 파일 내에서만 선언될수도 다른 외부 파일에서 불러와서 사용하는 경우도 있기 때문에 매번 이렇게 순서대로만 함수가 존재함을 인식시켜줄 수는 없다.
하나의 파일을 추가로 생성해서
이렇게 추가해서
이렇게 떼어내보면
이번엔 진짜 해당 파일 내부에 없기에 에초부터 찾지 못한다고 빨간줄을 쳐준다.
이런 경우들이 있기에 우리가 사용할 수 있는 것은 프로토 타입이라는 것이다.
함수 프로토타입
함수의 반환형, 함수 이름, 매개변수 타입(선택적으로 이름도)을 세미콜론(;)과 함께 정의 없이 선언한 것으로
이렇게 선언 했던 함수들의 프로토 타입은 각각
이렇게 선언할 수 있다.
이렇게 프로토 타입을 파일의 가장 위에 선언해주면
이렇게 에러가 사라지는 것을 볼 수 있다.
실행해보면
이렇게 결과값이 잘 나오는것을 알 수 있다.
프로토 타입은 변수명을 사용하지 않아도 상관 없다.
그리고 이 프로토 타입에 매개변수의 기본값의 설정도 가능하다.
이러면 전달인자가 전달되지 않더라도 에러를 발생시키지 않고
기본값이 매개변수에 담겨 함수를 실행시켜준다.
기본값의 설정은 함수의 정의부에서 설정도 가능하다.
결론적으로 컴파일러가 컴파일 하는 시점에 해당 함수들이 존재하고 있으니 사용했을때 무리가 없다는 것을 알려주는 용도로 사용되는것으로 생각해주면 될것 같다.
'Programming Language > C++' 카테고리의 다른 글
Ch 09. 함수 - 03. 값으로 전달 (0) | 2025.04.18 |
---|---|
Ch 09. 함수 - 02. 재귀 함수 (0) | 2025.04.16 |
Ch 08. 참조 - 01. 참조(Reference) (0) | 2025.04.16 |
Ch 07. 포인터 - 07. std::vector (0) | 2025.04.15 |
Ch 07. 포인터 - 06. void pointer (0) | 2025.04.15 |