C, C++/codecademy

함수 - 범위 및 유연성 (지역/전역범위, 인라인 함수, 오버로드, 템플릿)

짱짱이_ 2023. 3. 1. 18:24
  • 전역범위와 지역범위

- 전역범위: 전역범위에서 정의된 변수는 프로그램 어디서나 액세스 할 수 있다.

- 지역범위: 함수에서 정의된 변수는 함수 내에서만 액세스 할 수 있다.

 

 

 

#include <iostream>

void enter_code(int passcode) {
  
  if (passcode == 0310) {
    
    std::string secret_knowledge = "https://content.codecademy.com/courses/regex/onyourexcitingjourneylearningtocodeyouwillfindthis.gif";
    
    std::cout << secret_knowledge << "\n";
    
  } else {
    
    std::cout << "Sorry, incorrect!\n";
    
  }
}

int main() {
  
  enter_code(0310);
  
}

 passcode가 맞았을 때만 secret_knowledge가 출력될 수 있도록 지역범위로 secret_knowledge를 함수 안에 넣어준다.

 

 

 

 

  • 인라인 함수

- 인라인 함수는 일반적으로 헤더 파일에 있는 함수를 정의할 때 이용한다.

 

[C++] 인라인 함수란? 장단점 (tistory.com)

 

[C++] 인라인 함수란? 장단점

※요약인라인 함수는 프로그램의 실행 속도를 높이기 위해 추가된 기능이며 C언어의 매크로 함수와 비교된다. (개발자 입장에서)일반 함수와 인라인 함수의 가장 큰 차이점은 함수의 호출 방식

placeforjake.tistory.com

 

 

예제) 인라인 함수 사용

#include <iostream>
#include <chrono>

#include "night.hpp"

int main() {
  
  // Measure time taken for goodnight1():
  std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now();

  std::cout << goodnight1("tulip");
  
  std::chrono::high_resolution_clock::time_point end = std::chrono::high_resolution_clock::now();
  std::chrono::duration<double, std::milli> time_span = end - start;

  // Print time taken for goodnight1():
  std::cout << "Time taken for goodnight1(): " << time_span.count() << " milliseconds.\n\n";
  
  
  std::cout << goodnight2("eraser", "ivy");
  
}

chrono는 밀리 초 단위로 시간을 클럭 할 수 있는 라이브러리이다.

 

인라인 함수를 사용하는 경우 프로그램의 실행 속도에 어떤 영향을 미치는지 테스트 해보았다. 평소 함수를 정의하고 호출하는 경우 해당 코드에서 함수의 위치로 이동했다가 수행 후 다시 돌아오는데, 인라인 함수를 이용하면 컴파일된 함수가 코드 안에서 이용된다. 그렇기 때문에 속도면에서 조금 더 유리하다.

 

실행 결과

 

 

이후 night.cpp에 있던 goodnight1함수를 night.hpp에서 인라인 함수로 정의해주었고 실행 시간은 다음과 같다.

 

인라인 함수 사용은 함수 코드를 수행하는 시간이랑 호출 과정을 처리하는데 걸리는 시간과 비교하여 호출되는 시간이 더 걸릴 때 사용하는 것이 유리하다.

 

 

 

 

  • Argument (인수)

- 인수는 함수가 정의되고 선언될 때 파라미터에 할당되는 값이다. 함수 호출에서 인수를 사용하지 않으면 기본값으로 실행되지만 인수가 있는 경우 해당 인수가 기본 인수를 대체한다.

 

 

 

예제) 인수에 기본값 부여하기

- 블랙커피가 디폴트이며 우유와 설탕이 들어있지 않다. 매번 입력해주기 힘드므로 인수에 기본값으로 넣어주자.

main.cpp

 

coffee.hpp

 

coffee.cpp

 

 

 

 

  • 오버로드

- 오버로드를 사용하면 인수로 전달되는 항목에 다라 함수가 동작하는 방식을 변경할 수 있다. 동일한 이름의 함수로 서로 다른 형식, 개수의 매개 변수를 이용할 수 있다.

 

 

 

 

 

 

예제) 함수 오버로드

main.cpp

 

num_ops.hpp

 

num_ops.cpp

 

 

 

 

  • 템플릿

- 다른 매개변수로 반복해서 함수를 재정의하는 것을 막기 위해 템플릿을 이용한다.(적은 코드로 둘 이상의 함수를 만들 수 있다) 클래스와 함수 템플릿이 있다.

- 일반 함수와 달리 템플릿은 헤더 파일에서 생성한다.

- 템플릿을 사용하면 함수를 호출할 때 여러 형식 구현을 선택할 수 있다. 형식은 반환 형식, 매개변수 형식이 있다.

 

 

예시) 매개변수가 유연한 템플릿

int, char, std::string, double 다 가능하다.

 

 

- 템플릿을 사용하면 프로그램의 컴파일 시간은 느려지지만 실행 시간은 빨라진다.

 

 

 

예제1) get_smallest()함수는 다양한 형식을 반환한다. 함수 템플릿을 사용해라.

 

템플릿 사용

numbers.cpp는 사용하지 않는다.

 

 

템플릿 사용 전 numbers.hpp, numbers.cpp는 다음과 같다.

numbers.hpp

 

numbers.cpp

 

'C, C++ > codecademy' 카테고리의 다른 글

참조와 포인터  (0) 2023.03.16
클래스와 객체  (0) 2023.03.01
함수  (0) 2023.02.26
vector  (0) 2023.02.21
에러  (0) 2023.02.21