본문 바로가기

엔트리(Entry)

엔트리에서 살펴보는 프로그래밍 원리 (3) - 조건과 분기

지난 포스팅에서는 "반복"을 중심으로 프로그래밍 언어의 기본에 대한 이야기를 말씀드렸습니다.
오늘은 프로그래밍 언어의 또 다른 핵심 요소인 "조건"에 대해 말씀드리려고 합니다.
 

  • 조건(codition) / 분기 (branch)
  • 변수의 타입 (type)
  • 데이터 관리 (data management)

 
이번 포스팅까지 올리고 나면 프로그래밍 언어의 고전적인 영역까지 말씀드리게 되겠습니다.
 

어떻게 "판단"하는가?

지난 포스팅에서 반복 이야기를 하면서,
그런데, 과연 이 계속되는 반복을 어떻게 마치고 중단하거나 빠져나올 수 있을까요?
 
지난번에 예를 들어드린 사과를 상자에 넣는 예를 다시 생각해 봅시다.
사과 20개를 상자에 담는데, 한 번에 5개를 담을 수 있고, 사과를 담기 시작했습니다.
우리는, 총 4번에 나눠 담아야 한다는 사실을 알고 있습니다.
그리고, 이 4번을 세기 위해 우리는 상태값을 기록하는 변수를 이용하고,
사과를 담는 액션을 할 때마다 그 값을 하나씩 늘리면서 다시 그 변수에 할당하는 식으로 관리한다고 했었습니다.

그런데, 우리가 이 반복되는 행동을 4번까지만 하고 마치게 하려면 과연 어떤 동작이 필요할까요?
 

흐름의 분기와 그 조건

프로그래밍 언어는 시작부터 끝까지 한 가지 흐름으로만 동작하지 않습니다.
특정한 이벤트, 예를 들면 키보드나 마우스 입력을 받거나,
혹은 프로그램의 특정한 상태가 변하는 것에 따라서 최초에 정해진 흐름과 다른 액션을 하기도 합니다.
이런 것을 우리는 "분기(branching)"라고 하는데요.
보통 특정한 조건에 따라 분기하기 때문에 묶어서 조건 분기(conditional branching)라고 많이 합니다.
 
엔트리에서는 다음 예제를 통해 조건에 따른 분기를 배우게 됩니다.

쉬움 예제와 비슷한데 한 가지 기능이 추가되었습니다.


아래 그림에서 보시듯, 특정한 조건을 만족할 경우 지정한 액션을 하도록 하는 기능이 바로 조건 분기라고 하겠습니다.
여기서 왜 분기가 발생하는가 하면, 만일 조건을 만족하지 못하면, 하라고 지정한 액션을 하지 않고 넘어가기 때문입니다.

길이 있는지 없는지를 판단하는 조건 블록이 생겼습니다.

 
처음 조건을 배울 때는, 조건을 설정하는 것이 쉬운 작업이 아니기 때문에, 정해진 조건을 이용해서 분기만을 처리하는 연습을 합니다.
따라서 이 조건을 실제 어떻게 만드는지 배울 수가 없습니다.
 
이것은 다음에 나오는 어려움 예제에서 간단하게 접해보게 됩니다.

 
제한적이나마 조건문을 적용해서, 해당 조건이 참이냐, 거짓이냐를 판단해서 분기를 탈 수 있게 합니다.

판단해야 하는 종류와 거리를 선택하게 할 수 있습니다.

 
이런 조건문은 하나만 사용하는 것이 아니라, 여러 가지 조건을 조합하면 컴퓨터로 하여금 보다 복잡한 상황을 처리하게 할 수 있습니다.

두 가지 이상의 조건을 판단해서 서로 다른 액션을 하게 합니다.

 
그런데, 이런 조건의 상태는 어떤 형태로 기록할까요?
단순히 숫자로 기록하기에는 뭔가 좀 어색해 보입니다.
 

변수의 타입(type): 숫자와 문자 이외의 것들

일반적인 숫자를 기록하는 변수 이외에, '참(true)'과 '거짓(false)'이라는 상태값을 가지는 특수한 변수가 있습니다.
컴퓨터의 전기 신호인 0과 1만을 사용하는 1비트 값을 사용하는 변수인데요. 보통 불리언(boolean) 혹은 부울(bool) 부릅니다.
이렇듯 우리가 보통 쓰는 숫자 이외에도, 변수는 여러 가지 형태로 값을 저장할 수 있습니다.
이런 형태를 데이터 타입(Data type)이라고 부릅니다.
 
이 타입은 프로그래밍 언어별로 워낙 천차만별이라 보통 어떤 형태가 있습니다! 하고 딱 부러지게 말씀드리기 어렵습니다.
심지어 똑같은 숫자를 기록하는 변수형도 굉장히 여러 가지로 세분하는 언어가 있는가 하면,
그냥 정수와 실수(우리가 수학에서 소수라고 부르는 녀석을 말합니다. 나누어 떨어지지 않는 녀석)만 구분하는 언어도 있습니다.
아예 실수 한 가지로 다 퉁치는 녀석도 있습니다(...)
 
글자를 기록하는 녀석도, 한 글자만 기록하는 것과 여러 문자인 '문자열'을 기록하는 변수를 나눠 쓰는 게 보통이지만,
최근에는 아예 그냥 문자열로 통합해서 사용하는 언어도 적지 않은 것 같습니다.
 
이외에도 한 가지 형태의 변수를 여러 개 묶어서 쓰는 '배열' 같은 것들도 있고, 그 외에도 너무 많지만,
지금은 일단 이런이런 것들이 있다...라는 것만 말하고 넘어갈게요. 너무 길어져서요.
 

데이터의 관리

변수들의 타입들은 말씀드렸듯 문자열 같은 것이 있다고 말씀드렸는데요.
이런 것들은 뭔가 상태를 기록하는 데 유용하다기보다는, 내용 그 자체가 조금 더 의미 있다고 봐야겠죠.
사람 이름이나, 집 주소와 같은 정보를 기록하기 위한 공간으로서 말이죠.
 
이렇듯 특정한 상태가 아닌 "정보"로서의 의미를 가진 변숫값을 우리는 "데이터(data)"라고 부릅니다.
이것들은 메모리뿐만 아니라, 지속적인 사용을 위해 로컬 저장 공간, 혹은 네트워크 너머의 서버와 같은 곳에 저장됩니다.
그리고 필요할 때 저장된 곳에서 불러와 사용할 수 있는 형태로 변수에 할당해서 사용하게 됩니다.
 
데이터를 효과적으로 사용하기 위해서는 저장하기도 쉽고 불러오기도 쉽게 하는 것이 중요한데요.
간단한 파일 형태로 저장하기도 하지만, 보통은 전용의 툴이나 소프트웨어를 많이 사용합니다.
이런 데이터 관리(data management)에 특화된 소프트웨어를 우리는 데이터베이스(database)라고 부릅니다.
꼭 무슨 비싼 소프트웨어를 말하지만은 않고, 스마트폰 앱을 만들 때 사용하는 SQLite 같은 작은 녀석도 있습니다.
 

마무리

쉬운 이야기를 하는 척하고 뭔가 어려운 이야기를 자꾸 하고 있는 게 아닌가 걱정됩니다.

엔트리 같은 교육용 프로그래밍 언어는 굉장히 쉽게 배울 수 있는 언어이지만,
나름 위에서 다루는 기본적인 개념들이 어떻게 작동하는지 시각적으로 보여주는 데 의의가 있다고 하겠습니다.
일반적인 언어들은 작성한 코드와 실제 구동하는 모습을 연결하는 것이 처음 프로그래밍을 접하는 사람은 쉬운 일이 아니거든요.

원래는 배열이나 문자열 같은 녀석들이 컴퓨터에서 어떻게 동작하는가... 같은 이야기들을 좀 해보려고 했는데요.
그건 진짜 포스팅 하나를 할애해서 해야 하기도 하고,
지금 프로그래밍 언어 초입부에서 할 만한 이야기도 아닐 듯해서 썼다가 지웠습니다 ㅎㅎ
하여간 이야기를 시작하면 폭주해서 자꾸 뭔가 덧붙이려고 하는 습관을 어떻게 해야 합니다.
이 포스팅 시리즈도 그런 습관을 스스로 감시하려고 시작했는데, 역시나 스멀스멀 기어 나옵니다(...)

다음 포스팅은 프로그래밍 원리 시리즈의 마지막이 될 것 같습니다.
엔트리 자체의 언급보다는 여기서 어떻게 확장할 것인가에 대한 이야기가 주로 될 것 같은데요.
그래서 여기에서 다룰 개념들은 조금 난해한 이야기가 될 수도 있겠습니다.
 

  • 리소스 / 애셋
  • 함수 / 모듈
  • 비동기 / 네트워크 / 통신
  • 다음 스텝

 
삼천포로 빠지지 않도록 최선을 다 해야 하는 주제들만 남아 있네요. 노력하겠습니다.