코딩 기초 맛보기

Python - 파이썬 코딩 독학하기에 이어 입문자를 위해 작성하는 2번째 글이다. 본 글은 코딩 기초를 다룬다. 특정 언어와 관계없이 코딩을 시작하는 사람이라면 누구나 읽어도 된다. 이 글을 읽고 나면 C 언어든 Python이든 간단한 코드는 이해할 수 있게 된다. 공책과 펜을 들고 전투적으로 공부하지 말고 다큐멘터리 보듯이 천천히 따라오길 바란다.
필자는 Python, Go를 중심으로 C++, Javascript 등 여러 프로그래밍 언어를 다루고 있다. 필자뿐만 아니라 대부분 개발자들이 2개 이상의 언어를 다룰 줄 안다. 그 이유는 '언어'의 기초를 이해하고 있기 때문이다. 따라서 특정 언어에 관계없이 컴퓨터를 이해하기 위해 필요한 기본 지식을 알아보려 한다. 


프로그래밍 언어도 언어다

프로그래밍 언어는 컴퓨터에게 명령을 내리는 방법이다. 언어도 여러 종류가 있는데, 각자 장단점이 있다보니 상황에 따라 선택해 사용하기도 하고, 트렌드에 따라 변화하기도 한다.
언어는 인간 언어와 동일하게 단어(keyword)문법(syntax)이 있다.

  • 이것은 사과다.
  • This is an apple.

두 문장은 단어와 문법이 다르지만 모두 '사과(apple)'에 대해 이야기하고 있는 것처럼 의미는 변하지 않는다. 프로그래밍 언어도 마찬가지다. 심지어 프로그래밍 언어는 단어와 문법 종류도 적다. Python은 36개, Go는 25개, C는 32개의 단어가 있다. 게다가 겹치는 단어가 대부분이다. 예를 들어 “return”은 C, C++, Go, Python, Javascript, Java 등 대부분 언어에서 공통으로 사용한다. 그 외 표현은 필요할 때 구글링하며 찾아쓰면 된다. 개발자도 모든 표현은 알지 못하기 때문에 항상 구글을 켜놓고 코딩한다.
이제 구체적으로 어떤 표현이 있는지 알아보자.


이름 붙이기

누가 갑자기 "배!"이러면 배가 아프다는건지 배가 먹고 싶다는 건지 배를 타고 싶다는 건지 고민될 거다. 코딩도 마찬가지다. 코드에 6이라는 숫자만 딸랑 적혀있다면 어제 먹은 햄버거 개수인지 우리 집 의자 개수인지 누구도 알 수 없다. 그래서 '내가 먹은 귤: 6'과 같이 별명을 붙여준다. 이때 별명을 변수라고 부른다.

변수이름 = 데이터

보통은 왼쪽에 별명을 적고 오른쪽에 값을 적는다. 그래서 코드를 읽을 때 오른쪽에서 왼쪽으로 읽는다. =을 같다라는 의미로 알고 있지만 코딩에서는 대입하겠다는 의미를 가진다.

예시

# Python
total_sum = 36
// Go
totalSum := 36
// C, C++
int totalSum = 36

모두 totalSum(전체 합)이라는 이름에 36을 대입하는 코드다. C 언어 앞에 붙은 int는 정수(integer)의 약자다. totalSum에 정수가 들어갈 거니 미리 준비하라고 컴퓨터에게 알려주는 상황이다.

[심화] 좋은 변수명을 짓는 습관

1. 변수명은 찾기 쉽게, 의미있게 짓는다.
2. 의미를 포함하는 선에서 짧고 간결하게 짓는다.
3. 언어 관습을 따른다.

변수명은 찾기 쉽게 만들어야 한다. 만약 처음 보는 코드에 변수가 500개 정도 있다고 해보자. 변수 이름이 a나 b처럼 마음대로 지어져 있다면 도대체 뭐 하는 녀석인지 알 수가 없다. 게다가 변수명이 너무 길다면 필요한 변수를 검색하기에 힘들어진다. 예를 들어, "totalSumOfProducts" 변수명보다는 "productSum"이라는 변수가 더 직관적이고 쓰기 편해 보인다. 마지막으로 언어마다 관습과 규칙이 있다. 예를 들어, SUM처럼 변수명이 모두 대문자로 되어있다면 '상수'가 된다. 상수는 코드 전체를 걸쳐 한 번도 변하지 않는 고정된 값이라는 의미다. 그런데 이 규칙을 모르고 변하는 값을 대문자로 썼다면 코드를 읽는 사람은 혼란이 올 수 있다. 따라서 언어에서 지정한 "관습(convenvtion)"을 따라 작성하는 쪽을 선호한다.

사칙 연산

더하기 빼기 곱하기 나누기
+ - * /
3 + 3  # 6
3 - 1  # 2
3 * 2  # 6
6 / 2  # 3
5 + 2 * 3  # 11
(5 + 2) * 3  # 21

수학 시간에 배운 연산 규칙이 그대로 적용된다. 대부분 언어에서 공통으로 적용되는 연산이다. 

[심화] 자료형
Python은 { 2 + 3.5 }를 5.5로 잘 계산해준다. 그런데 C++ 등 언어는 오류가 발생한다. 2는 정수고, 3.5는 소수이기 때문이다. 따라서 { 2.0 + 3.5 }와 같이 자료형을 통일해 줘야 계산이 가능하다. 이는 컴퓨터가 숫자를 저장하는 방식 때문이다. 자세한 내용은 공부하는 언어에 맞게 살펴보면 된다.

중간 점검

최종 n 값은?

# Python
n = 3 + 6
n = (n + 1) / 2
더보기

정답은 5이다. 대입문(=)은 오른쪽에서 왼쪽으로 읽는다는 사실만 기억하면 쉽게 풀 수 있는 문제다. 

  • n = 3 + 6 ... (2)
  • n = 9  ... (2)
  • n = (9 + 1) / 2  ... (3)
  • n = 10 / 2  ... (3)
  • n = 5  ... (3)

화면에서 결과보기

print: 출력하다

컴퓨터에게 출력이란 화면에 결과를 보여주는 행위를 말한다. 3 + 3을 입력하면 컴퓨터 내부에서 연산이 일어난다. 그런데 치사하게 자기만 보고 우리한테는 보여주지 않는다. 그래서 print를 통해 출력해 달라고 말해야 한다.

print("안녕!")

언어마다 조금씩 차이는 있지만 대부분 print라는 단어를 사용한다. 주의할 점은 "큰 따옴표"이다. 큰 따옴표로 감싸면 문자열을 뜻한다.

hello = 10
print(hello) # 10
print("hello") # hello

큰 따옴표로 감싸지 않는 표현은 변수명이나 식으로 인식한다. 따라서 큰 따옴표로 감싸서 문자열이라는 걸 티 내줘야 컴퓨터가 문자열로 이해하고 출력해 준다.

예시

# Python
print("안녕!")
// Go
fmt.Print("안녕!")
// C
printf("안녕!")
// Java
System.out.print("안녕!");

printfprintln 같이 print 뒤에 무언가 붙는 경우가 있다. 이는 print에 기능이 조금 더 추가된 경우라고 보면 된다. 예를 들어 f는 형식 맞춤(format), ln은 줄바꿈(line)을 뜻한다.

중간 점검

출력 결과는?

# Python
print(3 + 5)
print("3 + 6")
더보기

정답은 아래와 같다.

  • 8
  • 3 + 6

첫 줄은 3 + 5라는 식의 결과를 출력한다. 다음 줄은 "3 + 6"이 큰 따옴표로 감싸져 있기 때문에 그 자체로 문자열로 인식한다. 따라서 문자열을 그대로 출력해 준 모습이다. 


범위 나누기

앞으로 볼 코드는 계층과 범위가 있다. 

큰 범위에 있는 값은 작은 범위에서 사용할 수 있다. 반대로 하위 범위에 있는 값은 상위에 있는 범위에서 접근할 수 없다. 따라서 이러한 범위나 계층을 코드에도 표현해 주어야 한다. 


# 패턴 1

첫 번째 패턴은 들여쓰기다. 특정 키워드를 입력하고 들여 쓰기를 하면 들여 쓰기 된 코드는 키워드의 영향을 받는다.  위 그림에서 빨간 박스 안의 코드는 if의 영향을 받는다. 노란 박스는 for의 영향을 받는다. 들여 쓰기는 대표적으로 Python이 사용하고 있다. 


# 패턴 2

두 번째 패턴은 괄호{ }를 이용하는 패턴이다. 괄호 안에 있는 코드는 상위 키워드의 영향을 받는다. 괄호와 함께 들여 쓰기가 된 이유는 시각적으로 계층을 확실히 나타내기 위해서다. 들여 쓰기를 하지 않고 괄호만 사용해도 정상적으로 작동한다. 대부분 언어는 괄호를 이용한다. 예로 C, C++, Go, Java, Javascript 등이 있다. 
본 글에서는 괄호와 들여쓰기를 모두 사용해 계층을 표시하겠다. 


조건 확인

if: (만약) ...면
else: (이미 언급된 것에 덧붙여) 또 다른

특정 조건을 만족하면 코드를 실행하도록 짤 수 있다.

a = 7
b = 5

if a > b {
    print("a가 b보다 크다.")
}
// 출력: "a가 b보다 크다."

if 조건을 만족하면 if 안에 있는 코드를 실행한다. if 조건을 만족하지 못하면 if문을 무시하고 넘어간다. 

a = 3
b = 5

if a > b {
    print("a가 b보다 크다.")
} else {
    print("a가 b보다 크지 않다.")
}
// 출력: "a가 b보다 크지 않다."

if...else를 이용하면 if 조건을 만족하지 못할 때 실행할 코드를 작성할 수 있다.

 
if문을 중첩해도 된다.

a = 10

if a > 5 {
    if a > 7 {
        print("7보다 큼. ")
    }
    print("5보다 큼.")
}
// 출력: "7보다 큼. 5보다 큼."

조건문은 간단하다.

비교 연산자

a < b a > b a <= b a >= b a == b a != b
작다 크다 작거나 같다 크거나 같다 같다 다르다

알다시피 변수에 대입을 할 때 =를 사용하기 때문에 '같다'는 ==를 사용한다. 예외도 있지만 대부분은 위 예시를 기준으로 하고 있다. 

[심화] 다양한 조건문
if...else-if...else 문은 if를 만족하지 않으면 다시 else-if 조건을 검사할 기회를 준다. 그 외 switch-case, match-case 등 다양한 형태의 조건문이 있다.

예시

# Python
if a == "denev6":
    print("a: denev6")
else:
    print("a: denev6가 아님")
// C
if a != 5 {
    printf("a는 5가 아님")
} else {
    printf("a는 5")
}

특정 횟수만큼 반복

for: ...동안

특정 횟수만큼 반복할 때 for을 사용한다. 이제 for을 사용한 몇 가지 패턴을 살펴볼 것이다. 문법에 집중하기보다 의미를 중심으로 이해해 보자. 


# 패턴 1

for i = 1 to 3 {
    print(i)
}
  • for i = 1 to 3
  • i가 1에서 3일 동안 반복

위 코드는 i = 1, i = 2, i = 3일 때까지 반복한다. 그리고 각 i에 대해 print를 실행해 준다. 위 코드를 풀어쓰면 아래와 같다.

i = 1
print(i)
i = 2
print(i)
i = 3
print(i)

대표적으로 VBS에서 이 패턴을 사용한다. 


# 패턴 2

for i = 1; i < 4; i = i + 1 {
    print(i)
}

가장 흔하게 볼 수 있는 패턴이다. 패턴 1과 같은 표현이지만 설명이 조금 더 필요해 보인다. 위 패턴은 세미콜론(;)을 기준으로 세 부분으로 나눌 수 있다.

for i = 1;    i < 4;     i = i + 1
for 초기화(1); 진행 조건; 증감식(2)

위 식을 풀어보면 아래와 같다.

  1. 기준이 되는 값(i)을 초기화한다.
  2. 조건에 맞으면 for{ } 내부에 있는 식을 실행한다.
  3. 증감식을 실행해 기준 값(i)을 바꿔준다. 
  4. 조건에 맞으면 for{ } 내부에 있는 식을 실행한다.
  5. 증감식을 실행해 기준 값(i)을 바꿔준다. 
  6. 조건에 맞으면 for{ } 내부에 있는 식을 실행한다.
  7. (반복)
  8. 조건에 맞지 않으면 for{ }문을 종료하고 다음 줄로 넘어간다.

C, C++, Go, Javascript 등 대부분 언어에서 패턴 2를 기본으로 한다. 중요한 패턴이니 이해될 때까지 천천히 읽고 고민해 보자. 


# 패턴 3

for i in [1, 3, 5] {
    print(i)
}
  • for i in [1, 3, 5]
  • i가 [1, 3, 5] 안에 있는 동안 반복

3번 패턴은 특정 배열을 주고, 배열 안에 있는 값을 하나씩 반복하는 경우다. 배열 값을 하나씩 빼서 i에 전달해 준다. 그리고 배열의 모든 값을 다 사용하고 나면 반복문을 끝낸다.

대표적으로 Python이 기본 패턴으로 사용하고 있다. 

[심화] while: 조건으로 반복
while은 특정 조건을 만족할 때까지 무한 반복한다. 일부 언어에서는 while을 지원하지 않기 때문에 이 글에서 다루지 않았다. 하지만 Python과 같이 for문이 제한적인 언어에서는 필수로 익혀야 하는 키워드 중 하나다.

중간 점검

출력값은?

// Go
num = 0
	
for i = 1; i < 10; i = i + 3 {
  num = num + i
}
num = num + i

fmt.Print(num)
더보기

정답은 22다. 

  • num = 0 초기화
  • i = 1 초기화
  • for { num =  num + i }: 0 + 1 + 4 + 7 (num: 12, i: 10)
  • num = num + i
  • num = 12 + 10
  • num = 22

for문은 1을 시작으로 3씩 커진다. 즉, i = 1, 4, 7, 10, 13... 이 된다. 하지만 i < 10 조건에 의해 for문은 7까지만 영향을 받는다.

주의할 점은 for문 밖의 i 값이다. i < 10 조건에 의해 for 내부 식이 계산되지 않았을 뿐, i는 증감식(i=i+3)에 의해 10이 된 상태다. 따라서 for문 외부에서 10이 더해지며 22가 된다. 


언어 사용분야와 종류

오늘 배운 내용은 언어에서 공통으로 사용하는 개념이다. 실제 컴퓨터와 소통하기 위해서는 특정 언어의 문법을 익혀야 한다. 그래서 몇 가지 언어와 특징에 대해 이야기해보려 한다. 읽어보고 마음에 드는 녀석을 골라 공부하면 된다. 

Python

최근 가장 핫한 녀석이다. 쉽고 강력하다. 컴퓨터 언어보다는 인간의 언어, 특히 영어에 가깝다. 덕분에 입문자도 쉽게 시작할 수 있는 언어다. 사용분야도 인공지능, 데이터 분석, 백엔드 등 다양하다. 자세한 내용은 아래 글에서 확인할 수 있다. 

Python 관련 글: 파이썬 코딩 독학하기

C / C++

C는 근본 중에서 근본이라 할 수 있다. 빠른 속도와 정교함이 특징이다. 하지만 매우 정교하기 때문에 코드를 짜는데 상당히 높은 난이도를 자랑한다. 고인물을 위한 언어라고 볼 수 있다. 하지만 C를 이해하면 컴퓨터를 이해할 수 있다는 장점 덕분에 대부분 대학 커리큘럼에 포함되어 있다.
C++은 C가 진화한 버전이다. 깊게 들어가면 C와 C++은 결이 다른 언어지만, 간단히 업그레이드 버전 정도로 생각하면 될 것 같다. 현재 게임 개발, 인공지능 등 현업에서 활발히 사용되고 있다. 주로 빠른 속도를 필요로 하는 분야에서 두각을 드러낸다. 예로 언리얼 엔진 게임이 C++로 만들어진다. 하지만 높은 난이도 때문에 여러 입문자를 좌절에 빠트리는 범인 중 하나다. 

C/C++ 관련 글: C에서 C++로

Java

Java는 국내에서 웹 프로그래밍을 하기 위해 꼭 거쳐야 하는 관문 중 하나다. 국내 기업들이 아직 Java + Spring 조합을 사용하고 있기 때문이다. 안드로이드 앱을 만들 때도 종종 사용된다.

Javascript

이름 때문에 Java 친척으로 오해받는 Javascript다. 실제로 둘은 전혀 다른 언어다. Javascript는 웹 브라우저에서 사용 가능한 사실상 유일한 언어다. 그만큼 웹 분야에서 영향력이 강하다. 웹 분야를 도전해보고 싶다면 반드시 배워야 하는 언어 중 하나다. 하지만 유용성과 별개로 언어 자체는 매우 정신없다. 10일 만에 설계했다는 썰에서 알 수 있듯이 뭔가 뒤죽박죽 섞여 있는 느낌이 드는 언어다. 그래서 개념이 확실히 잡히지 않은 입문자에게는 추천하고 싶지 않다. 

Go

C++의 장점은 챙기고, 단점은 버린 강력하고 깔끔한 언어다. 실제 네이버에서 기존 C++로 제작한 검색 서비스에 Go를 도입하는 시도가 있었다. Go를 활발히 사용 중인 국내 기업으로는 당근마켓이 있다. 주로 백엔드, DevOps 등 분야에서 사용 중이다. 하지만 2009에 발표한 신생 언어다 보니 아직은 C++에 비해 사용분야가 제한적이다. 필자가 가장 애정하는 언어이기도 하다.

관련 글: Go를 공부하는 이유

Kotlin / Swift

Kotlin은 안드로이드 앱, Swift는 iOS 앱 개발에 사용된다. 필자가 앱 개발은 잘 모르니 다른 전문가분들 블로그를 참고해 주길 바란다...


본 글을 모두 이해했다면 언어를 공부하다가 "어! 이거 아는건데?"하는 순간들이 생길 것이다. 이제 본인에게 맞는 언어를 선택해 학습하면 된다.