개발철학&개발용어

함수와 클래스는 왜 탄생했을까 - 반복이 귀찮았던 함수, 현실이 복잡했던 클래스

함수와 클래스는 왜 탄생했을까 - 반복이 귀찮았던 함수, 현실이 복잡했던 클래스

 

"함수랑 클래스가 뭐가 다른 거예요?" "클래스는 대체 언제 써요?" "함수만으로도 잘 돌아가던데 왜 굳이 클래스를 배워야 하죠?" 프로그래밍을 배우다 보면 함수(Function)와 클래스(Class) 앞에서 누구나 한 번쯤 이런 질문을 하게 됩니다.

저는 2012년에 개발을 시작해 지금까지 13년째 이 바닥에 있는데요, 신입 때는 저도 이 둘의 차이를 그냥 외우려고만 했습니다. 그런데 어느 순간 깨달았어요. 함수와 클래스는 암기할 문법이 아니라, 앞선 개발자들이 겪은 두 가지 고통에서 나온 발명품이라는 걸요. 하나는 "똑같은 코드 또 쓰기 귀찮다"는 고통이고, 다른 하나는 "현실은 너무 복잡하다"는 고통입니다.

이 글에서는 함수와 클래스가 도대체 왜 생겨났는지, 그 배경을 어렵지 않게 풀어보려 합니다. 프로그래밍을 이제 막 시작한 분, 아니면 몇 년 써왔지만 "이걸 왜 쓰는지"는 한 번도 생각 안 해본 분께 특히 도움이 될 거예요.

📋 목차

  1. 함수(Function)는 왜 생겼을까 - 똑같은 코드 또 쓰기 싫어서
  2. 클래스(Class)는 왜 생겼을까 - 현실이 너무 복잡해서
  3. 붕어빵 틀과 붕어빵 - 클래스와 객체
  4. 제가 클래스를 쓰는 진짜 이유는 '이름 짓기'
  5. 함수형 vs 객체지향, 지금은 골라 씁니다

1. 함수(Function)는 왜 생겼을까 - 똑같은 코드 또 쓰기 싫어서

함수가 태어난 이유를 한마디로 하면 효율성입니다. 사실 함수라는 개념 자체는 컴퓨터보다 훨씬 오래됐어요. 17세기 수학자 라이프니츠가 "입력값을 넣으면 특정 처리를 거쳐 출력값이 나오는 것"을 함수라고 부른 게 그 뿌리입니다. 입력 → 처리 → 출력, 이 그림은 지금 우리가 쓰는 함수랑 똑같죠.

다만 프로그래밍에서의 함수는 수학에서 곧바로 넘어온 게 아니라, 서브루틴(subroutine)이라는 물건에서 왔습니다. 1950년대 초, 초기 개발자들은 자주 쓰는 계산 코드를 프로그램마다 처음부터 다시 짜야 하는 상황에 지쳐 있었어요. 그래서 자주 쓰는 코드 묶음에 이름을 붙여두고, 필요할 때 그 이름만 불러 쓰자는 아이디어가 나왔습니다. 이게 서브루틴이고, 오늘날 함수의 직접적인 조상입니다.

 

 

📌 함수의 핵심


자주 쓰는 코드를 하나로 묶어 이름을 붙이고(모듈화),

필요할 때마다 이름만 불러 재사용한다. 단순 반복 노동이 사라지고,

한 군데만 고치면 되니 유지보수도 편해진다.

 

 

제가 이걸 몸으로 체감한 건 2012년 신입 때였습니다. 그때는 jQuery와 Ajax가 한창이던 시절이라, 화면마다 폼 검증 코드나 Ajax 호출 코드를 그냥 복사해서 붙여 넣곤 했어요. 문제는 나중에 검증 규칙 하나가 바뀌면, 그 코드가 흩어져 있는 열댓 군데를 일일이 찾아다니며 고쳐야 했다는 겁니다. 한 곳 고치면 다른 곳이 터지고요. 그러다 반복되는 부분을 함수로 묶기 시작하면서야 좀 살 만해졌습니다. 부끄럽지만 그전까지는 함수를 "왜" 쓰는지 감이 별로 없었어요.

2. 클래스(Class)는 왜 생겼을까 - 현실이 너무 복잡해서

클래스가 태어난 이유는 복잡성 관리입니다. 소프트웨어 규모가 커지면서, 단순히 숫자를 계산하는 걸 넘어 현실 세계의 사물을 코드 안으로 옮겨야 하는 상황이 왔거든요.

1960년대 노르웨이 컴퓨팅 센터에서 크리스텐 뉘고르와 올레-요한 달이 복잡한 시스템을 컴퓨터로 시뮬레이션하는 일을 하고 있었습니다. 흔히 "선박 시뮬레이션에서 시작됐다"고 알려져 있는데, 정확히는 대기행렬 같은 복잡한 현실 시스템 전반을 다루던 중이었어요. 이때 이들을 괴롭힌 게 데이터와 행동이 따로 논다는 문제였습니다. 예를 들어 어떤 대상의 '속도, 무게' 같은 데이터와 '움직인다' 같은 행동이 코드에서 뿔뿔이 흩어져 있으니 관리가 너무 힘들었던 거죠.

그래서 두 사람은 데이터와 행동을 하나로 묶자는 아이디어를 냅니다. 대상의 '설계도'를 먼저 만들고, 그 설계도로 실제 개체들을 찍어내자는 거였어요. 이 설계도가 바로 클래스이고, 여기서 만들어진 언어가 Simula입니다. 객체·클래스·상속을 갖춘 이 Simula가 오늘날 객체 지향 프로그래밍(OOP)의 출발점으로 꼽힙니다.

 

 

💡 함수와 뭐가 다른가


함수가 '행동(동작)'을 묶는 도구라면,

클래스는 '데이터 + 행동'을 한 덩어리로 묶는 도구입니다.

흩어져 있던 정보와 기능이 하나의 개념 아래 모이는 거죠.

 

 

규모가 큰 프로젝트를 겪어보면 이 필요성이 확 와닿습니다. 저는 SI 현장을 여러 번 거쳤는데, 프로젝트가 커질수록 전역에 함수만 수십 개씩 늘어놓게 되더군요. 그러다 보면 이 데이터를 어디서 건드리는지, 이 함수가 무슨 값을 전제하고 도는지 추적이 안 됩니다. 관련된 데이터와 기능을 객체 하나로 묶고 나서야 "아, 이래서 클래스를 쓰는구나" 싶었어요.

3. 붕어빵 틀과 붕어빵 - 클래스와 객체

클래스를 처음 배울 때 가장 잘 먹히는 비유가 붕어빵입니다. 저도 후배들에게 설명할 때 늘 이걸 씁니다.

 

 

클래스(Class)는 붕어빵 기계, 즉 틀입니다.

그 자체로는 먹을 수 없어요. 붕어빵을 찍어내는 설계도일 뿐이죠.

반면 객체(Object)는 그 틀로 실제로 구워낸 붕어빵입니다.

팥 붕어빵, 슈크림 붕어빵처럼 진짜로 존재하는 것들이고요.

 

 

함수만 있던 시절엔 팥이면 팥, 밀가루면 밀가루를 따로따로 관리해야 했다면, 클래스 덕분에 우리는 '붕어빵'이라는 완성된 하나의 개념으로 코드를 다룰 수 있게 됐습니다. 틀 하나 잘 만들어두면 붕어빵은 얼마든지 찍어낼 수 있고요.

4. 제가 클래스를 쓰는 진짜 이유는 '이름 짓기'

여기서부터는 교과서 얘기가 아니라 순전히 제 실무 감각입니다. 솔직히 말하면, 저는 "복잡성 관리"라는 거창한 이유보다 이름 짓기가 편해서 클래스를 쓸 때가 훨씬 많습니다.

전역에 함수만 늘어놓다 보면 이름 짓기가 은근히 고역이거든요. 사용자 이름을 가져오는 함수, 상품 이름을 가져오는 함수, 주문 이름을 가져오는 함수를 다 만들려면 getUserName, getProductName, getOrderName처럼 겹치지 않게 이름을 계속 짜내야 합니다. 그런데 클래스로 묶으면 User 안에 getName, Product 안에 getName을 각각 둘 수 있어요. 같은 getName이라는 이름을 여러 클래스에서 재사용할 수 있게 되는 거죠. 이름 충돌 걱정이 확 줄어듭니다.

개발자들 사이에 "클래스는 사실 이름 짓기 싫어서 생긴 거다"라는 우스갯소리가 있습니다. 앞서 봤듯이 역사적으로 클래스가 그 이유로 태어난 건 아니지만, 매일 코드를 짜는 입장에선 이 말에 은근히 고개가 끄덕여져요. 실제로 클래스가 일종의 이름 공간(namespace) 역할을 해주니까요. 이런 건 문법책엔 잘 안 나오지만, 몸으로 쓰다 보면 자연스럽게 알게 되는 부분입니다.

5. 함수형 vs 객체지향, 지금은 골라 씁니다

그럼 지금(2026년) 현업에서는 어느 쪽을 쓸까요. 답은 "상황 따라 둘 다"입니다. 이 두 개념의 성격을 정리하면 이렇습니다.

반응형
구분 함수(Function) 클래스(Class)
탄생 목적 중복 제거, 효율성 복잡성 관리, 구조화
성격 행동(Action), 동사에 가까움 사물(Object), 명사에 가까움
주로 쓰는 곳 데이터 처리 중심 (예: React의 함수형 스타일) 대규모 시스템 (예: Java, C++)

요즘은 프론트엔드에서 React처럼 함수형 스타일이 크게 자리 잡았고, 백엔드의 큰 시스템에서는 여전히 객체지향이 든든하게 버팁니다. 예전엔 "함수형이 정답이다", "객체지향이 정답이다" 하는 식의 논쟁도 많았는데, 오래 해보니 그런 게 아니더라고요. 데이터를 이리저리 가공하는 흐름이 중요하면 함수 쪽으로, 현실의 무언가를 코드로 모델링해야 하면 클래스 쪽으로 기웁니다. 물론 이것도 시대와 스택에 따라 또 바뀔 수 있는 이야기라, 지금 시점의 제 감각 정도로 봐주시면 좋겠습니다.

자주 묻는 질문

Q. 함수와 클래스, 초보자는 뭐부터 익혀야 하나요?
함수를 먼저 손에 익히시길 권합니다. 코드를 묶고 재사용하는 감각을 먼저 잡은 뒤에 클래스로 넘어가면, 클래스가 왜 필요한지가 훨씬 자연스럽게 이해됩니다.

Q. 함수만으로도 프로그램이 잘 돌아가는데, 클래스를 꼭 써야 하나요?
작은 프로그램이라면 함수만으로도 충분합니다. 다만 규모가 커지고 다뤄야 할 데이터와 기능이 얽히기 시작하면, 클래스로 묶는 편이 관리가 훨씬 수월해집니다.

Q. 함수와 클래스의 가장 큰 차이가 뭔가요?
함수는 '행동'만 묶고, 클래스는 '데이터 + 행동'을 함께 묶는다는 점입니다. 이 한 가지만 기억해도 둘을 구분하기 쉬워집니다.

마무리

함수와 클래스는 그냥 외워야 할 문법이 아니라, 앞선 개발자들이 겪은 불편을 해결하려고 만들어진 도구입니다. 반복이 귀찮아서 함수가 나왔고, 현실이 너무 복잡해서 클래스가 나왔죠. 이 두 무기가 왜 태어났는지 알고 나면, 코딩이 단순한 암기가 아니라 "이 상황엔 뭘 쓰는 게 자연스러울까"를 고민하는 일로 바뀝니다. 저도 신입 때 이걸 알았더라면 헤매는 시간을 꽤 줄였을 것 같네요.

🎲 개발은전투다 블로그 추천 세트

 

MVP(최소 기능 제품) 뜻 완벽 정리: 완벽한 개발을 포기해야 대박나는 이유

비즈니스 세계에서 완벽주의는 때로 가장 큰 독이 되며 이를 해결하기 위한 핵심 전략이 바로 MVP(최소 기능 제품)입니다. 많은 창업자와 개발자가 완벽한 서비스를 출시하려다 시장의 외면을 받

devwar.tistory.com

 

APM(애플리케이션 성능 관리/모니터링) 핵심 정리: 툭하면 터지던 서버를 살려낸 개발 철학의 역

현대 소프트웨어 개발 환경에서 APM(애플리케이션 성능 관리)은 단순한 선택을 넘어 기업의 생존을 결정짓는 핵심 도구로 자리 잡았습니다.과거에는 서버가 다운되거나 서비스가 지연되면 원인

devwar.tistory.com

 

MVVM 패턴, 왜 다들 쓸까? 복잡한 UI와 비즈니스 로직을 분리하는 완벽한 아키텍처

현대의 프론트엔드와 모바일 애플리케이션 개발에서 UI와 비즈니스 로직의 분리는 시스템의 안정성을 좌우하는 필수적인 과제입니다. 복잡해지는 화면 상태를 효과적으로 관리하고 유지보수성

devwar.tistory.com

 

개발 실력 늘리는 법은 함수 암기가 아니었습니다 - 제가 개발 블로그를 시작한 이유

"그 함수들 다 외우면 실력 느는 거죠?""굳이 옛날 얘기까지 알아야 하나요. 쓸 줄만 알면 되잖아요.""새로 나온 기술, 그냥 쓸 줄만 알면 되는 거 아니에요?" 저도 신입 때는 똑같이 생각했습니다.

devwar.tistory.com

반응형