본문 바로가기
Computer Science

[Computer Science] 수도 코드 사용하는 이유와 작성 방법

by Henry Cho 2024. 7. 8.
728x90

수도 코드 사용하는 이유와 작성 방법

포스트 난이도: HOO_Middle


# Pseudocode를 사용하는 이유

Pseudocode (수도코드)는 프로그램에 포함되어 있는 알고리즘과 기능들을 한눈에 볼 수 있도록 간략하게 작성된 "요약 코드"라고 볼 수 있다. 마치 우리가 Flowchart를 통해서 시각적으로 한눈에 프로그램이나 특정한 과정의 흐름을 파악할 수 있게 만들어준다면 Pseudocode는 이보다 더 구체적인 기능과 특징에 대해서 코드 형식을 토대로 보여주면서도 빠르게 전반적인 원리와 알고리즘을 이해하는데 효과적이다.

 

사실 학부생 입장에서는 과제나 프로젝트때 Pseudocode를 작성해서 공유하기도 하지만 나의 개인적인 경험에서는 Pseudocode는 교수님께서 작성하거나 과제에 나와 있는 걸 이해하기 위해 알아둔 정도였던 것 같다. 실제로 다른 친구들과 프로젝트를 진행할 때도 다이어그램이나 코드 코멘트 위주로 이야기를 하지 Pseudocode를 작성해서 이야기를 나누진 않았다.

 

하지만 개발자의 위치에서 프로그램을 설계하거나 연구원으로써 새롭게 만든 알고리즘 및 모델에 대해서 설명하거나 구현해내기 위해서는 Pseudocode 작성이 필수적이다. 마치 요리를 배우는 단계에서는 요리 레시피에 나와있는 데로 따라서 요리를 만들어보면 그만이지만 요리사가 되고 나서는 직접 본인만의 레시피를 작성하듯이 Pseudocode를 통해서 자신만의 알고리즘 방식을 전달해야 한다.

 

결국 개발자를 꿈꾸는 브로들에게 당장은 귀찮아 보이는 Pseudocode이지만 앞으로 미래를 위해서라도 작성하는 방법과 Pseudocode를 읽는 방법에 익숙해질 필요가 있다. 솔직히 막상 해보면 사람들을 위해 만들어둔 요약 코드이기 때문에 특별히 어렵게 생각할 필요가 없다.


# 작성 방법

새 차를 사고 나서 차 매뉴얼을 A to Z를 하는 사람이 많이 없듯이 Pseudocode를 이해하는 것조차 귀찮고 짜증이 나는 일이라는 걸 누구보다 잘 안다. 또한 Pseudocode 일반적인 작성 방법은 많은 사이트에서 쉽게 살펴볼 수 있기 때문에 Pseudocode를 이해하는 주요 포인트들만 아래 Figure 1 구조를 통해서 이야기를 하려고 한다.

Figure 1. Pseudocode 작성을 위한 구조

Start with the Goal:

Pseudocode는 다시 한번 말하여지면 사람들을 위한 코드이기 때문에 코드가 무엇을 나타내려고 하는지를 가장 상단에 작성해 두는 것이 좋다. 마치 우리가 주요 기능이나 코드에 코멘트를 작성해 두듯이 해당 Pseudocode를 통해서 나타내려고 하는 또는 산출하려고 하는 것이 무엇인지에 대해서 작성해 둔다. (참고로 이거 안 써둔 개발자를 보면 한숨이 나오는 게 바빠 죽겠는데 이걸 파악하려고 Pseudocode를 읽어봐야 하기 때문이다.)

 

Indentation:

Pseudocode를 작성하는데 들여 쓰기는 당연한 것이다. 들여 쓰기를 통해서 특정 기능이 어디까지의 영향력을 가지고 있고 무슨 기능에 상속이 되어 있는지를 파악하기가 정말 쉽다. 익숙해지면 필요한 기능이나 알고리즘을 분석할 때 해당 파트만 살펴볼 수 있기 때문에 매우 매우 용이하면서도 Pseudocode 작성에 아주 기초적인 작성 방법이다.

 

Control structures:

말만 Control strucutures라고 되어 있을 뿐 Function 안에 들어가는 조건문이나 반복문처럼 loop에 해당되는 부분이라고 생각하면 된다. 예를 들면 "If n is less than 0:" 이런 식으로 if statements에 대해서 작성해 줄 수 있고 Identation을 통해서 안에 포함된 내용이나 Reture 값을 작성해 주면 된다.

 

End strucutures:

앞서서 control structures들을 사용했다면 당. 연. 히 언제 해당 strucutures들이 끝이 나는지를 표기해줘야 한다. 마찬가지로 if statements를 가지고 예를 들자면 "End If"처럼 표기를 해줘서 if statements가 끝났다는 걸 나타내줘야 한다. 몇 개월에 한 번씩 개발자 Bro들에게 맴매하는 이유 중 하나가 Pseudocode에서 End strucutues를 깜빡하기도 한다. 사실 나 포함이다.

 

End Function:

Pseudocode 작성이 끝나면 해당 기능에 대해 끝이 났다는 걸 작성해줘야 한다. "End Function"이나 "End" 등으로 작성해 주는데 그냥 솔직히 다른 사람이 알아먹을 수 있게끔 작성해 주면 그만이다. 


# Tips

(여기서 잠깐!) 위의 Figure 1을 보면 숨겨둔 파란색 화살표에 대한 설명이 남아 있다. 사실 특별한 건 아니고 저런 식으로 반복해서 Pseudocode 작성이 가능하다는 것을 의미한다. 사실 Pseudocode의 핵심은 Simple이다. Simple is best라는 말이 있듯이 절대 복잡하게 작성하지 않고 하나의 기능만을 작성해 두는 것이 암묵적 원칙이다. (솔직히 복잡하게 쓸 거면 그냥 코드를 작성하지 귀찮게 Pseudocode 왜 쓰냐는 말이다.) 그렇기에 웬만해서는 하나의 기능만을 설명하고 나눠서 Pseudocode를 작성하지만 필요에 의해 여러 기능을 작성해야 한다면 Figure 1의 파란색 화살표와 같이 과정을 반복하여 하나의 Pseudocode에 여러 기능을 작성해 줄 수 있다.

 

따라서 Pseudocode를 작성하는 데 있어 너무 복잡하게 생각하지 말고 나 말고도 다른 사람이 봤을 때도 이해하기 쉽게 심플하게 작성해 주는 것이 중요하다. 모든 내용을 넣으려고 하기 보다는 중요 포인트 기능만 작성해주는 것도 하나의 방법이다. 결국 Pseudocode는 요약집이기 때문에 구체적인 내용은 실제 코드에서 보여주면 된다.

 

아무튼 Pseudocode는 어려운 것이 아니기 때문에 시간이 날 때마다 작성해 보는 것이 좋고 피드백이 필요한 경우 언제든지 댓글을 남겨줘도 노프로 블롬이다.


# Attachments

예제를 실제로 보면 훨씬 이해하기가 수월하기 때문에 내가 간단하게 작성한 Pseudocode를 공유한다. 아래 예시를 토대로 실제로도 내가 개발 중인 내용의 부분이기 때문에 (물론 Pseudocode에 차이가 있을 수 있다.) 혹시나 관심 있는 연구원이나 개발자 분들은 언제든지 연락 주길 바란다 (기업 포함). 해당 데이터 수집 모델은 현재 농축수산업, 바이오 쪽에 접목하고 있으며 의학과 금융 쪽의 케이스를 비교분석했기 때문에 상호 적용이 가능하다.

Goal: Collect and verify agricultural data using blockchain smart contracts

Smart Contract: AgricultureDataCollection

Function AddData(farmerID, cropType, plantingDate, harvestDate, yieldAmount):
    Verify farmerID is valid
    Store data (farmerID, cropType, plantingDate, harvestDate, yieldAmount) on blockchain
    Emit event DataAdded(farmerID, cropType, plantingDate, harvestDate, yieldAmount)
End Function

Function VerifyData(farmerID):
    Retrieve data for farmerID from blockchain
    If data is found:
        Return data
    Else:
        Return "No data found for this farmer"
    End If
End Function

Function GetYieldSummary(cropType):
    Retrieve all data for cropType from blockchain
    Calculate total yield
    Return total yield
End Function

Event DataAdded(farmerID, cropType, plantingDate, harvestDate, yieldAmount)

// Example usage
AddData("Farmer123", "Wheat", "2023-04-01", "2023-08-15", 1000)
VerifyData("Farmer123")
GetYieldSummary("Wheat")

 


 

728x90

댓글