[개발] 타입 없는 변수사용 (정적타이핑과 동적타이핑)

항해자·2023년 3월 27일
0

개발

목록 보기
1/2

변수를 선언할 때 언어에 따라 데이터 타입을 반드시 선언해야하거나 혹은 그렇지 않을때가 있습니다.

몇가지 개발언어별로 number라는 변수에 숫자 1을 넣어봅시다.

//PHP
$number = 1;
#python
number = 1
//javascript
let number = 1;
//JAVA
int number = 1;
//C++
int number = 1;

뭔가 다른점을 눈치 채셨나요?

주석과 세미콜론을 제외한다면 변수를 선언할 때 데이터형의 지정여부, 즉 위와 같은 예시에서 숫자1을 담을 변수 number의 데이터형은 정수이다. 라는 결정을 하였는가에 차이가 있습니다.

php, 파이썬, javascript 등은 변수의 데이터형을 지정하지 않아도 되는 동적타이핑(dynamic typing) 언어이며 java, c++ 등은 사용할 변수의 데이터형을 반드시 지정해야하는 정적타이핑(static typing) 언어 입니다. (javascript의 let은 데이터형이 아닌 변수의 유효범위. 즉 스코프를 결정하는 요소중 하나입니다.)


이 둘은 어떤 차이점이 있을까요, 그리고 장점과 단점은 무엇일까요

우선 동적타이핑언어에 대해 살펴 보겠습니다.

위에서 살펴보았듯이 동적타이핑(dynamic typing) 언어는 변수를 선언할때 데이터형을 지정하지 않아도됩니다.

대신 해당 변수에 할당된 값에 따라 자동적으로 변수의 데이터 타입을 결정하게 되며, 이미 값이 할당된 변수라고 할지라도 다른형태의 값을 재할당할 수도 있습니다. 변수의 데이터형은 소스코드의 실행시점 즉, 런타임 환경에서 결정된다고 생각하시면 됩니다. 아래와 같은 예시코드에도 문제가 발생하지 않습니다.

//php (dynamic typing language)
$data = 55;
$data = '나는 원래 정수였지롱';

이와 대척점에 서있는 개념인 정적타이핑(static typing) 언어는 변수를 선언할때 데이터형을 반드시 명시적으로 지정해야하며, 결정된 데이터형과 맞지않는 값을 할당하게 되면 오류가 발생하게 됩니다.

정적타이핑언어는 소스코드를 실행할때 컴파일과정을 거치게 되며, 이때 소스코드에 할당된 데이터형이 올바르게 결정 및 사용되고 있는지 함께 확인하게 됩니다.

따라서 아래와 같은 예시코드를 실행시 컴파일 오류가 발생합니다.

//java (static typing language)
int data = 55;
data = '나는 원래 정수였는데..'; //컴파일오류 발생 (정수형 변수에 문자열을 할당)

차이점 요약

내용동적타이핑정적타이핑
데이터형 검사실행시점에 발생한다컴파일시 발생한다
데이터형 명시필요하지 않다필수적이다
오류발견 시점실행 중 발생한다컴파일 중 발견할 수 있다
다른 데이터형의 할당가능한다불가능하다

차이점은 알았고, 이제 장단점은 무엇일까요?

동적타이핑

변수의 데이터형을 지정하지 않고 사용할 수 있다보니 유연성에 있어 큰 장점이 발생합니다. 굳이 데이터형을 명시하지 않아도 자동으로 런타임 시스템이 알아서 지정해주니까요.

  1. 자유로운 변수의 사용
  2. 그에따른 유연성과 작성시간 단축

하지만 자유롭게 사용할 수 있는만큼 단점도 있습니다.
실행시점에 데이터형을 결정하는것은 분명한 속도저하의 요인이 될 수 있습니다. 어쨌든 로직이 실행되고 있는데 시스템에 일을 더 시켰으니까요. 또한 코드의 가독성이 낮아질 수 있습니다. 변수안에 어떤 값이 들어있는지 (최소한 문자인지 숫자인지라도..) 추적이 어려울 수 있습니다. 값의 형태에 구애받지않는 무분별한 변수의 사용으로 오류가 발생할 가능성이 높아지는것도 사실입니다.

  1. 실행시 속도저하 발생
  2. 실행시 오류 발생 가능
  3. 변수의 추적이 어려울 수 있음

정적타이핑
가장 뛰어난 장점은 안정성과 성능에 있습니다. 실행시점이 아닌 컴파일러 단계에서 데이터형을 검사하기 때문에, 실행시점에서 데이터형의 불일치로 인한 오류의 발생확률을 줄일 수 있습니다. 또한 컴파일러에 의해 소스코드의 최적화가 이루어 지면서 속도상승을 기대할 수도 있습니다.

  1. 안정성과 성능
  2. 오류 발생확률 감소
  3. 속도상승 기대

그러나 이유가 어찌되었든 더 많은 코드를 작성해야하며, 작성속도가 더 느릴수 밖에 없습니다. 또한 데이터형을 지정해야 하기 때문에 자칫 코드의 가독성이 오히려 떨어지는 결과도 초래할 수 있습니다.

  1. 더 많은 소스코드 작성 필요
  2. 작성시간이 오래걸림
  3. 가독성이 오히려 떨어질 수 있음 (많은 코드로 인해)

그래서 어떤 언어를 사용해야 할까요? 동적? 정적?

뻔한 결말일 수 있습니다만, 운영중인 서비스에 따라 각 타입의 장점을 살펴보시고 결정하시는게 좋습니다. 이미 시장에 나와있는 서비스라면 어떤 환경에서 사용을 하고 있는지 파악해보시는것도 괜찮은 방법일겁니다. 두 가지 타입 모두 장/단점을 명확하게 가지고 있으며 내가 사용할 언어의 단점을 보완할 수 있는 방법을 검토하는과정도 반드시 필요한 단계일 것입니다.




그리고 어떤 언어를 선택한다해도...

데이터형의 관리에서 자유로운 개발자는 없습니다.

profile
웹개발자

0개의 댓글