자동차 자율주행, 고양이 사진인식, 이미지 자막 넣기 (Image Captioning)등 최근 머신러닝이 보여주는 엄청난 성과를 보면 머신러닝이 고도의 수학적 배경과 정교한 알고리즘으로 무장해 내가 원하는 많은 문제를 해결할 것으로 믿을 수도 있습니다. 하지만 아직까지 머신러닝이라는 마법으로 해결할 수 없는 문제가 많지 않으며, 그마저도 엄청난 노력과 시간을 대가로 요구합니다.
머신러닝을 적용해 무언가에 대한 결과를 얻는 것은 생각보다 많은 시간이 필요합니다. 하나의 완성물을 얻으려면 수십 번, 수백 번 반복을 통해 조금씩 개선해가고, 때에 따라서 모델을 새롭게 만들거나 전혀 새로운 시각으로 접근해야 합니다. 더욱 머신러닝으로 특정문제를 해결하려면 그 특정 문제를 머신러닝에 적합한 형태로 바꿔야 원하는 결과를 얻을 수 있습니다. 따라서 머신러닝을 제대로 활용하려면 머신러닝이 잘 할 수 있는 것과 그렇지 않은 것을 아는 것이 중요합니다.
스팸메일을 필터링하고, 글자와 음성을 인식하는 머신러닝을 보면 다양한 일을 처리할 수 있을 것이라 생각하겠지만, 크게 3 가지 종류의 일을 처리할 수 있습니다. 변수 간의 관계를 파악하는 회귀(Regression), 데이터를 분류하는 분류(Classificaiton), 데이터를 연관있는 것끼리 묶어주는 군집화(Clustering)이 있습니다.
머신러닝은 이 3 가지를 이용해 다양한 문제를 해결합니다. 회귀와 분류는 모든 머신러닝 알고리즘의기본이 되는 중요한 개념입니다.
※ 오늘은 '머신러닝이 할 수 있는 것'에 대하여 알아보았습니다.
이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 인공지능, 머신러닝 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.
사람이 입력과 출력을 모두 제공하는 지도학습(Supervised Learning), 입력만 제공하는 비지도학습(Unsupervised Learning), 어떤 환경에서 특정목표를 달성하기 위해서 스스로 학습하는 강화학습(Reinforcement Learning)입니다.
현시점에서 활용빈도로 보면 지도학습이 가장 많고, 그 다음이 비지도학습, 마지막은 강화학습이 되겠습니다.
1) 지도학습 (Supervised Learning)
- 지도학습은 가장 많이 활용되는 머신러닝의 종류로 스팸메일 필터링, OCR 문자 인식 등이 이에 해당됩니다. 지도학습은 머신러닝에 입,출력을 모두 제공하여 학습하게 하는 거승로, 일종의 최적 (Optimization) 문제로도 생각을 할 수 있습니다. 이는 지도학습 알고리즘이 주어진 입력값을 분석해 출력값을 만들어내기 위한 최적의 모델을 만들기 때문입니다. 예를 들어, 고양이의 이미지를 구분할 수 있는 머신러닝 프로그램을 개발한다고 가정을 합니다. 지도학습은 입력과 출력을 모두 제공해야 하므로 고양이 사진과 함께 고양이라는 것을 알려주어야 합니다. 고양이가 있는 사진에 '고양이'라는 출력 결과도 같이 제공해야 합니다.
따라서 지도학습에서는 하나의 데이터는 입력과 출력이 같이 묶여있는 튜플(Tuple)형태로 이루어집니다.
2) 비지도학습 (Unsupervised Learning)
- 위에서 설명한 지도학습이 입력을 분석해 출력을 만들어내는 최적화 문제라면 비지도 학습은 입력 데이터의 구조를 파악하거나 관계를 분석하는 방법이라고 할 수 있습니다. 비지도 학습은 '지식 발견 (Knowledge Discovery)'라고도 하는데, 이는 학습결과로 생각하지 못한 지식을 발견하거나 입력 데이터 간의 그룹 또는 특성 들을 발견할 수 있어서입니다.
지도학습과 구분되는 또 하나의 특징은 학습결과에 대한 평가가 힘들다는 점이 있습니다. 이는 학습결과가 명확한 목적, 즉 출력이 없어서 평가기준을 잡을 수 없기 때문입니다. 지도학습에서 데이터를 제공할 때 하나의 데이터마다 입력과 출력이 튜플로 제공되지만, 비지도 학습에서는 출력 없이 입력만 제공됩니다.
앞의 지도학습에서는 고양이 사진과 이름이 주어졌지만, 다음 그림처럼 비지도학습에서는 이름 없이 고양이 사진만으로 학습이 이루어집니다.
※ 오늘은 '머신러닝의 종류'에 대하여 알아보았습니다.
이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 인공지능, 머신러닝 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.
머신러닝에 대한 개념이나 각종 성공사례를 처음 접하면 머신러닝이 마치 천하의 보검처럼 느껴져 어떠한 문제라도 머신러닝으로 해결할 수 있을 것 같은 느낌을 받습니다. 그리고 예제로 제공되는 코드들을 실행해보면 그리 길지 않은 코드로 신기하게 그림에서 문자를 인식하고 아이리스 꽃의 종류를 분별하는 등, 기존 프로그래밍 방법으로는 막막한 것들을 너무도 쉽게 해내 놀랍기 그지없습니다.
하지만 머신러닝은 한 번 휘두르면 모든 적을 제압할 수 있는 천하의 보검이 아니라는 것을 분명히 알고, 역시 예제는 예제라는 만고의 진리를 깨닫게 되는 데는 그리 오랜 시간이 걸리지 않을 것입니다. 이러한 결과는 머신러닝에 사용한 데이터가 잘못되었거나 엉뚱한 알고리즘을 적용하였거나 머신러닝에 적합하지 않은 문제 때문에 벌어졌을 가능성이 큽니다.
머신러닝을 제대로 사용하려면 머신러닝의 장단점을 파악해 해결하려는 문제가 머신러닝에 적합한 것인지, 적합하지 않은 것이라면 어떻게 문제를 재정의해야 하는지, 어떤 데이터를 사용해야 하는지 등을 고민해봐야 할 것입니다.
※ 머신러닝의 장점
1) 학습을 위해 지식 표현이 필요 없습니다. 컴퓨터가 지식을 이해하게 하기 위한 표현은 어려운 문제입니다.
2) 충분한 데이터와 적합한 알고리즘을 사용한다면 사람이 만든 모델보다 좋은 결과를 보여줄 수 있습니다.
3) 고도의 수학적 지식이나 프로그래밍 능력을 요구하지 않습니다. 기본적인 지식과 능력으로도 충분히 머신러닝을 이용할 수 있습니다.
4) 자동화가 가능합니다. 프로그램으로 머신러닝을 학습시키고 최적의 파라미터를 찾아 그 결과에 대한 평가 등을 자동화하여 진행할 수 있습니다.
5) 저렴하고 유연합니다. 데이터를 제외한 나머지 과정은 자동화가 가능하므로 저렴하게 실행할 수 있습니다.
6) 프로그램을 이용해 자신이 원하는 대로 사용할 수 있습니다.
※ 머신러닝의 단점
1) 데이터 준비에 많은 노력이 들어갑니다. 지도학습(Supervised Learning)의 경우 모든 개별 데이터에 결과치를 만들어 주어야 합니다.
2)오류 발생이 쉽습니다(Error Prone). 일반적으로 정확도가 높은 모델을 만들기가 어렵습니다.
3) 생성된 모델이 블랙박스(Black Box)이기 때문에 이를 해석하기 어렵습니다. 정확도를 높이려면 모델을 수정하거나 개선할 수 있어야 하는데, 대부분의 머신러닝 알고리즘은 학습결과로 생성된 모델을 이해하기 어렵고 모델 자체를 개선할 수 없습니다.
4) 과적합(Overfitting) 문제가 종종 발생합니다. 주어진 데이터에 너무 최적화되어 학습에 사용된 데이터는 높은 예측력(Predictive Power)을 보여주지만, 그렇지 않은 데이터에는 좋지 않은 예측력을 보여줍니다.
※ 오늘은 '머신러닝의 장.단점'에 대하여 알아보았습니다.
이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 인공지능, 머신러닝 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.
머신러닝(Machine Learning)은 우리의 통념보다 오래된 기술이고, 이미 우리가 사용하는 많은 서비스와 상품에 직,간접적으로 활용되고 있습니다. 매일 쏟아지는 스팸메일로부터 우리를 보호하는 스팸메일 필터링 기술, 전자상거래 사이트에서 적합한 물건을 추천해주는 서비스, 애플의 시리와 같이 사람의 음성을 듣고 이를 인식하는 서비스 등 우리 곁에는 많은 서비스가 자리를 잡고 있습니다.
"머신러닝은 인공지능의 패턴인식과 계산학습 이론에서 발전한 컴퓨터과학의 한 분야다. 머신러닝은 데이터로부터 학습하고, 예측할 수 있는 알고리즘을 연구한다. 이러한 알고리즘은 정적으로 주어진 프로그램이 아닌 입력된 데이터로부터 모델을 만들어 예측이나 결정을 내린다" (wiki)
여기서 알 수 있듯이 머신러닝의 정의에서 제일 중요한 부분은 주어진 데이터를 이용해 스스로 학습하고 적합한 모델을 만든다는 점입니다. 일반적으로 컴퓨터로 어떤 일을 하게 하려면 사람이 컴퓨터에 소상히 Input(데이터는 무엇인지), Program(이런 데이터가 들어오면 어떻게 처리해야 하는지), Output(결과를 어떻게 표현해야 하는지) 등을 모두 정의해야 합니다.
컴퓨터가 이해할 수 있도록 정의하는 것이 프로그래머가 프로그램을 개발하는 과정이며 Input(입력), Program(프로그램), Output(출력)을 어떻게 처리해야 하는지 명령어를 이용해 코딩을 합니다. 컴퓨터는 지능이 없으므로 입력, 프로그램, 출력에 대한 상세한 내용을 논리적 모순 없이 프로그램으로 작성해야만 원하는 결과를 얻을 수 있습니다.
하지만 머신러닝에서는 전혀 다른 방법을 적용하고 있습니다. 사람은 입력과 출력만 제공하고, 프로그램은 머신러닝 스스로 만들게 하는 것입니다. 적절한 데이터가 준비되어 있다면 기존의 접근방법에서는 프로그램을 작성하는 데 상당한 노력과 시간을 보내야 하지만, 머신러닝 접근방법에서는 이러한 수고가 필요가 없습니다. 원하는 결과를 머신러닝에 출력으로 지정하면 나머지 작업은 머신러닝에 의해 스스로 프로그램을 작성하기 때문에 사람은 충분한 양의 잘 정돈된 데이터와 머신러닝을 적용하는 데 필요한 컴퓨팅 파워만 제공해주면 됩니다.
다음은 머신러닝의 접근방법과 기존 접근방법을 보여주는 그림으로, 각 접근방법이 어떻게 다른지를 확실히 보여주고 있습니다.
머신러닝은 데이터에 기반을 두기 때문에 계산 통계(Computational Statistics)와 많은 연관성이 있습니다. 데이터로부터 학습한다는 것은 머신러닝의 관점에서 보면, 주어진 데이터를 이용해 확률을 계산하고 특정 데이터를 줬을 때 이미 과거의 데이터를 이용해 계산된 확률로 결과치를 만들기 때문입니다.
이러한 특성은 머신러닝에서 데이터가 얼마나 중요한지 강력하게 알수 있습니다. 아무리 좋은 머신러닝 알고리즘이라 하더라도 제공되는 데이터의 양이 적절하지 않거나 품질이 떨어진다면 결코 좋은 결과를 기대할 수 없습니다. 그 유명한 'Garbage in, Garbage Out' 원칙은 머신러닝에서도 당연히 적용됩니다.
데이터가 머신러닝 결과물에 막대한 영향을 미치기 때문에 머신러닝에서는 데이터를 탐색하고 정리하는 데이터 마이닝(Data Mining)이 아주 중요합니다. 데이터 마이닝을 통해 입력 데이터로 사용할 적합한 입력변수를 선택하고, 이 입력변수에 빠진 데이터를 보충하거나 이상치(Outlier)를 제거하고, 적절한 양의 데이터를 선택하는 과정이 사실상 머신러닝에서 제일 중요한 과정이어서 그 중요성은 아무리 강조해도 지나치지 않습니다.
※ 오늘은 '머신러닝이란 무엇인가?'에 대하여 알아보았습니다. 다음 번 포스트에는 머신러닝의 장단점 에 대하여 다루어 보겠습니다.
이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 인공지능, 머신러닝 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.
*옵션을 사는 것은 옵션을 매수하는 것이고, 옵션을 파는 것은 옵션을 매도하는 것입니다. 옵션 매수자는 옵션가격을 지불하고, 옵션 매도자는 옵션 매수자가 지불한 옵션가격을 수령합니다. *
옵션에는 콜 옵션 (Call Option)과 풋 옵션 (Put Option)이 있습니다. 콜 옵션과 풋 옵션은 다음과 같이 직관적으로 이해할 수 있습니다. 친구들과의 포커게임에서 일명 '레이싱'이라는 것을 할 때, "콜(Call)" 이라고 말하면, 상대방의 베팅을 받겠다는 것을 의미합니다. '받겠다'는 것은 받아들이겠다는 것으로 '사겠다'는 뜻과 비슷합니다. 따라서 콜옵션은 '살 수 있는 권리'를 의미합니다. 반면에 풋옵션에서 'put'은 '두다', '내려놓다' 의 의미를 가지고 있습니다. '내려놓다'는 것은 '가져가게 둔다' 는 것으로 '팔겠다'는 뜻과 유사합니다. 따라서 풋옵션은 '팔 수 있는 권리'를 의미합니다.
콜옵션을 매수한 사람은 만기에 기초자산의 가격이 비쌀수록 좋습니다. 만약 기초자산의 가격이 크게 올랐다면, 옵션계약에 따라 싼 행사가격(Striking price)에 기초자산을 저렴하게 매입한 후 바로 매도해 큰 수익을 실현할 수 있기 때문입니다.
예를 들자면, 만약 현재 1주당 10만원 짜리 주식을 1년 후에 1주당 11만원에 살 수 있는 콜옵션을 매수했다고 가정을 해봅시다. 1년 후에 주가가 12만원이 되면, 콜옵션 매도자로부터 11만원에 100주를 산 후 (콜옵션 행사), 바로 시장에 12만원에 매각해 100만원 ((12만원 - 11만원) * 100주)의 수익을 올릴 수 있습니다.
반면에 주가가 하락해 9만원이 될 경우 콜옵션을 행사하지 않으면 됩니다. 콜옵션을 행사하지 않을 경우, 콜옵션 매수자는 이미 지불한 옵션 가격만큼 손실만 부담하면 됩니다.
반면 풋옵션을 매수한 사람은 만기에 기초자산의 가격이 쌀수록 좋습니다. 만약 기초자산의 가격이 크게 떨어졌다면, 시장에서 크게 떨어진 가격으로 기초자산을 저렴하게 매입한 후 옵션계약에 따라 만기 때의 시장가격보다 비싼 행사가격에 풋옵션 매도자에게 기초자산을 매도해 큰 수익을 실현할 수 있기 때문입니다.
예를 들자면, 만약 현재 1주당 10만원짜리 주식을 1년 후에 1주당 11만원에 100주 팔 수 있는 풋옵션을 매수했다고 가정을 해봅시다. 1년 후에 주가가 하락해 1주당 9만원이 되면, 풋옵션 매수자는 시장에서 9만원에 100주를 구입한 후, 풋옵션 매도자에게 11만원에 매각해 (풋옵션 행사) 200만원 ((11만원 - 9만원) * 100주)의 수익을 올릴 수도 있습니다.(엄밀하게 말하자면, 200만원에서 옵션가격을 뺀 금액입니다).
반면에 주가가 상승하여 12만원이 되면 풋옵션을 행사하지 않으면 됩니다. 풋옵션을 행사하지 않을 경우, 풋옵션 매수자는 이미 지불한 옵션가격만큼의 손실만 부담하면 됩니다.
그럼 옵션가격은 어떻게 계산되고 결정되는 걸까요? 이러한 문제를 해결하기 위해 등장한 것이 바로 그 유명한 블랙숄즈모델입니다. 금융공학에서는 블랙숄즈 방정식이라고도 하고, 블랙숄즈 이론이라고 불리기도 합니다. 블랙숄즈 모델은 콜옵션, 풋옵션등의 옵션가격을 계산하기 위해 만들어진 모델입니다. 블랙숄즈 모델로 계산된 옵션의 가격을 공정가격(fair price) 또는 이론가격이라고 부릅니다.
(참고로 옵션의 이론가격과 실제 시장가격 간의 차이를 이용해 차익을 실현하는 거래는 아비트라지(Arbitrage) 재정거래 또는 무위험 차익거래라고 불립니다.)
블랙숄즈 모델의 핵심 내용은 크게 2가지로 요약할 수 있습니다.
1. 옵션계약의 만기일이 가까워질수록 시장의 불확실성이 줄어들기 때문에, 시간의 흐름에 따라 옵션가격은 낮아진다.
2. 기초자산의 가격의 변화에 따라 옵션가격도 변한다.
옵션에 대한 이야기를 마치기에 앞서 등가격, 내가격, 외가격 등에 대하여 설명하겠습니다. 등가격 (at the money)이란
옵션의 행사가격이 기초자산의 가격과 같을 때 쓰는 용어입니다. 그리고 콜옵션의 경우, 기초자산의 가격이 옵션의 행사가격보다 높으면 내가격 (in the money), 기초자산의 가격이 옵션의 행사가격보다 낮으면 외가격 (out of the money) 이라고 합니다.
반면 풋옵션에서의 내가격과 외가격은 콜옵션과 반대로 생각하면 됩니다. 기초자산의 가격이 옵션의 행사가격보다 낮으면 내가격, 기초자산의 가격이 옵션의 행사가격보다 높으면 외가격이라고 합니다.
일찍이 기원전 300년경에 그리스 수학자 유클리드(Euclid)가 제시한 이 알고리즘은 두 개의 수의 최대 공약수를 구하는 절차입니다. 조금 더 구체적으로 표현하자면 유클리드 알고리즘은 반복 절차입니다. 이 말은 즉, 결과에 도달할 때까지 동일한 수학적 연산이 계속 반복되는 것입니다.
예제로 a=1513과 b=357의 최대공약수를 구해보겠습니다. 먼저, 큰 수를 작은 수로 나눌 때 나오는 나머지 r₁을 알아내야 합니다. 이 예제에서는 r₁은 85입니다.
1513= 4 * 357 + 85
이번에는 작은 수 b를 r₁으로 나눌 때 나오는 r₂를 구합니다.
357 = 4 * 85 + 17
이러한 작업을 계속 반복하게 됩니다. 항상 작은 수(이 단계에서는 r₁)를 나머지 (r₂)로 나누는데, 나눗셈의 나머지가 0이 될 때까지 이 작업을 반복하게 됩니다. 이 예에서는 벌써 다음 단계에서 나머지가 0을 가지게 됩니다.
85 = 5 * 17 + 0
17은 앞서 등장한 모든 나머지들의 약수이며 a와 b의 약수이기도 합니다. 정확히 말하자면 17은 a와 b의 최대공약수입니다.
유클리드 알고리즘은 두 수를 우선 소인수분해한 다음에 그 소인수들을 비교하는 방법보다 더 신속하고 깔끔하게 최대 공약수 구하기 문제를 해결할 수 있습니다. 게다가 유클리드 알고리즘은 정수가 아닌 수에도 적용할 수 있습니다. 임의의 수들의 "공통 단위"를 유클리드 알고리즘으로 구할 수 있습니다. 하지만 이 알고리즘이 항상 유한한 개수의 단계를 거쳐 최종 결과에 도달하는 것은 아닙니다. 1과 √2에 유클리드 알고리즘을 적용하면, 나머지들이 점점 더 작아지기는 하지만
나눗셈의 나머지가 0으로 되는 일은 끝내 일어나지 않을 것입니다. √2처럼 통약불가능한 수들이 존재한다는 깨달음은 온 세계를 자연수들의 비율로 기술할 수 있다는 피타고라스 추종자들의 세계관을 무너뜨렸습니다.
※ 오늘은 '유클리드 알고리즘'에 대하여 알아보았습니다.
이 포스트는 학부에서 제공하는 기본적인 강의와 컴퓨터 공학 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 알고리즘 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.
4차 산업혁명 시대를 맞아 우리는 컴퓨터를 통해 활발하게 일상의 불편함을 해결하고 있습니다. 우리가 컴퓨터를 통해 문제를 해결한다는 것은 인간과 컴퓨터가 의사소통을 한다는 것을 의미합니다. 의사가 소통을 하는 데는 언어가 필요한데 컴퓨터와 인간이 사용하는 언어는 다르기 때문에 이를 번역해주는 컴파일러가 필요합니다. 이번 포스트에서는 컴파일러의 필요성에서 대해서 간략히 설명할 것입니다.
많은 사람들은 왜 컴파일러를 사용해야 하는지, 컴파일러가 무슨 일을 하는지 잘 모른 채 컴파일러를 사용해 개발을 하고 있습니다.
인간이 컴퓨터에게 일을 시키려면 컴퓨터와 인간이 서로 이해할 수 있는 공통적인 대화 수단이 필요합니다. 이러한 대화 수단을 언어(language)라고 하는데, 언어는 의사소통을 하는 대상이 누구냐에 따라 자연 언어(natural language)와 형식 언어(formal language)로 나뉘게 됩니다. 자연 언어는 한국어, 영어, 중국, 프랑스어, 일본어 등 인간과 인간이 의사소통을 하는 언어로서 지역이나 민족에 따라 자연 발생적으로 생성된 언어입니다.
반면에 형식 언어는 인간과 기계 사이에 의사소통을 하는 언어로서 인위적으로 만들어진 언어입니다. 이 포스트에서는 컴퓨터와 의사소통과 관련된 내용을 설명할 계획이므로 자연 언어보다는 형식언어에 관심을 중점을 둘 것입니다.
미국 언어학자이자 MIT 공대 교수인 노암 촘스키(Noam Chomsky)는 형식 언어를 4 가지로 분류했는데 그 종류와 관계는 아래의 그림과 같습니다.
형식 언어 중에서 컴퓨터와의 의사소통에 사용되는 언어를 '컴퓨터 언어' 혹은 '프로그래밍 언어(Programming language)'라고 합니다. 프로그래밍 언어는 현실 세계에 존재하는 어떤 문제를 풀기 위한 일련의 과정을 기술하는데 사용하는 것으로 사용 목적, 형태와 기능, 세대 등에 따라 여러 가지로 분류할 수 있습니다. 먼저 형태와 기능에 따라 저급 언어(Low-level langauge)와 고급 언어(High-level language)로 나뉩니다.
저급언어에는 기계어(Machine language)와 어셈블리어(Assembly language) 등이 있습니다. 프로그래밍 언어 중에서 초기에 사용된 언어는 0과 1로 구성된 기계어였습니다. 초기에 기계어를 주로 사용한 이유는 컴퓨터가 0과 1로 만들어진 추상 기계(Abstract machine)이기 때문이었습니다. 그러나 기계어로 프로그래밍을 하는 것은 상당히 어렵고 매우 복잡하다는 단점이 있어 이를 보완하기 위해 나온 언어가 어셈블리어입니다.
어셈블리어는 0과 1로 구성된 기계어 대신 더하기에 ADD, 빼기에는 SUBT 등 대응하는 명령 기호를 사용함으로써 프로그래밍 작업에서 기계어의 단점을 조금 보완했습니다. 하지만 여기서 문제가 발생하게 됩니다. 인간이 어셈블리어를 사용하여 문제를 서술하고 나니 컴퓨터가 이것을 이해하지 못하였습니다. 이해할 수 있는 언어가 달랐기 때문입니다.
이를 쉽게 이해하기 위해 자연 언어를 빗대어 살펴보겠습니다. 예를 들어 프랑스어를 모르는 한국인과, 한국어를 모르는 프랑스인이 서로 만나 인사를 한다고 가정을 해보겠습니다. 서로 말을 알아듣지 못하니 통역사가 필요한데, 이러한 통역사는 아래의 그림과 같이 번역기(Translator)의 역할을 수행하게 됩니다. 앞서 언급한 어셈블리어를 기계어로 번역해주는 번역기는 어셈블러(Assembler)라고 합니다.
그러나 어셈블리어도 저급 언어의 수준을 벗어나지는 못했으며, 그 후 저급 언어의 단점을 보완하기 위해 C,파스칼,알골,포트란,코볼 등 사람 중심의 고급 언어가 나오게 되었습니다. 한편 고급 언어도 저급 언어와 마찬가지로 기계어를 변환해주는 번역기가 필요한데 이를 '컴파일러'라고 합니다.
★ 컴파일러가 필요한 이유는 다음과 같이 정리할 수 있습니다.
인간은 문제를 해결하기 위해 컴퓨터를 사용하며 컴퓨터와 의사소통을 하는데 '언어'가 필요합니다. 컴퓨터는 기계어를 사용하지만 인간이 기계어를 사용하여 문제를 표현하기란 무척 어렵기 때문에 인간은 사람 중심 언어인 고급 언어를 사용합니다. 그런데 인간이 사용하는 고급 언어는 컴퓨터가 이해하지 못합니다. 따라서 인간이 사용하는 고급언어를 기계어로 변환해주는 컴파일러가 필요한 것입니다.
※ 오늘은 '컴파일러는 왜 필요할까?'에 대하여 알아보았습니다.
이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 컴파일러 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.
사람이 가장 잘 이해할 수 있는 프로그래밍 언어(Python, Java, C++, C#, C, Ruby, Go)언어로 작성한 프로그램이라도 컴파일러가 이해할 수 있는 컴퓨터를 위한 기계어로 번역할 수 있습니다. 따라서 사용자는 번역기가 제공하는 프로그래밍 언어의 문법에 맞게 프로그램을 작성해야 합니다.
프로그래밍 언어가 요구하는 문법을 나열하는 것을 서술(Statement)형식이라고 합니다. C 언어도 몇 가지 서술 형식을 가지고 있습니다.
◎ C 언어의 기본 서술 형식
1) 단일 서술문
단일 서술문(Single Statement)은 논리적인 최소 명령 실행 단위입니다. 즉 한 개의 서술문 단위로 작업이 진행됩니다. C 언어는 ; (세미콜론)으로 문장을 구분하며 Java, Python등의 프로그래밍 언어또한 논리는 똑같습니다. ; (세미콜론)으로 문장을 구분하기 때문에 한 줄에 여러 개의 서술문은 쓸수도 있습니다.
ex)
a = a + 30; /* 한 줄로 이루어진 단일 서술문 */
a = a + 30; /* 두 줄로 이루어진 단일 서술문 */
a = a + 30; b = b + 50; /* 한 줄에 두 개의 단일 서술문을 사용합니다. */
위의 예와 같은 표현법은 모두 가능하며 총 4가지의 서술문을 사용한 것입니다.
※ 주의: C 언어 및 다른 프로그래밍 언어에서 코드를 작성할시에 문장을 마무리 할 때 반드시 ; (세미콜론)을 사용해야 합니다. ; 을 사용하지 않으면 프로그램이 제대로 실행되지 않고 오류가 발생하게 됩니다
2) 복합 서술문
복합 서술문(Compound Statement)은 여러 단일 서술문을 { } 중괄호를 사용해 하나로 묶은 형태입니다. 중괄호의 안의 단일 서술문이 모두 수행되면 이 복합 서술문이 수행된 것으로 처리가 됩니다. 예를 들어 아래의 사진과 같이 적으면 단일 서술문 2개를 사용한 것이 아니라 복합 서술문 1개를 사용한 것입니다.
{ a = a + 30; /* 주의 단일 서술문 뒤에는 항상 ;(세미콜론)을 찍어주어야 함 */
b = b + 50; } /* bracket { }뒤에는 찍어줄 필요가 없음 */
복합 서술문은 { } 중괄호를 사용하기 때문에 자신의 영역이 구분이 됩니다. 따라서 ; (세미콜론)을 사용할 필요가 없습니다. 하지만 다음과 같이 } (닫는 중괄호) 뒤에는 ; (세미콜론)을 사용해도 오류가 나지 않는데, 이것은 복합 서술문을 사용한 후 의미 없이 단일 서술문 1개를 적은 것으로 간주되기 때문에 정상적인 사용방식은 아닙니다.
{ a = a + 30; }; /* 의미 없는 단일 서술문
◎ 역할에 따른 서술 형식
1) 수식 서술문
수식 서술문(Expression Statement)은 계산 수식을 표현한 단일 서술문입니다. 앞에서 단일 서술문 설명을 위해 예로 든 내용도 수식 서술문에 해당합니다. 두 값을 평균을 내는 수식을 구성해 보면 아래의 예제와 같습니다.
average = (a + b) / 2; /* 프로그래밍에서는 나눗셈 기호를 계산기와 같이 / 로 사용합니다.
2) 조건 서술문
조건 서술문(Selection Statement)은 조건을 만족하면 지정한 서술문을 수행하도록 작성한 서술문입니다. 어떤 값이 5보다 크면 해당 값을 0으로 변경하는 조건문을 구성해 보면 아래의 예제와 같습니다.
if(a > 5) a = 0;
3) 반복 서술문
반복 서술문(Iteration Statement)은 단일 서술문 또는 복합 서술문을 반복해서 수행하도록 작성한 서술문입니다. 이 소스 코드는 0에서 4까지 더하는 기능을 반복문을 사용해 구성한 것입니다.
int sum = 0, i; for(i = 0; i < 5; i++) sum = sum + i;
4) 라벨 서술문
라벨 서술문(Labeled Statement)은 소스 파일의 특정 위치에 라벨을 지정하고 goto문을 사용해 그 위치로 이동할 수 있도록 작성한 서술문입니다. C 언어가 만들어진 초창기에 기존 프로그래밍 언어를 사용하던 프로그래머들이 쉽게 C 언어로 유입될 수 있도록 제공한 서술문입니다. 그러나 원칙 없이 프로그래머가 원하는 위치로 실행 지점을 이동하는 것은 구조화된 언어인 C 언어의 소스 코드 구성을 파괴할 수 있는 문법이기 때문에 되도록 사용하지 않는 것이 좋습니다.
if(a > 0) goto EXIT; /* 이동(라벨이 표기된 곳으로) */ a = a - 1; EXIT; /* 라벨 */
5) 분기 서술문
분기 서술문(Jump Statement)은 자신이 소속된 서술문을 벗어나거나 흐름을 바꾸어 놓을 때 사용합니다.
break, continue와 같은 문법들이 분기 서술문에 해당하는데 return문, goto문처럼 실행 흐름을 마음대로
조정(서술문의 범위를 마음대로 벗어날 수 있음) 하는 것이 아니라 특정 조건 서술문이나 반복 서술문 안
프로그래밍을 하다 보면 상황을 설명하거나 작업 내용을 기억하기 위해 소스 파일에 메모를 남겨야 하는 경우가 있습니다. 이럴 때 주석문(Comment)를 사용하면 됩니다.
주석문은 /* 기호로 시작해서 */ 기호로 끝나고, 여러 줄에 걸쳐서 사용할 수 있습니다. 또 이 기호가 표시된 부분은 컴파일러가 번역을 하지 않으므로 어떤 내용을 적어도 상관없습니다. 다음과 같이 소스코드에 주석문을 적절히 사용하면 코드의 가독성이 좋아집니다.
average = (a + b) / 2;
/* a , b의 평균값을 계산하여 average에 저장합니다 */
※ 오늘은 C언어 프로그래밍에서 'C언어의 서술형식'에 대하여 알아보았습니다.
이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.
옵션(Option)의 사전적 의미는 '선택할 수 있는 것' 또는 '선택할 수 있는 권리' 입니다. 금융공학에서의 옵션은 후자인 '선택할 수 있는 권리'에 가깝습니다. 권리이기 때문에 어떤 옵션거래 계약을 하고 만기가 되었을 때, 계약대로 해도 되고 안 해도 되는 것을 의미합니다. 옵션을 구매한 사람의 자유입니다.
즉 선택할 수 있는 권리가 있는 것입니다. 권리를 행사해도 되고, 행사하지 않아도 되는 것입니다. 따라서 선택을 하지 않아도 ( 권리를 행사하지 않아도) 아무런 불이익이 주어지지 않는 것입니다. 선물(Futures)과 비교하면 이해가 더 쉽습니다. 선물은 만기가 되면 계약 당사자들이 반드시 그 선물계약을 이행해야 합니다. 반면에 옵션은 이행을 하든 안하든 상관이 없습니다. 옵션을 구매한 당사자에게 이행여부에 대한 선택권이 있는 것입니다.
예를 들어 어떤 여자가 고시생 남자와 연애를 할 것인가 말 것인가를 결정하는 것도 옵션과 비슷한 맥락입니다. 여자는 3년 후에 고시생 남자와 (합격여부와 관계없이) 결혼을 할 수 있는 권리를 가지고 있다고 가정을 합니다. 여자가 이 옵션을 얻기 위해 지불한 비용(옵션가격)은 3년 동안 연애하며 뒷바라지에 쓴 돈과 시간이 있을 것입니다. 옵션가격은 권리에 대한 대가를 뜻합니다.
조금 냉혹하게 드릴수도 있는 비유지만, 이 사례에서 고시생 남자는 기초자산에 해당됩니다. 남자가 고시에 합격하더라도 여자를 찰 수 없으며, 여자의 선택에 따라야 합니다. 이것이 연애(옵션거래)의 조건입니다. 이러한 조건 하에서 여자는남자가 고시에 불합격할 경우, 그 동안의 정을 생각해 결혼을 할 수도 있고, 아니면 고시에 불합격했으므로 바로 차버릴 수도 있습니다. 또한 만약 남자가 합격할 경우, 여자는 예상대로 남자와의 결혼을 선택할 수도 있고, 아니면 남자의 사랑이 변했다고 생각해 결혼을 하지 않을 수도 있습니다.
이러한 경우뿐만 아니라, 일정 기간 연애를 한 후 결혼할 것인지 말 것인지를 선택하는 것은 모두 다 옵션의 거래구조와 비슷하다고 생각하면 됩니다. 연애 기간 동안 들인 공 (시간과 돈)은 옵션가격(Option Price)에 해당되며, 연애 당사자들 본인은 기초자산이 되는 것입니다. 진짜 옵션거래와의 차이가 잇다면, 연애 당사자 모두 결혼여부를 선택할 수 있는 권리를 가진다는 것입니다. 즉 2명의 연애 당사자 모두 옵션가격을 지불하고 옵션을 구매한 사람이 되기 때문에, 결혼 여부 선택시점에서 상대방(기초자산)의 가치를 보고 결혼여부를 결정하게 됩니다.
일상생활에서의 대표적인 옵션거래는 TV 홈쇼핑이나 인터넷 쇼핑몰에서 물건을 구매하는 행위가 있습니다. 왜냐하면 물건을 직접 받아본 후 구매여부를 결정할 수 있는 선택권이 소비자에게 있기 때문입니다. 소비자는 TV 홈쇼핑이나 인터넷 쇼핑몰에서 즉시 물건을 주문한 후 물건을 받고 나서 살지 말지 구매결정을 내립니다. 여기서 기초자산은 주문한 물건이며, 옵션가격은 쇼핑하는 데 쓴 시간과 반품 시 택배 비용입니다. 물건은 받아본 후 구매하기로 선택했다면 (옵션 행사), 최종적으로 지불한 옵션가격은 쇼핑하는데 있어 들인 시간이 됩니다. 반면 구매하지 않기로 선택했다면 (옵션 미행사), 최종적으로 지불한 옵션가격은 쇼핑에 들인 시간과 반품 시 택배비용이 됩니다.