“Hello, world!”로 알아보는 프로그래밍 언어

“Hello, world!”로 알아보는 프로그래밍 언어

#HelloWorld #Programming

헬로 월드! 개발자라면 누구나 맨 처음으로 화면 위에 "Hello, world!"를 띄운 순간을 기억할 거예요. 프로그래밍 언어를 공부한 적이 있다면 어떤 언어든 간에 한 번쯤은 코딩을 통해 이 문구를 직접 실행해봤을 텐데요. 왜 많고 많은 말 중에 콕 집어서 “Hello, world!”인 걸까요? 7월 넷째 주 <주간 인프런> 에서는 왜 “Hello, world”가 이렇게 유명한지, 프로그래밍 언어별로 차이가 나는 이유는 무엇이고 또 어떤 차이가 나는지를 살펴봅니다.

 

프로그래밍의 알파이자 오메가! 🚩

hello, world!

▲ Hello, World! 

개발자들 사이에서 “Hello, world”라는 말이 지닌 의미는 강력합니다. 1978년, C와 유닉스(UNIX)를 고안한 데니스 리치(Dennis M. Ritchie)가 브라이언 커니핸(Brian W. Kernighan)과 함께 쓴 <The C Programming Language>의 첫 번째 예제가 바로 화면에 “Hello, world!”를 출력해 보는 것이었어요. 이 예제가 널리 알려지면서 대부분의 프로그래밍 언어를 배울 때 쓰는 첫 번째 예제로 자리를 잡게 됩니다. 일종의 불문율인 셈이죠.

여기에 “Hello, world!”는 비단 프로그래밍 언어를 새로 배울 때뿐만 아니라, 개발 환경이 정상적으로 작동하는지를 파악하는 테스트로도 쓰여요. “Hello, world!”를 출력하는 코드를 입력해봄으로써 세팅된 개발 환경에 이상은 없는지 살펴보는 거죠. 프로그래밍을 처음 배울 때도, 동작 상태를 확인할 때도 “Hello, world!”라니, 어쩌면 개발자에게는 피할 수 없는 숙명(!)이 아닐까 싶네요.

 

데니스 리치를 추모하는 “Goodbye, world!” 트윗

▲ 트위터 이용자 @johnfoster 의 데니스 리치 추모 트윗 (관련 기사 보러가기)

데니스 리치는 2011년 10월 12일에 세상을 떠났습니다. 프로그래밍 역사에 빼놓을 수 없는 그의 죽음을 전세계의 프로그래머들이 “Goodbye, world!”라는 메시지로 추모하기도 했어요. 


게임 <오버워치>에 등장하는 승려 캐릭터 젠야타 ©Blizzard

▲ <오버워치>의 옴닉 승려 캐릭터 젠야타 ©Blizzard

때때로 “Hello, world!”는 프로그래밍이나 첨단 기술문명 자체를 상징하는 표현처럼 여겨지기도 해요. 프로그래밍 관련 유머나 기사, 칼럼의 관용구는 물론 소설, 게임, 영화, 만화 등 여러 창작물에서도 “Hello, world!”라는 문장을 심심찮게 볼 수 있죠. 인기 게임 <오버워치>의 옴닉(인공지능 로봇 종족) 캐릭터, 젠야타의 대사 중에도 “Hello, world!”가 등장해요. (한국어 음성으로는 “반갑구나, 세상아!”) 

 

 

코딩이 세상과 인사하는 수백 가지 방법 🤝

▲ <The Hello World Collection>에서 600여가지의 헬로 월드 프로그램을 볼 수 있어요.

고작 십여 바이트(Byte) 남짓한 짧은 문장이라지만, “Hello, world!”를 띄우는 방법은 무궁무진합니다. 백 가지 언어가 있다면 “Hello, world!”를 출력하기 위한 코드도 백 종류 가까이 되죠. (실제로는 훨씬 더 많구요!) 언어별로 “Hello, world!”를 출력하는 코드만 모아놓은 ‘The Hello World Collection’이라는 사이트도 있을 정도랍니다. (사이트 바로가기)

“Hello, world!”의 시초인 C 언어 계열 언어 중에서도 대표격으로 널리 쓰이는 C, C++ 그리고 Java(자바)를 보면 코드가 대체로 긴 편인데요, (물론 C 계열 언어라고 반드시 코드가 긴 건 아니에요!)

 

C

#include <stdio.h>

int main() {
    printf("Hello, world!\n");
    return 0;
}

 

C++

#include <iostream.h>

main()
{
    cout << "Hello, world!" << endl;
    return 0;
}

 

Java

class HelloWorld {
  static public void main( String args[] ) {
    System.out.println( "Hello, world!" );
  }
}

 

한편, C 계열 언어에 비해 배우기 쉽다고 알려진 PHP나 파이썬(Python), 자바스크립트(JavaScript)의 "Hello, world!" 코드는 비교적 간단하죠.

 

PHP

<?php
  echo 'Hello, world!';
?>

 

Python

print("Hello, world!")

 

JavaScript

console.log("Hello, world!");

 

그럼 이런 차이는 왜 생기는 걸까요? 프로그래밍 언어가 구성된 패러다임과 성격에 따라 문법이 전혀 달라지기 때문이에요. 크게는 동적 언어인지 정적 언어인지, 객체지향적인지 아니면 함수형 프로그래밍이나 절차적 프로그래밍을 따르는지1), 인터프리티드 언어인지 컴파일드 언어2)인지, 명령형 프로그래밍을 지향하는지 선언형 프로그래밍을 지향하는지3) 등등 하나하나 따져보면 전부 나름의 특징이 있고, 코드를 작성하는 방식도 그만큼 다르답니다. 같은 언어라도 실행 환경이나 버전에 따라 차이가 나기도 하고요.

예컨대 위에서 말한 C, C++, Java의 경우 모두 코드를 작성할 때 일일이 데이터에 따른 타입(Type)4) 값을 선언해주어야 하는 정적 언어예요. 반면 PHP, Python 그리고 JavaScript5)는 모두 프로그램이 실행하는 시점에 데이터 타입이 결정되는 동적 언어죠.

타입을 잘못 작성하면 에러가 발생해버리는 정적 언어와 달리, 타입을 선언해줄 필요가 없는 동적 언어는 비교적 적은 코드로도 많은 작업을 수행하고 배우기도 쉽다는 장점이 있어요. 반면 정적 언어는 타입 에러로 인한 문제점을 초기에 발견하기 좋아 유지/보수 측면에서 동적 언어에 비해 안정적이죠. 단순히 코드의 길이만으로 어떤 언어가 더 좋고 나쁜지가 갈리는 게 아니라, 언어의 특성과 용도에 따라 다르게 볼 수 있는 거예요.

예시를 든 여섯 개의 언어 중에서 오직 자바만 “Hello, world!” 코드에 대괄호와 중괄호([], {})를 사용합니다. 클래스(class)6)가 있고 그 안에 정해진 기능을 수행하는 메소드(method)7)가 괄호로 묶여 있는 형태죠. C, C++는 반환값(return)8)을 지정해 준 게 눈에 띄네요. 자바스크립트는 console.log()9)를 통해 정보를 출력하고요. 

PHP에서 문자열을 출력할 때 쓰는 명령어는 echo와 print10)인데 이 코드 예문에선 echo를 쓰고 있어요. 파이썬은 세미콜론(;)을 붙이지 않고, 프로그래밍을 잘 모르는 사람이라도 직관적으로 "Hello, world!"를 출력(print)하라는 걸 간결한 한 문장으로 알아볼 수 있을 것 같죠. 이렇듯 짧은 한 문장을 출력해보는 코드만으로도 해당 언어가 지닌 특성이 각기 다른 걸 볼 수 있어요.

용어 해설 펼쳐보기 (1~10)

 

1) 절차적 프로그래밍, 객체지향 프로그래밍, 함수형 프로그래밍 모두 프로그래밍 패러다임입니다. 절차적 프로그래밍(Procedural Programming)은 프로시저 단위로 함수를 호출해 프로그래밍을 실행하고, 객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 하나의 명령어가 아니라 메소드와 변수의 묶음으로 이루어진 여러 개의 객체 단위로 보죠. 한편, 함수형 프로그래밍(Functional Programming)은 자료 처리를 수학적 함수 조합으로 취급으로 간주하는 방식이에요.

2) 컴파일드 언어(Compiled Language)는 프로그래머가 작성한 코드를 컴퓨터가 이해할 수 있도록 어셈블리어 등으로 변환하는 작업(컴파일)을 거쳐 실행되는 단어로, C, C++ 등이 해당돼요. 반대로 인터프리티드 언어(Interpreted Language)는 컴파일 작업 없이 바로 실행되는 언어로, Python, PHP, Javascript 등이 있습니다. 

3) 프로그램이 어떤 명령에 따라 순서대로 동작해야 하는지 설명하는 프로그래밍 패러다임을 명령형(imperative)이라고 합니다. 그 반대로 선언형(declarative) 프로그래밍은 과정보다는 동작의 결과로 무엇이 나타날지에 집중하지요.

4) 타입(Data Type, 자료형)이란 데이터의 종류로, 프로그래밍에서 여러 종류의 데이터에 할당된 특징을 명시적으로 구분하는 데 쓰여요.

5) 자바스크립트(JavaScript)는 동적 언어이기 때문에 유지보수가 어렵다는 단점이 있죠. 이를 보완하기 위해 정적 언어의 속성을 따와 타입 에러를 잡아내기 쉽도록 한 언어가 바로 타입스크립트(TypeScript)입니다.

6) 클래스(class)란 객체 지향 프로그래밍에서 객체에 해당하는 변수와 메소드를 정해주는 일종의 집합이에요.

7) 메소드(method)란 객체 지향 프로그래밍에서 객체와 관련된 명령문 코드로, 클래스의 동작을 정의해요.

8) 반환값(return)이란 함수를 호출했을 때 함수 실행을 마치고 나서 반환되는 값을 의미해요.

9) 자바스크립트의 로그(log) 함수는 콘솔창을 통해 자바스크립트의 객체를 콘솔창에 출력하는 함수입니다.

10) echo와 print 모두 데이터를 출력하는 데 쓰는 PHP 명령어입니다. 단, echo는 문자열을 여러 개 출력할 수 있는 데 반해 print는 딱 하나의 문자열만을 출력하고, 숫자 1을 반환해요. (반환값)

 

 

💡 도전!
helloworldquiz.com라는 사이트에서 무작위로 띄워주는 “Hello, world!” 출력 코드를 보고, 이 코드가 어떤 프로그래밍 언어에 해당하는지 퀴즈를 풀어볼 수 있어요. 내가 프로그래밍 언어를 몇 종류나 구분할 수 있을지 궁금하다면 한번 도전해보세요! (클릭하면 바로가기)

 

“안녕, 세상아!” 낯선 즐거움을 느껴보세요. 💬

누구나 코딩을 할 수 있어요.

▲ 누구나 코딩을 할 수 있어요.

코딩을 배우는 건 외국어를 배우는 일과 닮았다고 하죠. 막 입을 트기 시작한 아이처럼 코딩을 익히고, 코드를 타이핑해 생각한 대로 구현해보면서 만나보지 않은 미지의 세계를 탐험하고... 그래서인지, 맨 처음 프로그래밍을 배우면서 도전하는 대표적인 예제가 “Hello, world!”라는 인삿말이라는 점은 어쩐지 의미심장해요. 말은 곧 세상을 만나는 통로니까요. 

낯선 외국어로 첫인사를 할 때의 설레는 마음처럼, 내가 입력한 코드를 실행해 화면에 뜬 글자를 맞닥뜨리는 처음 그 순간의 즐거움으로 계속해서 배움을 이어나갈 수 있기를 바랄게요.

 

프로그래밍의 즐거움을 경험하고 싶으신가요?
인프런과 함께 학습해보세요 📑


이번 [주간 인프런] 어떠셨나요?
솔직한 의견을 들려주세요!

유익해요 | 아쉬워요

지난 [주간 인프런] 이 궁금하다면? (클릭)

댓글 2

댓글을 작성해보세요.

  • 김근오
    김근오

    이 글을 읽으니 모든 것이 행복하기만 했던 어린 시절로 돌아가는 듯한 기분좋은, 이상한 기분이 드네요 ㅎㅎ

    다시 처음으로 Hello world

  • pji219
    pji219
    재밌었어요!!:)