brunch

You can make anything
by writing

C.S.Lewis

by 이남주 NJ Namju Lee Feb 23. 2020

1. 프로그램 & 메모리와 상태

Creative Coding & Computational Design


프로그램이란?


건축물을 설계를 할 때, 재료의 특성을 이해하고 설계를 해야겠죠, 예를 들면, 유리와 콘크리트는 완전히 다른 물성을 가지고 있고, 그에 맞게 설계가 되어야겠죠. 이처럼 컴퓨테이셔널 디자인 혹은 크리에이티브 코딩에서도, 재료의 이해가 중요해요.


Code 

재료들은 결국 메모리에 담기게 되면서, 메모리의 상태들이 변하고 상호 작용하는 것이죠. 코드(code)로 인스트럭션, 즉 레시피를 작성하여 메모리를 수정할 수 있어요. 컴퓨터 언어라고 알려져 있는 C, C++, Java, Python, Javascript, C# 등등의 언어의 문법에 따라서 하나 혹은 여러 개의 레시피, 즉 컴퓨터가 수행해야 할 인스트럭션을 써 내려가는 것이죠. 


선언된 레시피에 따라 루틴을 수행, 반복하며 메모리의 상태를 수정하는 것이죠. 따라서, 프로그램은 정보라는 재료를 처리하는 레시피들을 포함하고 있는 하나의 패키지로 볼 수 있어요. 

 

요리를 할 때, 재료(야채, 조미료, 고기 등등)를 레시피(요리 순서)에 맞게 어떤 논리 순서대로 진행을 하죠. 가령, 얼마 큼의 물을 끓이고, 어떤 재료를 어떤 시간에 넣고, 그 후, 각각의 액션들이 존재하고, 중간중간에 발생되는 문제에 따라서 그 액션들도 변화를 하면서, 결과적으로 음식을 "아웃풋"으로 내놓게 되는 것과 같죠.


프로그래밍은 특정 데이터를 가져와 레시피에 맞는 연산을 하고 주어진 조건에 의해서 정의된 루틴을 수행하는 것이죠. 그 결괏값은 대표적으로 화면에 시각정보로 우리에게 소비될 수 있죠. 


기술 , 정보, 통찰의 패키지

넓은 의미로서, 프로그램이란, 정제되고 함축된 논리, 지식, 기술 정보들을 이동 가능한 수단으로 패키징을 하고, 그 프로그램의 사용범위와 목적에 맞게 그 정보들을 접근할 수 있는 인터페이스로 포장해서 배포할 수 있는 형태의 소프트웨어로 볼 수 있어요. 다시 말해, "기술 , 정보, 통찰의 패키지"라고 볼 수 있어요.


왜냐하면


왜냐하면, 특별히 디자인 프로그램의 경우, 데이터, 지오메트리, 디자인 관습 그에 따른 순차적인 명령체계들을 정제하여 체계적으로 분업 혹은 협업하는 생태계를 프로그램이라는 패키지로 구현을 해야 하기 때문이에요. 특별히 특정 목적을 가진 프로그램일 경우, 수학적 연산 체계들은 수세기 동안 발전시켜온 다양한 학문이론에 기초하고 있기 때문이죠.


어렵지 않죠? 이 정도는 누구나 이해할 수 있을 것 같아요. 이 개념을 이야기를 정리하는 이유는 간단해요. 즉 우리가 프로그래밍을 할 때, 재료를 잘 알아야 한다는 거예요. 재료를 알아야 그에 맞는 레시피를 작성할 수 있는 것이죠.


메모리와 상태

대부분의 프로그램( 포토샵, 캐드, 혹은 스마트폰의 앱)은 시작될 때, 프로그램이 구동되기 위한 자료들을 먼저 메모리에 올려놓아요, 마치 재료들을 잘 다져서 요리를 준비하듯이, 필요한 데이터들은 실행(Runtime) 시에 정해진 데이터의 타입에 맞게 메모리에 그 정보들을 올려놓고, 미리 디자인된 루틴에 맞춰서 중앙처리장치(CPU)가 각각의 메모리를 접근해서 계산을 하고 값을 연산, 업데이트하는 거죠. 


메모리는 여러 개의 상자들이 쭉 나열해 있다고 상상하시면 좋아요. 많은 상자들 정말 어마 무시하게 많은 상자들이 컴퓨터 안에 쭉 나열돼 있죠. 가령, 숫자를 표현할 때는 각각의 나열된 메모리들이 On/ Off 하면서 정보들을 메모리에 담는 거죠.


그리고 각각의 상자들은 유니크한 아이디를 가지고 있어요. 즉 겹치지 않는 숫자 형태의 주소를 가지고 있어요. 하지만 이 복잡하고 긴 숫자 주소를 기억하는 게 불편하죠. 그래서 프로그래밍 언어들에서는 간단하게 변수(Variables)라는 형태로 주소로 접근할 수 있게 해 놨죠.


Variables, 변수 

사실 변수라는 개념은, 여러분들이 수학 이해한 개념과 좀 달라요. 일반적으로 어떤 결과 값을 저장한다고 볼 수 있는데, 프로그래밍 관점에서는 메모리의 주소 숫자가 그 변수에 담기는 거죠. 그리고 그 주소를 통해 실제 정보가 담겨있는 메모리에 접근해서 그 정보를 읽어 올 수 있는 형태죠. 


따라서, 저장된 데이터는, 결국 전기신호로, 메모리 박스들이 키고 끄는 형태로 각각의 bit(메모리의 최소 단위)를 제어를 통해 저장되고 업데이트가 되는 것이죠. 보통 번거로운 일이 아니겠죠


Type, 자료형

하지만 프로그래밍 언어, 즉 c, c++, java, javascript, python과 같은 언어(Language)들은 타입(Type), 혹은 자료 형태를 통해서 메모리를 추상화하여 관리하고, 사용자는 그 타입의 형태를 통해 변수를 정의함으로써 프로그래밍을 할 수 있는 거죠. 따라서 정수, 실수, 문자, 등의 기본 형태의 타입을 제공해 주고, 사실상, 이 기본 타입을 활용해서 복잡한 자료구조를 만들어 낼 수 있는 것이죠.


레시피에 보면 음식재료를 규정하는 방법들이 있죠. 무게의 경우 그램(Gram) 혹은 킬로그램(Kilogram), 액체의 경우는 밀리리터(Milliliter) 혹은 리터(Liter) 등등, 크기 길이 등의 정해진 규칙들이 존재하죠. 따라서, 규격화하고 간단, 단순, 간결화해서 요리의 복잡성을 줄여주는 통일시킬 수 있죠. 그러면 그 레시피의 방법론과 요리, 즉 알고리듬의 루틴에 좀 더 집중할 수 있고, 많은 에러들을 사전에 방지할 수 있겠죠. 


프로그램의 언어에서도, 앞서 설명드린 타입(자료형)을 통해서 프로그래밍하기 위한 작은 최소 단위의 빌딩 블록들을 제공해 주죠. 따라서, 값의 형태와 크기에 맞는 메모리를 규격화해서 제공해주고, 그 복잡성을 뒤에 숨겨놓음으로써 사용자들이 좀 더 편하게 프로그래밍을 하도록 환경을 제공할 뿐 아니라, low-level에서 많은 메모리의 문제들을 사전에 방지하고 효과적으로 관리할 수 있겠죠.


Low-level 가까운 언어일수록 다양한 데이터 타입들을 제공해주죠. 그 의미는 메모리를 좀 더 적극적으로 효율적으로 관리할 수 있는 환경을 제공해준다는 것이에요.  다양한 데이터 타입들이 존재하지만, 시작하는 여러분들은 다음의 타입(자료형)을 알아야 해요.


정수(int)냐 실수(float)냐? 단정도(float)냐 배정도(double)냐? 프로그래밍 언어에 따라 다소 차이는 있을 수 있지만 개념은 같아요.


boolean: 정수형 1Byte - 0, 1 , true, false

int : 정수형 - 0, 4, 7, 10, 1240...

float: 실수형 - -0.125f, 0.0f, 5.5f, 100.0f...

double: 실수형 -  -0.125, 1.0, 125.009... 

string: 문자형 - "hello world"...


블리언(boolean)은, 흔히 0, 1 혹은  참 거짓의 데이터를 표현할 수 있습니다. 인티저(int) 타입은 정수형으로 0, 4, 7과 같은 정수를 담을 수 있어요. 플롯(float)과  더블(double) 타입의 데이터는 소수점 이하의 정보를 담을 수 있어요. 상대적으로 더블은 더 많은 부동소수점 이하의 정보를 담을 수 있어요. 마지막으로 문자형 즉 스트링(string)의 경우는 사실 문자(캐릭터 char)들의 리스트라고 보시면  좋아요. 즉 여러 개의 캐릭터들이 어레이의 형태 혹은 리스트의 형태로 모여있는 것이죠.


컴퓨터의 가장 기본이 되는 자료 타입을 통해 복잡한 메모리 관리를  좀 더 편하게 할 수 있게 되겠죠. 왜냐면, 자료형을 선언해줌으로써 , 몇 개의 메모리를 묶고, 유니크한 주소를 기억하고 그 주소 값은 우리가 선언하는 자료형의 변수에 저장 함으로써 복잡한 부분들을 쉽고 간단하게 해결될 수 있죠. 사실 이 단계를 프로그래밍의 언어 단에서 해결을  하고 있음으로 우리는 깊게 이해할 필요는 없지만, 반드시 알고 넘어가야 하는 것이에요!


동시에, 컴퓨터는 유한을 다루는 기계예요. 무한을 다루지 못해요 정해진 리소스를 가지고 프로그램을 작성을 하는 것이죠. 또한, 프로그램을 실행할 때, 다양한 부분에서 속도 저하가 발생되지만, 메모리의 정의하고 해지함에 따라 발생되는 계산상의 비용도 많이 발생해요. 따라서 이런 부분들을 사전에 숙지하고 공부를 시작하면, 확장력 있고 깊이 있는 컴퓨테이셔널 디자이너(Computational Designer) 혹은 크리에이티브 코더(Creative Coder)가 될 수 있습니다. 


감사합니다.

이남주



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