오버로딩에 해당하는 글 1

[아두이노] 함수 오버로딩

카테고리 없음|2019. 7. 4. 09:00

[아두이노] 함수 오버로딩




오늘은 프로그램 코딩에서 자주 사용하는 함수 오버로딩에 대해서 간단히 살펴보도록 합시다.


1. 함수 오버로딩


함수 오버로딩이란 함수명은 같으나 함수안에 있는 인자가 서로 다른 자료형 값들을 가지고 있는 형태의 함수를 말합니다. 어떤 공통된 동작을 수행하지만 내부적으로 서로 다른 처리를 할 때 주로 사용하지요. 참고로, C언어에서는 함수 오버로딩을 허용하지 않지만 C++에서는 함수 오버로딩을 허용합니다. 아두이노 IDE에서는 허용이 되고 동일한 이름으로 서로 다른 동작을 수행할 수 있습니다.

이제는 함수 오버로딩을 언제 사용하는지 살펴 보도록 하죠. 가령 덧셈의 경우을 생각해 볼까요.

예) 두 수를 더하시오.

=> a+b 가 됩니다.

total = add(a,b);

이때, a,b은 둘 다 정수 일 수 있고, 둘 다 실수 일수도 있으며 어느 하나만 정수이거나 실수 일 수 있습니다. C언어 프로그램에서는 변수에 대한 자료형을 명확하게 표현해 줘야 합니다.

int add(int a, int b){
  return a+b;
}

이렇게 표현하면 a,b은 정수로 무조건 정의되어 있기 때문에 무조건 정수값이 되어야 합니다. 하지만 우리가 두 수를 더할 경우에 무조건 정수만 존재하는 것이 아니기 입력 자료형 수에 맞는 별도의 함수가 필요합니다.

그러면,

int add_Int(int a, int b)
double add_Double(double a, double b)
double add_Int_Double(int a, double b)
double add_Double_Int(double a, int b)

이렇게 일일히 함수을 개별적으로 표현해야 할까요. 자료형만 다르지 덧셈이란 동작은 같기 때문에 구지 이렇게 표현할 필요는 없습니다. 즉, 함수 오버로딩으로 표현하면 함수명은 같고 인자만 다르게 표현해주면 코딩하는 프로그래머의 입장에서는 가독성 있게 코딩을 할 수 있게 됩니다.

int add(int a, int b)
double add(double a, double b)
double add(int a, double b)
double add(double a, int b)

선언되어 있다면,

t1 = add(1, 2);
t2 = add(1,2, 2.2);
t3 = add(1, 1,2);
t4 = add(1,2, 2);

이렇게 add()함수라는 이름으로 정의해 놓고 인자만 다르게 정의해 놓으면 해당 인자에 맞는 함수가 호출되어 해당 함수를 수행하게 됩니다. 즉, 덧셈을 한다는 동작은 변함이 없고 알아서 자료형 인자에 맞는 함수가 호출되어 명령을 수행하게 됩니다.

2. 아두이노에서 함수 오버로딩 예


최근에 배운 키보드/마우스 라이브러리 예제로 살펴볼까요.

키보드 라이브러리 오버로딩 함수

size_t write(uint8_t k);
size_t write(const uint8_t *buffer, size_t size);

마우스 라이브러리 오버로딩 함수

Mouse.click();
Mouse.click(button);
Mouse.press();
Mouse.press(button)
Mouse.release();
Mouse.release(button);
Mouse.isPressed();
Mouse.isPressed(button);

다른 아두이노 라이브러리 함수를 살펴보셔도 됩니다. 이렇게 인자의 자료형 값이 다르면 인자 자료혀엥 맞는 해당 함수가 호출됩니다.

위 예에서 자세히 보시면

Mouse.press();
Mouse.press(button);

button - MOUSE_LEFT (default), MOUSE_RIGHT, MOUSE_MIDDLE

마우스 키를 누를 때 인자가 없으면

Mouse.press();

이 함수가 호출되고 디폴트 MOUSE_LEFT 동작을 수행합니다.

하지만,

Mouse.press(MOUSE_MIDDLE);

이렇게 인자값이 존재하면 한개의 인자값을 가지고 있는 Mouse.press(button) 함수가 호출되고 인자값에 해당되는 가운데 버턴을 누른 이벤트가 수행됩니다.

쉽게 말해서, 같은 이름으로 된 함수이지만 해당 자료형 인자값에 따라서 해당 함수가 호출되어 동작을 수행할 수 있게 함수명을 통일해서 표현하는 것이 함수 오버로딩이라는 점만 기억 해 주세요.

3. 함수 오버로딩 실험


간단히 개콘에서 했던 "아무말 대잔치" 처럼 그냥 의미없는 서로 다른 동작을 아두이노에서 하나의 함수명으로 처리하는 실험을 해 보겠습니다.

1) 코딩


void setup()
{
  Serial.begin(9600);  

  //오버로딩 함수
  Serial.println(output());
  Serial.println(output(10));
  Serial.println(output(10.12));
  Serial.println(output(10,20));

}

void loop()
{

}

int output(){
  return 100;
}
int output(int a){
  return a+10;
}

double output(double a){
  return a+3.12;
}

int output(int a, int b){
  return a+b;
}

총 4개의 함수를 하나의 output()함수명으로 오버로딩 시켰습니다. 인자가 없을 때, 인자가 하나지만 서로 다를 때, 인자가 두개일 때의 동작 명령을 만들어서 한번 오버로딩 된 함수에 인자값을 넣어서 실행 해 볼까요.

2) 결과


  • 인자가 없을 때 100 반환
  • 인자가 정수형일 때 인자값+10 반환
  • 인자가 실수형일 때 인자값+3.12 반환
  • 인자가 2개의 정수형일 때 인자a+인자b 반환

그 결과는 아래와 같습니다.


마무리


함수 오버로딩을 사용 하는 경우는 딱 하나만 기억하시면 됩니다. 어떤 기본 동작 수행을 하는데 그 동작 수행시 필요한 인자의 수가 다르거나 또는 인자의 자료형이 달라 질 때 함수명을 달라진 이름으로 개별적으로 일일히 만드는 것이 하니라 묶음으로 하나의 공통 이름으로 공유하고 서로다른 인자의 값에 따라 표현한 해당 함수가 호출되어 동작을 수행하도록 할 수 있다는 점만 기억해 주세요.

댓글()