If you're seeing this message, it means we're having trouble loading external resources on our website.

웹 필터가 올바르게 작동하지 않으면 도메인 *. kastatic.org*.kasandbox.org이 차단되어 있는지 확인하세요.

주요 내용

프로그래밍 프로젝트 계획하기

프로그래머가 된다는 것은 그저 문법을 공부하고 프로그래밍 언어의 개념을 아는 것만이 전부는 아닙니다. 지식을 어떻게 사용해서 프로그램을 만들 것인지가 중요합니다. 이 과정의 연습문제나 프로젝트를 통해 여러 프로그램을 만들어 보았겠지만, 이제는 여러분이 정말로 흥미를 느끼고 있는 분야에 대한 프로그램 아이디어를 가지고, 실제 프로그램으로 직접 만들어 보세요.
프로그램을 짜기 위해 필요한 지식이 있는데 모르고 있을 수 있지만 괜찮아요. 이는 지극히 정상입니다. 여러분이 구상한 프로그램을 실제로 만들고 싶은 만큼 새로운 지식을 더 열심히 배우려고 저절로 노력하게 될 겁니다. 다른 프로그래머들도 새로운 프로젝트를 할 때 계속 새로운 지식을 배우고 이게 우리 모두가 프로그래밍을 정말 좋아하는 이유에요.
이제 프로그래밍 프로젝트를 계획하는 과정을 알아봅시다.

1. 어떤 것을 만들고 싶은가요?

제가 처음 프로그래밍을 시작했을 때, 저는 끊임없이 새로운 프로그램을 구상하고 목록으로 정리해 두었습니다. 곧 창작에 중독되었고 더 많은 것들을 만들고 싶었습니다. 만약 여러분들도 저와 같다면, 이미 많은 아이디어를 생각해놓고 목록을 따로 정리해 놓았을 수도 있겠네요.
아직 아이디어가 없다면, 여기 여러분의 브레인스토밍을 돕기 위한 몇 가지 질문이 있습니다.
  • 어떤 게임을 좋아하나요 - 아케이드 게임, 보드게임, 스포츠 게임? 간단하게 디지털 버전을 만들 수 있나요? 다른 테마나 캐릭터를 사용해서 변화를 줄 수 있나요?
  • 좋아하는 학문 분야는 어떤 것인가요? 미술을 좋아한다면, 미술 작품을 만드는 프로그램을 만들 수 있나요? 역사를 좋아한다면, 상호 작용할 수 있는 타임라인은 어떤가요? 과학을 좋아한다면, 과학 시뮬레이션을 만들 수 있나요?
  • 가장 좋아하는 TV 쇼나 영화는 무엇인가요? 어떤 장면이나 캐릭터의 디지털 버전을 만들 수 있나요? 이를 바탕으로 게임을 만들어 보면 어떨까요?
  • 현실에서 좋아하는 물건이 있다면, 그 물건의 시뮬레이션을 만드는 것은 어떨까요?
일단 아이디어를 선택하고 나면, 그에 대한 설명을 글로 써봅시다. 예를 들어 제가 가장 좋아하는 고전 아케이드 게임인 "벽돌깨기" 를 따라서 만들어 보려고 결정했다면, 이렇게 적었을 거에요.
벽돌깨기 : 화면 하단의 막대를 움직여서 떨어지는 공을 위로 쳐 내 벽돌을 부수는 게임. 게임의 목표는 모든 벽돌을 깨는 것이고 공이 바닥에 여러번 닿게 하지 않는 것.
아이디어의 세부적인 내용은 나중에 다듬어야 할 테지만 지금으로서는 계획 과정을 계속할 충분한 아이디어가 됩니다.

2. 어떤 기술을 사용할 것인가요?

이 단계에서는, 어떤 기술(언어/라이브러리/환경)이 익숙한지, 배우기 쉬운지, 하고자 하는 일에 적절한지에 대해서 생각해 봅니다. 여러분 중 많은 분들은 "1.JS+ProcessingJS" 라는 한가지 목록밖에 없을지도 모르겠지만, 오히려 결정하기는 쉬울 것 같습니다.
JS+ProcessingJS 환경은 애니메이션, 게임, 시각화, 시뮬레이션 분야에서 매우 좋습니다. community programs 를 보면 얼마나 다양한 프로그램을 만드는지 알 수 있습니다.
이 환경은 멀티 플레이어 게임이나 모바일 앱, 데이터 크런칭 응용 프로그램 같은 경우에는 어울리지 않습니다. 만약 다른 언어나 환경(JS+HTML, Python, SCRATCH, Swift 등)을 알고 있고 ProcessingJS로 구축하는 것이 적절하지 못하다고 생각한다면, 어떤 기술이 프로그램에 어울릴지를 고민해봐야 합니다. 위와 같은 프로그램을 만들고 싶지만 다른 기술을 알 지 못한다면, 새로운 프로그램 아이디어를 알아보는 것도 좋습니다. 새로운 프로젝트를 위해 새로운 기술을 배울 수도 있지만 프로그래밍을 배우기 시작한 단계라면, 먼저 처음 배운 언어를 잘 하게 되는 것도 좋은 방법입니다.
만약 제가 벽돌깨기 같은 게임을 만들려고 한다면, 저는 제가 이미 알고 있고, 2D 게임을 만들기에 적합한 JS+ProcessingJS를 선택할 것입니다.

3. 어떤 기능들이 포함되나요?

이제 실질적인 계획을 세워야 하는데, 점점 더 재밌어질 거에요. 이 단계의 목표는 정말로 어떤것을 만들고 싶은지, 어떻게 보일지, 어떤 기능을 포함할지, 포함하지 않을지 를 결정하는 것입니다.
먼저 할 수 있는 일은 목업, 즉 "mock-ups"를 만드는 것입니다. "mock-ups"란 만들고자 하는 것에 대한 스케치로 자세한 색이나 크기에 대한 것은 중요하지 않습니다. 종이에 그릴 수도 있고, 온라인 프로그램을 사용할 수도 있습니다.
목업이 어떤 것인지 설명하기 위해서, 저의 벽돌깨기 프로그램의 목업을 아래 나타냈습니다. 각의 화면을 따로 스케치하였고 화면 간 전환을 화살표로 표시하였습니다.
벽돌깨기 복사판 목업 스케치
이제 이러한 목업을 사용하여 여러분의 프로그램이 필요로 하는 모든 기능을 목록으로 정리해보세요.
저의 벽돌깨기 복사판의 기능 목록은 각 화면별로 다음과 같이 정리했어요.
게임 화면
  • 유저가 제어하는 막대
    • 여러 색의 벽돌
  • 각이 있는 공의 움직임
  • 충돌 감지
  • 목숨 표시
  • 점수 표시
  • 음향 효과
메인 화면
  • 실행 버튼
  • 도움말 버튼
도움말 화면
  • 설명
  • 돌아가기 버튼
승리 화면
  • 제목
  • 불꽃놀이 애니메이션
패배 화면
  • 설명
  • 재 시작 버튼

4. 어떤 기능을 포함해야 하나요?

머릿속에 있는 프로그램을 만드는데 무한한 시간이 있다면, 원하는 모든 기능을 포함할 수 있습니다. 하지만 그렇지 않죠. 따라서 이번 단계에서는 어떤 기능이 가장 중요하고 어떤 기능은 시간이 남으면 할지를 결정해야 합니다. 기능을 가장 중요한 것부터 가장 덜 중요한 것까지 순서를 메기는 것도 도움이 됩니다.
각 기능의 중요도를 파악하기 위해서, 스스로 다음과 같은 질문을 해보세요.
  • 이 프로그램을 친구에게 공유할 때, 어떤 기능이 확실하게 실행되면 좋을까?
  • 어떤 기능을 만드는데 가장 흥미가 생길까?
  • 어떤 기능이 이 프로그램에서 가장 독특한 기능일까?
  • 어떤 기능을 구현할 때 가장 많이 배우게 될 까?
  • 현재 나의 기술 레벨과 너무 동떨어진 기능은 없을까?
그리고 나서, 이전 단계에서 만들었던 기능 목록을 보고, 목록을 중요도 순서대로 정렬하거나 각 기능에 순위를 매겨보세요.
벽돌깨기 게임의 기능 목록에서 기능 옆에 "P1", "P2", "P3"를 적어 놓았는데 이는 높은 우선순위(P1), 중간 우선순위(P2), 낮은 우선순위(P3)를 나타냅니다. 저는 장면 같은 일반적인 게임 기능보다 독특한 게임 역학을 더 높은 우선순위에 놓았는데 이 프로젝트에서 가장 흥미를 느낀 부분이기 때문입니다.
(P1) 게임 화면
  • (P1) 유저가 제어하는 막대
    • (P1) 여러 색의 벽돌
  • (P1) 각이 있는 공의 움직임
  • (P1) 충돌 감지
  • (P2) 목숨 표시
  • (P2) 점수 표시
  • (P3) 음향 효과
(P2) 메인 화면
  • (P2) 실행 버튼
  • (P3) 도움말 버튼
(P3) 도움말 화면
  • (P3) 설명
  • (P3) 돌아가기 버튼
(P2) 승리 화면
  • (P2) 제목
  • (P3) 불꽃놀이 애니메이션
(P2) 패배 화면
  • (P2) 설명
  • (P3) 재 시작 버튼
게임을 만드는 데 있어 일반적인 팁을 드리자면, 메뉴, 다중 레벨, 3D 그래픽은 우선순위를 낮게 하는 것을 추천합니다. 우선 이 게임만의 독특한 점과 재미에 집중하고 나중에 추가하세요.
우선순위 목록을 프로젝트 버전으로 바꾸면, 각 버전마다 어떤 기능을 구현해야 하는지 쉽게 알 수 있습니다. 각 버전이 끝나면 언제든지 멈출 수 있고, 결과물에 만족할 수 있습니다.
벽돌깨기 게임의 각 버전이 어떻게 보일 것인지는 다음과 같습니다.
V1
  • 유저가 제어하는 막대
  • 여러 색의 벽돌
  • 각이 있는 공의 움직임
  • 충돌 감지
V2
  • 목숨 표시
  • 점수 표시
  • 시작 화면 /실행 버튼
    • 승리 화면 /제목
V3
  • 음향 효과
  • 도움말 버튼
  • 불꽃놀이
  • 패배 화면 / 재 시작 버튼

5. 어떻게 구현할 것인가요?

이제 프로그램에서 어떤 기능을 먼저 구현해야 할지 대략적인 개념을 알았습니다. 하지만 실제로 시작하게 되면, 아무런 코드도 적혀있지 않은 텅 빈 프로그램을 보고 막연하고 두렵게 느껴질 수도 있습니다. 어떤 변수를 먼저 써야 되나? 어떤 함수를 써야 하나? 같이 막막한 생각이 들 수도 있어요.
사용할 수 있는 방법 중 한 가지는 프로그램을 "상위 수준의 아키텍처"에서 생각해 보는 것입니다. 프로그램을 "객체", "로직", "사용자 인터랙션", "사용자 데이터" 그리고 "화면"과 같은 카테고리로 분할하여 생각해 보세요. 그리고 객체지향적 요소, 함수 또는 변수들을 어떻게 구현하는 것이 좋을지 생각해 보세요.
예를 들어, 여기 제가 만든 벽돌깨기 아키텍처가 있습니다:
객체
  • Brick (.isHit())
  • Paddle (.move())
  • Ball (.move())
화면
  • 시작
  • 게임
논리
  • Ball-brick collision (function, use bounding box)
  • Paddle-ball angling (function, invert angle)
사용자 인터랙션
  • Keyboard-paddle movement (keyPressed)
  • Buttons for scene changes (mouseClicked)
사용자 데이터
  • Ball deaths (array)
  • Ball hits (array)
상위 수준의 아키텍처에 대해 생각을 해보면 처음 코딩을 해야 할 것들이 명확해집니다.
어쩌면 프로그램을 먼저 의사 코드로 작성하려고 결정했을지도 모릅니다. 의사 코드는 이 단원에서 나중에 자세히 언급할 것입니다. 기본적으로, 전체 프로그램을 일반적인 언어와 주석을 사용해서 작성 한 다음 천천히 실제 코드로 변화시켜 나가는 것입니다.

6. 일정이 어떻게 되나요?

시간을 얼마나 들여서 이 프로그램을 만들 건가요? 몇 주 동안? 하루에 몇 시간씩? 매주 어떤 기능을 만들 건가요? 이 단계에서 여러분의 목표는 프로젝트를 위한 일정을 세우는 것입니다. 만약 제출해야 하는 마감일이 있다면 더 중요해지겠지만, 일정표는 여러분이 프로그램을 만드는데 얼마나 많은 시간이 걸릴지 이해할 수 있도록 도와주기 때문에 유용한 도구입니다.
저의 벽돌깨기 프로그래밍 일정을 만들어 봤습니다. 매주 2-4 시간을 투자합니다.
  • 1주차 : 디자인 및 의사 코드
  • 2주차 : 대략적인 외형
  • 3주차 : 공 이동/ 충돌 원리
  • 4주차 : 채점 원리
  • 5주차 : 화면(시작, 승리, 패배)
  • 6주차 : 마무리, 테스트(QA), 데모 준비
프로젝트의 프로그래밍 일정을 짜는 것은 어려운 일입니다. 쉬워 보였던 일이 기대했던 것보다 훨씬 많은 시간이 걸리기도 하고(디버깅에 수많은 시간을 쓰거나) 어려워 보였던 일이 금방 끝나기도 합니다. 일반적인 원칙은, 생각하는 것보다 더 걸릴 것이라 생각하고 앞으로 조정해 나가는 것입니다.

준비됐나요?

이 단원을 통해 프로그램 프로젝트를 계획하는 과정을 잘 이해하고 지금 바로 프로젝트를 시작할 의지가 생겼나요? 여러분이 짜고 싶은 것이 무엇이냐에 따라, 다른 강좌를 먼저 들어서 게임과 시뮬레이션 프로그램을 짜는 데 필요한 지식을 쌓아야 할 수도 있습니다. 심화 JS: 게임과 시각화 & 심화 JS: 내추럴 시뮬레이션을 참고하세요.
중요한 것은 이렇게 개념을 배우고 나서, 자신만의 프로그램을 만들어야 합니다. 프로그램을 직접 짜는 과정에서 가장 많이 배울 수 있고 무엇보다도 여러분의 꿈을 현실로 가져오는 것이기 때문에 가장 큰 재미를 느낄 수 있기 때문입니다.