◇ 함수 포인터의 이해
변수만 메모리 공간에 저장되는 것이 아니다.
프로그램의 실행의 흐름을 구성하는 함수들도 바이너리 형태로 메모리 공간에 저장되어서 호출 시 실행이된다.
이렇게 메모리상에 저장된 함수의 주소 값을 저장하는 포인터 변수가 '함수 포인터 변수'이다.
배열의 이름이 배열의 시작 주소값을 의미하듯, 함수의 이름도 함수가 저장된 메모리 공간의 주소값을 의미한다.
이러한 함수의 주소 값 저장을 위한 포인터 변수를 별도로 선언할 수 있으며, 이러한 용도로 선언된 포인터 변수를 가리켜 '함수 포인터 변수'라 한다.
◇ 함수 포인터 변수의 선언
함수
int SimpleFunc(int num) { . . . . }
위 함수의 반환형과 매개변수 선언은 각각 다음과 같다.
· 반환형 int
· 매개변수 선언 int num
함수 포인터 형(type)은 반환형과 매개변수의 선언형태를 기준으로 구분하기로 한다.
예로
int SoSimple(int num1, int num2) { . . . . }
이 함수의 주소값 저장을 위한 함수 포인터 변수는 다음과 같이 선언하게 된다.
int (*fptr) (int, int);
그후 함수 SoSimple의 주소값을 저장하려면 다음과 같은 대입연산을 하면된다.
fptr = SoSimple;
함수 포인터를 이용해
함수를 호출하려면
저장된 함수값을 토대로
fptr(3, 4); //SoSimple(3, 4)와 동일한 결과를 보임
위와 같은 형태로 호출하면된다.
◇ 함수 포인터 변수의 활용
실 예제를 통해
함수 포인터가 적절히 사용되는 것을 확인하여 보자.
◇ 함수 포인터와 객체지향 프로그래밍
'함수 포인터'를 문법적으로만 보지말고
어느 상황에서 사용하는 것이 적절한 사용이 될까라는 의문에서
추가적으로 기술한다.
위 설명은 단순한 개념과 예제를 보였다면
하나 더 중요한것을 명시하고자 한다.
필자는 선배 개발자에게 예전에 이와같은 말을 들은적이 있다.
'C 프로그래밍을 잘하는 사람은 C를 마치 객체지향처럼 짜내는 개발자이다.'
'절차지향'을 기반으로 한 C언어로 '객체지향'이라니
뜬구름 잡는 소리에 의문이 들 수 있으나,
배웠던 함수 포인터를 기반으로 C언어를 마치 '객체지향'처럼 활용할 수 있게 된다.
객체지향의 대표인 JAVA를 생각해보자.
Class 안에 필드(변수)와 메소드(함수)가 들어가 있고 클래스를 기반으로 인스턴스를 생성하면,
인스턴스 하나하나가 개별적으로 존재할 수 있다는 사실을 알수있다.
C언어에서도 그와 비슷한 문법이 존재한다.
바로 '구조체'라고 불리는 것이다.
구조체(struct)를 간략하게 소개하면 일종의 사용자 정의 자료형으로, 개발자 본인이 자기가 원하는 구조의 데이터를 만들고자
할 때 유용하게 여러개의 변수(자료형이 달라도)를 묶어놓을 수 있도록 한 문법이다.
성적을 관리하는 프로그램을 만든다고 하면
우리는 학생의 이름과 성적등을 효율적으로 관리하기 위해
필요한 데이터형들을 한 장소에 몰아넣게 되고 새로운 형을 정의할 수 있다.
실제 문법적인 요소를 통해 확인해보면
자료형에 데이터에는 세부적으로
학생의 이름이 있을수 있고, 국어,영어,수학 점수들이 있고, 평균점수를 저장하도록 하자.
다음과 같이 선언하면 된다.
허나 이에 아쉬운점이 한가지 있다.
그것은 바로 오로지 필드(변수)만을 저장한다는 것이다.
추가적으로 학생의 시험정보로 할수 있는 일 (함수)
더욱이 효율적으로 프로그래밍이 가능할 것같다.
이는 다시 말하면 필드만을 저장하는 C의 '구조체'에서는 하나의 큰 아쉬운점이 된다.
하지만 함수에 관한 필드
위에 배웠던 내용을 토대로 '함수 포인터'를 이용해 특정 함수까지 저장하게 된다면
이를 통해 절자치향 언어인 C의 한계를 극복할 수 있는 하나의 해결책이 된다.
위 내용을 토대로 결론을 내면
'함수 포인터'를 이용하여 절차지향 언어 C의 단점을 극복할 수 있도록 사용할 수 있다.
'IT > C' 카테고리의 다른 글
메모리의 동적 할당 (0) | 2017.10.21 |
---|---|
두 가지 형태의 문자열 표현 (0) | 2017.10.21 |