brunch

You can make anything
by writing

C.S.Lewis

by 스캇아빠 May 16. 2024

함수?

속을 알 수 없는 기계장치

0. 프로그래밍 책을 만들어 보고 싶은 이유

캐나다에 이민 와서 생긴 소중한 친구가 한 명 있다. 베쓰는 초등학교 선생님이다. 홍콩에서 오랫동안 일했었고, 홍콩에 있는 학교에서 일하다가 남편 맷을 만나 뉴브런즈윅에 이사와 살았었다. 항상 친절한 베쓰는 내 어리숙한 영어에 대해 한 번도 불평하지 않았다. 오히려 자기는 한국말을 하지 못하는데, 내가 영어를 이용해서 자기와 이야기하려 하는 것에 고마워하기까지 했다. 기쁜 일이 있으면 나보다 더 기뻐해주고, 슬픈 일에는 같이 울어주고, 혹시라도 억울한 일이 있으면 나보다 더더욱 화를 내고 바로 잡으려 도와주는 고마운 친구다. 지금은 홍콩으로 돌아가서 선생님을 계속하고 있지만, 언젠가 다시 만나 수다를 떨 수 있는 시간이 올 거라 믿고 있다.


그런 베쓰가 내게 컴퓨터 프로그래밍은 어떤 일이기에 그렇게 페이가 센지 물어본 적이 있었다. 내가 내 연봉을 이야기했을 때, "너희 회사는 아무래도 마약을 파는 게 아닐까?"라고 농담을 하기도 했으니까 말이다. 선생님들이 받는 월급을 봤을 때나, 어떤 직업을 봐도, 컴퓨터프로그래머만큼 받는 직업을 찾기가 힘들다. 그것도 캐나다에서 일하는 사람들의 월급이 미국에서 일하는 사람들의 월급의 절반정도밖에 되지 않음에도 말이다.


내가 베쓰나 다른 선생님들이나 다른 간호사 선생님들보다 월급이 많다는 사실은 사실 조금 창피하다. 그들보다 많은 공부를 한 적도 없고, 그들보다 더 성실히 일하지도 않고, 그들보다 훨씬 더 쉬운 일을 하고 있다고 생각하기 때문이다.


그래서 나는 언젠가 기회가 된다면, 재능이 있는 분들이 있다면, 그들의 공부를 도와, 조금 윤택한 삶을 사는데 도움이 되고 싶었다. 그게 내가 프로그래밍 책을 써보고 싶은 이유였다.


이 브런치북이 정확히 그런 이유로 쓰여지고 있는건 아니지만, 그럼에도 지금까지는 매우 실패하고 있다. 제발 이번 편에서는 다시 내가 하는 일을 우습게 보면서, 다시 "컴퓨터프로그래머 별거 없는데"라는 생각을 가졌으면 한다.


1. 함수의 개념

함수란, 속을 알 수 없는 기계장치와 같다. 손바닥 만한 나무를 넣고 다시 열면 주사위가 만들어져서 나올 때도 있고, 사람을 넣었다가 문을 열면 닭강정이 나오는 그런 기계장치와 같다. 그래서 프로그래밍이란 결국 큰 함수와 같다. 하지만, 함수는 한 개로 존재하는 것이 아니고, 여러 개가 존재해서, 각 함수는 함수를 이용한다.


예를 들어서 나무를 넣으면 주사위를 만드는 기계장치라고 생각해 보자. 그리고 이름을 "나무to주사위" 라고 부르자. 그러면 나무to주사위 함수는 제일 먼저 나무를 세척하려고 할 것이다. (나는 안 씻어도 나무는 씻는다). 그러면 "나무to주사위"는 "나무씻기장치" 기계장치를 이용하면서 방금 전달받은 나무를 넣을 것이고 다시 문을 열었을 때 "나무씻기장치"는 깨끗한 나무를 돌려준다. 그리고 "작게자르기" 기계장치, "정육면체로만들기" 기계장치, "면에글자쓰기" 기계장치를 순서대로 부를 것이다.


이걸 표로 써보면 (브런치스토리에는 표 쓰는 기능이 없다)

순서,들어가는것,기계장치,돌려주는것

1.나무,나무씻기장치,깨끗한_나무(나무2)

2.나무2,작게자르기,깨끗하고_작은_나무(나무3)

3.나무3,정윤면체로만들기,깨끗하고_작으면서_정윤면체_나무(나무4)

4.나무4,면에글자쓰기,주사위


이렇게 된다. 그리고 1~4까지 하는 행위를 하나의 기계장치로 만들어 "나무to주사위" 라는 기계장치로 만든다. 그리고 우리는 그 기계장치를 함수라고 부른다.


2. 함수의 입력값, 출력값

한국사람이라면 입력과 출력이란 단어는 들어봤겠지. 그렇다. 프로그래밍 세계에서는 기계장치(함수)에 넣는 행위를 입력이라고 하고, 기계장치에서 돌려받는 것을 출력이라고 한다.(이 정도면 따라올 수 있겠지? bro?) 보통 입력값은 여러 개가 가능하고, 출력값은 한 개만 존재한다.


그럼, 입력값은 왜 여러 개가 필요할까? 그건 입력값은 때로 출력값의 재료이기도 하지만, 기계가 하는 일을 가이드해주기도 역할을 하기도 하기 때문이다. 예를 들어 위의 함수 "면에 글자 쓰기" 같은 함수는 "나무"라는 재료에 글자를 쓰는 일을 하지만, 정확히 어떤 글자를 써야 하는지 모른다. 그래서 "1부터6"이라는 입력값이 더 필요하다. 아니면 때로는 "면에 글자쓰기" 라는 함수를 6번 부를 수도 있다.


함수 : 면에 글자 쓰기

입력값 : "나무4", "윗면" , "1"

출력 : "윗면에 1이 쓰인 깨끗하고 작은 정육면체 나무"


이렇게 말이다. 또 다른 "작게 자르기"는 정확히 얼마나 작게인지 알 수 없다. "나무씻기"에서는 몇 번을 씻어야 할지, 어떤 비누를 써야 할지, (이건 어떠니, 또 저건 어떠니, 고민 고민 하지 마 Girl~ Gril~ U-Go-Girl...; 그래 지금 새벽 2시다. 졸려 죽겠는데 쓰는 거다) 같은 것들 말이다. 물론 기계가 알아서 할 수도 있다. 하지만, 그걸 입력값으로 받는 이유가 있다. 그건 바로....


3. 함수의 재활용

함수를 여러 개 만드는 데는 한 함수를 너무 길게 쓰지 않게 하는 이유도 있지만 -함수가 너무 길면 읽기 힘들어지고, 읽기 힘들면 문제가 발생하기 쉽고, 문제가 발생하기 쉬울 뿐만 아니라 문제 찾기도 힘들다- 함수를 재사용할 수 있기 때문이다. 위에서 "면에 글자 쓰기" 같은 경우는 주사위뿐만 아니라, 마작을 만들 때도 쓸 수 있고, 잘하면 카드를 만들 때도 쓸 수 있고, 편지를 쓸데도 쓸 수 있을 거다. (잘 만든 함수 하나 열아들 안 부럽다.)


4. 심오

- 출력값은 보통 한 개지만, 2개 이상 리턴하는 파이썬도 있다고 할 수 있겠지만 그것도 결국 Tuple 이란 한 개의 데이터 한 개 아니더냐

- 출력값은 보통 한 개만 리턴 하지만, 포인터를 이용하면 여러 개를 리턴할 수 있는 거 아니냐라고 할 수 있다.

- 함수도 결국 하나의 데이터가 될 수 있다. C언어에서는 함수 포인터가 있고, Clojure 에서는 함수도 정말로 데이터처럼 쓰인다.

- 컴퓨터 언어에서 스페이스는 보통 다른 객체(함수,변수,기호등등)를 나타내기 위해 이용된다. 그래서 함수는 띄어쓰기 없이 이어서 쓰고 뜻을 살리기 위해서 아래와 같은 것을 이용한다.

snake_case : _ 로 띄어쓰기 하기

kebab-case : - 로 띄어쓰기 하기

camelCase : 소문자, 대문자로 구분하기

PascalCase : 카멜케이스와 비슷하지만 첫 글자를 대문자로 쓰기

각 언어마다 또는 각 회사마다 쓰는 방법이 다르기에, 회사 가면 다른 사람이 쓰는거 따라서 쓰자, 괜히 다른것 쓰다가 욕만먹는다.





이전 02화 만약과 도돌이표
brunch book
$magazine.title

현재 글은 이 브런치북에
소속되어 있습니다.

작품 선택

키워드 선택 0 / 3 0

댓글여부

afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari