brunch

매거진 Sinclair

You can make anything
by writing

C.S.Lewis

by Sinclair Feb 11. 2016

함수와 함수의 활용

그는 나에게로 와서 꽃이 되었다 I




C프로그램은 함수로 시작해서 함수로 끝납니다.

다시 한번 말합니다. C프로그램은 함수로 시작해서 함수로 끝납니다.


특히 실행 프로그램이라면 반드시 main()함수를 하나 가져야 합니다. 거의 모든 OS가 프로그램을 실행 할 때 반드시 main()함수를 부르기 때문입니다. main()함수가 없거나 두 개의 main()함수가 있다면 실행 프로그램을 만들어 내는 컴파일의 link과정에서 에러가 발생합니다. 


지난 글까지 우리는 몇 가지 함수를 사용해보기도 하고 또한 실제 함수를 만들어 보기도 했습니다. 우리가 실제로 프로젝트를 진행하다 보면 가장 고민이 되는 것들 중 하나가 함수를 어떻게 나누느냐의 문제입니다.

정답은 적절히 나누라는 것 입니다. 적당히, 과유불급(過猶不及)의 의미를 터득하라는 것입니다.


너무 작게 나누면 잦은 함수의 호출로 프로그램의 실행 속도가 느려집니다. 함수는 불러야 의미가 있고 함수를 부르는 데는 대가를 치러야 합니다. There is no more free lunch.


함수를 너무 크게 나누면 함수로서의 가치가 떨어집니다. 함수는 다른 작업에서 재 사용되어야 가치가 있지 않겠습니까? 그런데 너무 많은 작업을 포함하면 한 번 사용하고 두 번 다시 부를 수 없게 됩니다.


왜 매번 프로젝트를 진행할 때 마다 비슷한 삽질을 계속 해야 합니까?

왜 우리의 프로그래밍 인생은 Copy & Paste로 쭈욱 도배되어 있습니까? 우울하지 않습니까? 진정한 고수라면, 진정한 프로그래머라면 눈 앞에 있는 것만 보고 있지는 않을 것 입니다. 부디 눈을 들어 멀리 바라 보길 바랍니다. 프로젝트가 끝나면 자신만의 라이브러리 함수가 늘어야 하지 않겠습니까? 왜 매번 우리는 새로운 프로젝트 또는 과제를 앞두고 소스를 찾아 인터넷 바다를 헤매야 합니까? 가슴이 많이 아프죠? 그런데 이제는 그럴 수도 없습니다. 바로 여러분이 세계 최초여야 하기 때문입니다. 대한민국의 IT, 통신 기술의 발전을 보면 놀랍지 않습니까? 이제는 뭐 한가지 했다 하면 죄다 거의 세계 최초입니다. 이런 엄청난 일들을 감당해야 할 분들이 어디 가서 소스를 베껴옵니까? 소스가 어디에 있기나 하겠습니까? 정신 바짝 차려야 합니다. 전 세계가 우리를 지켜보고 있습니다. 우리가 먼저 간 길을 따라 올 겁니다. 그러니 제대로 가야 합니다.

 

함수를 過猶不及(과유불급) 하도록 나누려면 자꾸 프로그램을 짜면서 감을 익히는 수 밖에는 없습니다. 삶에는 정답이 없듯이 함수를 나누는 일에도 정답은 없습니다. 이번에는 정답이었던 것이 다음에도 다시 정답이 된다는 보장을 못합니다. 그렇게 때문에 평소에 많은 실패와 연습을 통해 익히는 것입니다.

저는 기능을 분석하고 알고리즘을 세우고 나면 공통의 기능을 적절히 묶어서 함수를 만듭니다.


함수를 만들 때 인자와 리턴 값을 정하는 일은 매우 중요 합니다. 함수 실행의 재료로서의 의미를 갖는 인자는 여러 개의 값을 가질 수 있습니다. 함수 실행의 결과로서의 의미를 갖는 리턴 값은 두 개 이상을 가질 수 없습니다. 두 개 이상의 값을 리턴 해야 한다면 어떻게 해야 할까요? 배열이나 구조체를 리턴 한다고요? 배열은 리턴 한다고 모든 값이 리턴 되지 않습니다. 구조체를 리턴 하는 일은 제대로 동작 하기는 하겠지만 구조체 변수는 일반적으로 메모리를 많이 사용하기 때문에 좋은 방법은 아닙니다.

그렇다면 어떻게 해야 할까요? 그것은 바로 인자를 활용하는 방법입니다. 리턴 값을 받아서 세팅해야 할 변수를 인자로 넣어 주는 것입니다. 값이 변해야 하겠지요? 변수의 값을 변경하려면 반드시 그 변수의 주소 값을 사용해라. 이게 Call by Value에서 우리가 함께 배운 내용 아니겠습니까?

이렇게 원래 리턴 해야 하지만 값이 여러 개여서 인자가 되어 주소 값으로 사용된 인자를 output 타입의 인자라 합니다. 반면 단순히 함수 실행 중 단순 참조의 의미를 갖는 인자를 input 타입의 인자라고 합니다.        









지난 글타래에서 우리는 onlyInt0()는 리턴 값으로 onlyInt()는 인자로 처리했었습니다. 원래 있던 리턴 값을 인자로 넘겼더니 그것 대신에 onlyInt() 함수의 종료 상태를 리턴 값으로 활용할 수 있었습니다. 두 가지 방법 중 어떤 것이 정답인지 말할 수 없습니다. 다만 프로그램의 입장에서, 그리고 개인적인 의견으로 onlyInt()가 좀 더 효율적이지 않나 생각이 듭니다. 평가와 사용은 여러분들이 선택하길 바랍니다. 지식에 경험이 쌓여야 지혜가 됩니다.








#Sinclair #씽클레어 #싱클레어 #씽클레어도씨 #씨언어 #씨프로그래밍  #C언어 #Cprogramming #C_Programming #C #Programming #Clanguage #C_Language

매거진의 이전글 함수와 함수의 활용
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari