본문 바로가기

엔트리(Entry)

엔트리에서 살펴보는 프로그래밍 원리 (2) - 반복 & 상태 저장

어제 본격적으로 엔트리를 가지고 기본적인 프로그래밍 언어의 흐름 이야기를 시작해 봤습니다.
오늘 다룰 이야기는 다음과 같습니다.

  • 반복 (loop)
  • 상태 관리 (state management)
  • 변수 (variable)
  • 연산 (operation)
  • 대입 / 할당 (assignment)

한꺼번에 많은 이야기를 하는 듯 해서 다소 당황스럽다고 생각하실 수 있는데,
반복과 관련한 이야기를 하려면 필연적으로 변수와 상태 관리 이야기를 해야 하고,
또한 연산과 대입 얘기를 하지 않을 수가 없습니다.
반복이 어떻게 이루어지는가에 대한 이야기를 하기 위해서 필수 불가결한 내용이기 때문에 잘 들어두시면 좋습니다.
 

반복 작업의 의미

다시 엔트리 화면으로 돌아갑니다.
어제 첫 번째 튜토리얼 이야기를 잠깐 했는데, 이번에 말씀드릴 부분은 쉬움 단계 튜토리얼 이야기입니다.
 

이거 해 보시는 이야기입니다.

 
쉬움 단계 튜토리얼은 기본적인 동작을 시켜보면서 퍼즐을 풀게 합니다.
지정한 플레이봇을 목적지까지 가게 만드는 액션 블록들이 기본 블록인데,
중간중간에 방향을 전환시키는 것이 처음에 나오고, 그 다음에 나오는 것들이 바로 "반복" 블록입니다.
 

목표가 3번만 반복한 건 소소한 함정입니다 (?)

 
"반복"이라고 하는 것은 우리가 초등학교에서 배운 곱셈과 그 원리와 목적이 같다고 보면 됩니다.
똑같은 덧셈을 여러 번 하면 노력도 많이 들고, 시간도 오래 걸리기 때문에,
덧셈을 몇 번 했을 때 나오는 값인가가 바로 곱셈이죠.
보통 학교 들어가기 전에 무지성으로 구구단표를 벽에 붙여놓고 외우게 됩니다만,
초등학교 수업시간에 친절하게 가르쳐주는 곱셈의 원리는 기본적으로 덧셈을 몇 번 반복했느냐 입니다.
 
프로그래밍 언어에서의 반복도 마찬가지죠.
기본적으로 오브젝트가 수행하는 액션을 여러 번 작성하는 낭비를 줄이기 위해서,
해당 액션을 여러 번 수행하게 만드는 것이 바로 "반복"이라고 보시면 되겠습니다.
하지만, 여기에는 몇 가지 문제가 있습니다.
 

몇 번을 반복했는지 어떻게 알지? 상태 관리

특정한 작업은 우리가 필요로 하는 반복 횟수가 있을 것입니다.
간단한 예를 들어, 사과를 한 번에 5개씩 담을 수 있는데 20개를 상자에 담아야 한다면,
20/5=4이므로, 4번만 담도록 시켜야 하지 그 이상 계속해서 담도록 하면 안 될 겁니다.
따라서, 컴퓨터에게 위와 같은 사과를 담는 반복 작업을 시키려면 다음 세 가지 중 한 가지를 확인할 수 있어야 합니다.
 

  • 내가 사과를 담는 작업을 지금 몇 번째 했는가?
  • 상자에 사과가 모두 몇 개가 담겼는가?
  • 상자에 담고 남은 사과는 몇 개인가?

세 가지 중 한 가지를 안다면, 전체 갯수나 횟수를 기준으로 현재 갯수(횟수)를 센 뒤,
남은 갯수(횟수)를 확인해서 작업을 하면 됩니다.

그런데 이것을 하려면, 컴퓨터는 사람처럼 기억을 하거나 어딘가에 기록을 해야겠죠.
따라서, 이런 현재 상태를 기록을 하기 위한 장소가 필요합니다. 보통은 임시로 메모리에 해 두고 바로바로 변경이 쉽게 하죠.
이것을 우리는 보통 "변수(variable)" 라고 부릅니다.
 
수학에서도 변수와 상수 개념이 있죠. 마찬가지입니다.
변하지 않고 고정된 값이 상수이고, 변경되는 값이 변수이죠? 컴퓨터에서도 다르지 않습니다.
값을 정해두지 않고 필요에 따라 계속 변경되면서 값을 기록하고 참조하기 때문에 "변수"인 것입니다.
 
컴퓨터에서 변수의 용도는 여러 가지가 있지만 크게 두 가지로 나눌 수 있는데요.

첫 번째는 지금 언급되는 것처럼 현재 작업한 갯수나 횟수 같은,
흔히 "상태(statement)" 라고 부르는 값을 기록하기 위해 사용합니다.

두 번째는, 시험 점수나 인구 수 같은 어떤 정보로서 존재하는 값들.
흔히 "데이터(data)" 라고 부르는 값을 기록하기 위해 사용합니다.

지금은 일단 상태에 해당하는 내용을 먼저 이야기하고, 데이터는 다음 포스팅에서 얘기해보도록 하겠습니다.
 
그런데, 이런 상태는 단순히 기록만 하고 끝나서는 단순한 숫자에 지나지 않겠죠?
상태가 변경될 때마다 (예를 들면 사과를 한 번 담을 때마다) 그 횟수나 갯수가 변경되어야 합니다.
이렇듯 상태가 변경되어야 할 때 그 값을 변경하고, 필요할 때 그 값을 확인하는 것을 우리는 상태 관리(state management) 라고 합니다.
 

상태 변경하기: 연산과 대입(?)

그러면 이런 상태를 변경하기 위해선 어떻게 해야 할까요?
횟수를 늘인다거나, 담긴 사과 갯수가 늘어난다거나, 남은 사과 갯수를 줄인다거나 하려면...
그렇죠. 기존 값에다 덧셈을 하거나, 뺄셈을 하거나 해야겠죠?
 
우리가 알고 있는 기본적인 사칙 연산 이외에도, 프로그래밍 언어는 다양한 연산을 컴퓨터에게 시킵니다.
특정한 프로그래밍 언어는 복잡한 통계 같은 것을 계산할 수 있게 기본적으로 통계 관련 기능을 제공하는 경우도 있습니다.
물론, 사용자를 위해 미리 잘 만들어진 것을 제공하는 것이지만요.
 
자 그러면, 이렇게 계산한 결과를 이제 기존 변수에다 변경해서 넣어야겠죠?
이건 우리의 블록 코딩을 하는 교육용 프로그래밍 언어에서는 보여주지 않는 내용이고,
일반적인 프로그래밍 언어에서 흔히 보는 방식이라서 소개를 하려고 합니다.
프로그래밍 언어 많이 하시는 분들은 "그게 뭐?" 하시겠지만, 모르는 사람이 처음 봤을 땐 "저게 뭐야?" 하실 만한 표현이라서요.
수학적인 표현과는 완전 다른 표현이라서.

current = current + 1

 
수학 공식만 보시다가 저런 표현을 처음 보시면 당황하시는 분들이 많습니다.
그러다가 "저건 같다는 게 아니라 '변수에 값을 집어 넣는 대입(代入) 연산자'입니다." 라는 말에 일단 한 발 물러서게 됩니다.
그러다 나중에 저것과 모양이 다른 비교 연산자(이건 다음 포스팅에 살짝 소개할 겁니다)가 나오면 수긍하고 넘어가실 겁니다.
저게 참 많이 혼동을 겪게 되는 부분이죠.
최초에 일반적인 숫자나 글자 같은 것을 집어 넣을때에는 저런 표현이 딱히 거부감이 없을 것입니다.

current = 1

 
그런데, 왜 갑자기 저런 표현을 써서 헷갈리게 만들었을까요?
우리가 흔히 변수에 어떤 값을 집어넣는 것을 ‘대입’이라고 하는데, 사실은 할당(assignment) 이라고 하는 것이 맞는 표현입니다.
특정한 메모리 공간에다 어떤 값을 집어넣는다는 의미라고 봐야하는 것이죠.
 
우리가 관용적으로 이전부터 대입, 대입 이렇게 말했지만,
(아이러니하게 수학에서 온 말이라 더 혼동을 가중시키네요)
메모리에 어떤 값을 집어 넣거나, 변경해서 다시 넣는다는 개념이라고 생각한다면,
기존에 있는 값을 가져와서 변경한 다음 원래의 위치에 다시 할당한다(re-assign)라는 의미로 보면,
저 = 의 의미는 이렇게 봐야 합니다.
 
'원래 current에 입력되어 있던 값에 1을 더한 값을 current 변수에 다시 할당한다.'
 
이렇게 하면 저 연산식의 의미가 그럭저럭 받아들이기 쉬우실 것입니다.
C# 레퍼런스 같은 경우에도, 이 = 연산자를 할당 연산자(assignment operator)로 설명해두었더라고요.
대입 연산자를 영어로 어찌 풀어 설명해야하나 하고 고민하다 알게 되었다.. 는 후문입니다 ㅎㅎ

...그렇다고 해도, 애초에 할당 연산자를 수학 기호 = 를 안 쓰고 <- 같은 걸 썼으면 좀 덜 헷갈리지 않았을까 싶기도 하죠?

current <- 3

 
이렇게 말이죠.
하긴, 이러면 뒤에 나올 조건 연산자와 헷갈릴 수 있을 듯도 합니다.
 

다음 이야기

반복과 그 반복을 위해 필요한 상태 관리, 그리고 그 상태 관리를 위해 사용하는 변수와 할당 관련 이야기를 해 봤습니다.
너무 쓸데없이 어려운 얘기만 하는 게 아닌가도 싶네요. 가뜩이나 그림도 별로 안 넣는 포스팅에 말이죠.

관련한 내용은 말씀드렸듯 엔트리의 초급 튜토리얼을 해 보시면 여러 가지 퍼즐을 풀면서 경험해보실 수 있습니다.
막판 스테이지는 저도 좀 고전하면서 풀었습니다 ㅎㅎ
 
다음 포스팅에서는 이런 내용을 다뤄 보겠습니다.

  • 조건 분기 / 비교
  • 상태 관리: 변수의 타입(type)
  • 데이터 관리

오늘 살짝살짝 언급이 되었던 내용들을 다뤄 보고, 곁들어서 옛날 언어들 배울 때 얘기도 슬쩍 곁들어서 해 보려고 합니다.
재미없는 얘기 읽으시느라 오늘도 고생 많으셨습니다 (_ _)