동적 타입 언어와 정적 타입 언어

2023. 6. 5. 08:49JavaScript

동적 타입 언어와 정적 타입 언어 (22.02.16 작성)


C 나 JAVA 는 정적 타입 언어 이다.
변수를 선언할 때 변수에 할당할 수 있는 값의 종류, 즉 데이터 타입을 사전에 선언해야 한다. 이를 명시적 타입 선언 이라 한다.
정적 타입 언어는 변수의 타입을 변경할 수 없다.
변수에 선언한 타입에 맞는 값만 할당할 수 있다.
정적 타입 언어는 컴파일 시점에 타입 체크 (선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리) 를 수행 한다.

타입 체크를 통과하지 못했다면 에러를 발생 시키고 프로그램의 실행 자체를 막는다.
타입의 일관성을 강제함으로써 더욱 안정적인 코드의 구현을 통해 런타임에 발생하는 에러를 줄인다.

즉 매우 번거롭지만 안정적인 코드의 구현이 가능하다는 소리이다.

대표적인 정적 타입 언어로
C, C++, 자바, 코틀린, 고, 하스켈, 러스트, 스칼라 등이 있다.

자바스크립트는 동적 타입 언어이다.
변수를 선언할 때 타입을 따로 설정하지 않는다.
다만 var, let, const 키워드를 사용해 변수를 선언할 뿐이다.
typeof 연산자로 변수의 데이터 타입을 조사해 보면

var kim;
console.log(typeof kim); //undefined

kim = 3;
console.log(typeof kim); //number

kim = '3';
console.log(typeof kim); //string

kim = true;
console.log(typeof kim); //boolean

kim = {};
console.log(typeof kim); //object

typeof 연산자로 변수를 연산하면 변수의 데이터 타입을 반환한다.

정확히 말하자면 변수의 데이터 타입을 반환하는 것이 아니라 변수에 할당된 값의 데이터 타입을 반환한다.


자바스크립트의 변수에는 어떤 데이터 타입의 값이라도 자유롭게 할당할 수 있으므로 정적 타입 언어에서

말하는 데이터 타입과 개념이 다르다.

요약

  1. 정적 타입 언어는 변수 선언 시점에 변수의 타입이 결정되며 변수의 타입을 변경할 수 없다.

  2. 자바스크립트는 값을 할당하는 시점에 변수의 타입이 동적으로 결정되고 변수의 타입을 언제든지

자유롭게 변경할 수 있다.

다시 말해, 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론) 이 된다.

그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다.

이러한 특징을 동적 타이핑 이라하며

동적 타입 언어 라고 한다.

대표적인 동적 타입 언어로는

자바스크립트, 파이썬, PHP, 루비, 리스프, 펄 등이 있다.

한가지만 기억하자.

자바스크립트는 동적 타입 언어이며

변수의 할당되어 있는 값에 의해 변수의 타입이 동적으로 결정 된다.


동적 타입 언어의 장점이자 단점은

데이터 타입의 대해 무감각해질 정도로 편리하다는 것이다.

모든 소프트웨어 아키텍처에는 트레이드오프가 존재한다.

트레이드오프 란?

두 개의 정책이나 목표 중 하나를 달성하려고 하면 다른 목표의 달성이 늦어지거나 희생되는 모순적 관계를 의미한다.

변수 값은 언제든지 변경될 수 있기 때문에 복잡한 프로그램에서는 변화하는 변수 값을 추적하기 어려울 수 있다. 그뿐만이 아니다. 변수의 타입이 고정되어 있지 않고 동적으로 변하는 동적 타입 언어의 변수는 값의 변경에 의해 타입도 언제든지 변경될 수 있다. 따라서

동적 타입 언어의 변수는 값을 확인하기 전에는 타입을 확신할 수 없다.

자바스크립트는 개발자의 의도와는 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 자동으로 변환되기도 한다. 즉 잘못된 예측에 의해 작성된 프로그램은 당연히 오류를 뿜어낸다.

결국 동적 타입 언어는 유연성은 높지만 신뢰성이 떨어진다.


안정적인 프로그램을 만드려면 변수를 사용하기 이전에 데이터 타입을 체크해야 하는 경우가 있지만

이는 매우 번거롭기도 하고 코드의 양도 증가한다.

변수를 사용할 때 주의할 사항

변수는 꼭 필요한 경우에 한해 제한적으로 사용한다.

변수의 개수가 많으면 많을수록 오류가 발생할 확률도 높아진다.

변수의 무분별한 남발은 금물이며 필요한 만큼 최소한으로 유지하도록 주의해야 한다.

변수의 유효범위(스코프)는 최대한 좁게 만들어 변수의 부작용을 억제해야 한다.

변수의 스코프가 넓으면 넓을수록 변수로 인해 오류가 발생할 확률이 높아진다.

전역 변수는 최대한 사용하지 않도록 한다.

**** 어디서든지 참조/변경 가능한 전역 변수는 의도치 않게 값이 변경될 가능성이 높고 다른 코드에 영향을 줄 가능성도 높다.

변수 보다는 상수(const) 를 사용해 값의 변경을 억제한다.


변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍 한다.

****변수 이름뿐 아니라 모든 식별자(변수, 함수, 클래스 이름 등)는 존재 이유를 파악할 수 있는 적절한 이름으로 지어야 한다.


코드는 오해하지 않도록 작성해야 한다.

오해는 커뮤니케이션을 어렵게 하는 대표적인 원인으로 생상성을 떨어뜨리는 것은

물론 팀의 사기까지 저하시킨다.

코드는 동작하는 것만이 존재 목적은 아니다.

코드는 개발자를 위한 문서이기도 하다. 따라서 사람이 이해할 수 있는 코드.

가독성이 좋은 코드가 좋은 코드.

'JavaScript' 카테고리의 다른 글

[JS] Array.sort  (0) 2023.10.12
비구조화 할당  (0) 2023.04.24
async & await (비동기 처리를 동기처럼 작동하게 하려면?)  (0) 2023.04.24
Spread 문법  (0) 2023.04.24
프로미스 객체 (Promise Object)  (0) 2023.04.24