본문 바로가기

Problem Solving/나의 생각

코드와 선형 구조에 대한 생각

코드를 보면 줄바꿈과 인덴트가 있다.

줄바꿈은 무엇일까? 명령과 명령 간의 분리를 뜻하기도 하고, 줄 번호에 따라서 실행 순서를 뜻하기도 한다. (비동기 처리는 일단은 논외로 한다.) 아마도 마지막에 line break가 있는지를 보고 줄바꿈을 파악할 것이다. 하지만 이렇게만 쓴다면 '갈래' 또는 '영역'을 표현할 수 없다. 순차적으로 실행되는 명령 리스트만 적을 수 있을 것이다. 

왼쪽의 그림을 보자.

저런 식으로 조건에 따른 갈래가 생긴다면 코드상에서

v>1?
v=5
v=0

이런식으로 쓸 수 없다.

 

 

이제 이를 표현하기 위해 뭔가 새로운 표현법이 필요해진 것이다. 하지만 코드를 쓰는 공간에서는 그림을 그리는 것이 아니고 텍스트기에 뭔가 아이디어가 필요하다. 그것을 해결해주는 것이 바로 인덴트인 것이다.

v = 1 ?
    v = 5
    v = 0

위와 같이 쓴다면 그래도 v=5, v=0라는 두 줄이 뭔가 v=1 ? 이라는 윗줄에 종속됨이 직관적으로 표현된다. 이제 if, else등의 예약어를 만들어 붙여주면 원하는 것이 표현된다. 이렇듯 '인덴트'라는 개념 추가를 통해 '갈래'를 표현할 수 있게 되었다. '영역'도 표현이 될 것이다.

 

필자는 인덴트를 통해 코드가 3차원이 되었다고 생각한다.

x축은 한 줄의 길이일 것이고, y축은 줄바꿈이며, z축은 인덴트이다. 이 인덴트의 도입을 통해 많은 표현이 가능해졌다고 생각한다.

 

선형구조를 이야기하기전에 비선형구조를 살펴보자. 자료구조, 알고리즘에서 말하는 비선형구조에는 대표적으로 트리, 그래프가 있다. 사실 그래프라고 뭉뚱그려 말해도 된다. 트리는 그래프에 종속되기에.

 

일단 선형과 비선형이란 무엇인가? 수학에서는 superposition principle이 적용되지 않으면 비선형이라고 볼 수 있다. f(ax+b)=a*f(x)+f(b)로 분해되면 선형이고, 그렇지 않으면 비선형이다. 단순 다항함수는 선형이고, 삼각함수, 지수함수등은 비선형이다. 당연히 비선형보다 선형이 다루기가 쉽기때문에, 좌표계를 변경하거나(Cartesian coordinate system -> polar/cylindrical/spherical coordinate system), Laplace transform(system 표현식이 덧셈, 곱셈으로 바뀐다)을 하거나 하는 식으로 (많은 방법들이 있다) 문제를 해결한다.

 

소프트웨어에서는 어떨까? 물론 마찬가지로 비선형을 선형화해서 다루고 싶어 할 것이다. 트리나 그래프가 왜 비선형일까? 가장 먼저 보이는 부분은 '순서를 정하기 힘들다' 일 것이다. 1->2->3->...등으로 순서대로 표현되면 선형인데, 그래프 자료구조는 그렇게 표현할 수 없다. 서로서로가 관계(간선)를 맺기 때문이다. 하지만 이 비선형 자료구조도 결국 기계어로 표현하려면 선형화가 되어야 할 것이다. 근데 거기까지 생각하지 않아도, 당장 알고리즘 공부를 하다 보면 자연스럽게 전위 순회, 중위 순회, 그리고 후위 순회라는 용어를 알게 된다. 이들의 역할이 바로 '선형화'인 것이다. 이들은 트리에서 사용 가능하다. 그래프에도 선형화 알고리즘이 있다. 바로 위상정렬이다. 그 외에도 조건에 따라 다양한 알고리즘이 있다.

 

앞서 수학을 들어 말했듯이, 비선형 구조를 선형화함으로써 많은 문제를 해결할 수 있다. 알고리즘에서도 트리, 그래프를 선형화하여 다양한 문제를 해결할 수 있다. 그래서 유용하고 또 재미있기도 하다! 선형화가 되지 않는다면, 항상 트리를 표현할 때, 그림이 있어야 할 것이다. 가장 처음에 얘기하던 코드로 돌아가자. 코드를 쓸 때, 우리는 그림을 그리지 않는다. 하지만 탭을 통해 인덴트를 쓰고, 그것이 갈래를 표현한다. 그리고 그를 통해 코드가 '트리화'된다. 

왼쪽의 그림은 아래의 코드를 트리화한 모습이다.

while( ... ){
	if(...){
    	for(...)
    }else{
    	if(...)
        else if(...)
        else ...
    }
}

 

 

그리고 오른쪽 그림은 위의 트리를 선형화하였다. 

굳이 코드로 까지 써본다면,

while - if - for - else - if - else if - else

위와 같이 될 것이다. 물론 전위 순회 하나만으로는 원래의 트리 형태를 알 수 없다. 다른 방식으로 순회한 데이터가 하나 더 필요할 것이다.

 

 

 

 

코드와 트리, 그래프 등의 비선형 자료구조를 보면서 문득 든 생각을 적어보았다. 기계어로 변환되는 과정이 어떤지는 모르지만 이런 식이지 않을까?라는 생각을 해보았다.