본문 바로가기
CS/Computer Basic

[CS/Basic] 컴파일 에러와 런타임 에러는 언제 발생하나?

by iosdevlime 2022. 12. 6.

프로그래밍 언어의 유형에 대해 지속적으로 살펴보고 있습니다.

 

지난 포스팅에서 프로그래밍 언어의 종류 및 특징을 아래와 같이 정리했습니다.

  • 패러다임
  • 방법 혹은 목적 (저 수준/고 수준)
  • 빌드(Build)유무 (컴파일 / 인터프리터)
  • 자료형 지정 유무

이번 시간에는 언어의 종류를 구분하는 특징 중

자료형 지정 유무란 분류에 따른 언어의 특징을 살펴보겠습니다.

 

다만, 단순히 두루뭉실한 개념이 아닌, 실제 코드를 작성해보고

이에 발생되는 Error를 통해 알아보고자 합니다.

 

 

 


 

 

 

 

Type Checking

정적/동적 언어의 분류 기준은 상수, 변수, 함수 등에 대한 타입을 확인하는 시점

 

앞서 포스팅에서 다룬

컴파일(Compiled), 인터프리터(Interpreter)언어에 대해 간단하게 짚고 넘어가보자면..

 

  • 컴파일 언어(Compiled Language)
    • 코드의 명령을 한데 모아놓고, 한 번에 실행(Build)
  • 인터프리터 언어(Interpreter Language)
    • 코드 한 줄, 한 줄마다 번역을 동시에 처리 (Build 과정 없음)

 

여기서, 컴파일 언어에 대한 다음과 같은 의문이 발생할 수 있습니다.

"밤새 노력해서 코드를 짰는데, 빌드(Build)시 오류가 나면 너무 아깝지 않을까?"

 

하지만, 다행히도 우리가 Swift를 활용해 코드를 작성할 때 문법 상 실수가 생기면

아래와 같은 빨간색 오류 가 줄 옆에 발생하는 것을 보실 수 있습니다.

 

Syntax Error!
Syntax Error!

 

Build 혹은 코드를 실행하기도 전에

친절하게 'someInt는 Integer 타입이므로, String 값이 올 수 없어!' 라고 알려줍니다.

 

 

이렇듯, Swift와 같은 컴파일(Compiled)언어의 경우

개발자가 소스코드를 작성을 완료하게 되면, 이를 목적코드(Object Code)변환할 시점에서

 

해당 변수/상수의 타입(Type)컴파일 시점(고 수준 ➟ 저수준)에서 파악하는 과정을 거치고,

적합하지 않다고 판단될 경우에 Error를 발생시키는 형태를 가지고 있습니다.

(위 예시에서 발생되는 오류는 'syntax Error', 즉 문법상 오류입니다)

 

 

 

 

정적타입 언어(Static Typed Language)

  • '정적타입' 언어란, 상수, 변수 혹은 함수의 타입을 컴파일시 결정하는 언어입니다.
    • 컴파일 시, 타입을 검사하기 때문에 추후에 발생할 여지가 있는 오류를 방지 할 수 있습니다.
    • 명시적으로 타입을 지정하였기 때문에, 코드 자체의 가독성이 매우 높습니다!
  • 대표적인 언어로는 C, C#, C++, JAVA, Swift가 있습니다.
더보기

Swift의 컴파일 오류(예시)

// 정적언어(Swift)

// 1. 컴파일 에러(Compiled Error) 발생
var someArray = [3,4,5]

someArray = false // Cannot assign value of type
someArray = "Lime" // Cannot assign value of type
someArray = 123 // Cannot assign value of type


// 2. 컴파일 에러(Compiled Error) 중 Type Checking 오류

var x: Int = 3
var x: Bool = true // Invalid redeclartion of 'x'

 

 

 

 

동적타입 언어(Dynamic Typed Language)

  • '동적타입' 언어는 타입체크(Type Checking)를 '실행'할 시점에서 결정합니다.
    • 프로그램을 실행하는 Runtime 시점에서 타입을 확인하므로, 컴파일 언어와는 반대입니다.
    • 즉, Runtime 에러 는 프로그램을 실행해야만 확인할 수 있습니다.
  • 소스코드를 작성하는 시점에서는 타입 없이 변수/상수/함수를 지정해도 무방합니다.
    • 동적타입의 언어는 인터프리터 언어의 특징과 유사하거나, 동일합니다.
    • '소스코드 한 줄, 한 줄마다 번역을 동시에 처리' 하는 특징과 연관되어 있습니다.

X란 변수는, 인터프리터에 의해 그때마다 타입이 변경되며, 런타임 단계에서야 결정됨
X란 변수는, 인터프리터에 의해 그때마다 타입이 변경되며, 런타임 단계에서야 결정됨

 

  • 정적 언어와는 달리, 타입을 설정하기 위해 많은 선택의 기회가 있습니다.
    • 상대적으로 코드가 간결하므로 상대적으로 학습하기에 매우 용이합니다.
    • 하지만, 반대로 Runtime시 예상치 못한 오류, 변수가 발생할 우려가 있습니다.
  • 대표적인 언어로는, JavaScript, Python, Ruby, SmallTalk 등이 있습니다.

 


이번 포스팅에서는 

 

정적, 동적타입의 언어의 유형과 특징을 비교해보고,

컴파일 및 런타임 오류의 개념에 대해 살펴보았습니다.

 


다음 포스팅에서는

 

프로그래밍 언어를 나누는 기준 중 하나로

'개발자가 소스코드를 작성할 시 어떤 기준을 삼고 있는가?' 와 관련된

프로그래밍 패러다임에 대해 구체적으로 다뤄보도록 하겠습니다.

 

 

 

댓글