js 자료형
JavaScript에는 여러 가지 기본 자료형(때때로 "원시(primitive)" 자료형이라고도 함)과 몇 가지 객체 타입이 있습니다. 이들을 이해하는 것은 JavaScript 프로그래밍의 기초를 마련하는 데 중요합니다.
### 기본 자료형 (Primitive Data Types)
기본 자료형은 그 자체로 불변하는 단일 값입니다. JavaScript에는 다음과 같은 기본 자료형이 있습니다:
1. **Number**: 모든 숫자를 나타내며, 정수 및 부동 소수점 숫자를 포함합니다.
2. **BigInt**: 매우 큰 정수를 나타내기 위한 타입으로, 숫자 끝에 `n`을 붙여 사용합니다 (예: `9007199254740991n`).
3. **String**: 문자열을 나타내며, 텍스트 데이터를 표현합니다.
4. **Boolean**: 논리적인 값인 `true`와 `false`를 나타냅니다.
5. **Undefined**: 값이 할당되지 않은 변수의 초기값으로 사용됩니다.
6. **Null**: '값이 없음'을 의도적으로 나타내는데 사용됩니다.
7. **Symbol**: ES6에서 추가된 타입으로, 고유하고 변경 불가능한 데이터 타입입니다. 주로 객체 속성의 키로 사용됩니다.
### 객체 (Object)
객체 타입은 여러 속성을 포함할 수 있는 복합 자료형입니다. JavaScript에서 거의 모든 것이 객체이며, 다음과 같은 내장 객체 타입이 있습니다:
1. **Object**: 키와 값의 쌍으로 구성된 구조로, 데이터와 기능을 모듈화하는 데 사용됩니다.
2. **Array**: 순서가 있는 값의 집합을 나타내며, 숫자 인덱스를 통해 접근할 수 있습니다.
3. **Function**: 실행 가능한 코드 블록을 나타내며, 호출될 수 있습니다.
4. **Date**: 날짜와 시간을 나타냅니다.
5. **RegExp**: 정규 표현식을 나타내며, 문자열에 대한 패턴 매칭을 수행하는 데 사용됩니다.
6. **Map**: 키-값 쌍을 나타내며, 키로 어떤 값이든 사용할 수 있습니다 (객체와 비교했을 때의 차이점).
7. **Set**: 중복 없이 값을 저장하는 데 사용되며, 값의 유일성을 보장합니다.
### 기타
- **NaN**: 'Not-A-Number'를 나타내는 특별한 Number 타입의 값입니다. 숫자 연산이 실패했을 때 발생합니다.
- **Infinity**와 **-Infinity**: 양의 무한대와 음의 무한대를 나타냅니다.
JavaScript의 다양한 데이터 타입들은 프로그램에서 데이터를 다루고, 연산을 수행하며, 다양한 기능을 구현하는 데 필요한 기초를 제공합니다.
`var`, `let`, `const`는 JavaScript에서 변수를 선언할 때 사용되는 키워드이지, 자료형(data type)에 속하는 것은 아닙니다. 이 키워드들은 변수의 범위(scope), 재할당 가능성(reassignment), 그리고 호이스팅(hoisting)과 같은 특성을 결정합니다. 각각의 키워드를 사용할 때의 주요 차이점들을 살펴보겠습니다:
### `var`
- **범위**: `var`로 선언된 변수는 함수 범위(function-scoped) 또는 전역 범위(global-scoped)를 가집니다. 이는 변수가 선언된 함수 내부에서만 유효하거나, 함수 밖에서 전역 변수로서 선언된 경우 어디서든 접근 가능함을 의미합니다.
- **호이스팅**: `var`로 선언된 변수는 호이스팅되어, 선언 이전에도 참조할 수 있습니다. 단, 선언 이전에 접근하면 `undefined` 값을 가집니다.
- **재할당**: 가능합니다. 즉, `var` 키워드로 선언된 변수에는 언제든지 새로운 값을 할당할 수 있습니다.
### `let`
- **범위**: `let`으로 선언된 변수는 블록 범위(block-scoped)를 가집니다. 이는 변수가 선언된 가장 가까운 중괄호(`{}`) 안에서만 유효함을 의미합니다.
- **호이스팅**: `let`으로 선언된 변수도 호이스팅되지만, `var`와 달리 "일시적 사각지대(Temporal Dead Zone, TDZ)"에 빠져 선언 전에는 접근할 수 없습니다.
- **재할당**: 가능합니다. 즉, 새로운 값을 할당할 수 있습니다.
### `const`
- **범위**: `const`로 선언된 변수도 블록 범위(block-scoped)를 가집니다.
- **호이스팅**: `let`과 마찬가지로, `const`도 호이스팅되지만 TDZ에 의해 선언 이전에는 접근할 수 없습니다.
- **재할당**: 불가능합니다. 즉, `const`로 선언된 변수는 선언과 동시에 초기화되어야 하며, 이후에는 그 값을 변경할 수 없습니다. 단, 객체 또는 배열과 같은 참조 타입의 경우, 객체나 배열 자체는 변경할 수 없지만 그 내용은 수정할 수 있습니다.
`var`, `let`, `const`는 변수의 선언과 관련된 문법적인 특성을 정의하는 키워드이며, 변수가 어떤 타입의 데이터를 저장할지는 이들과는 독립적입니다. JavaScript의 자료형은 `Number`, `String`, `Boolean`, `Object`, `null`, `undefined`, `Symbol`, `BigInt` 등입니다.
---
많은 프로그래밍 언어들은 변수를 선언할 때 자료형(type)을 명시해야 합니다. 이런 언어들은 주로 정적 타입(statically-typed) 언어로 분류되며, 변수의 타입이 컴파일 시간에 결정되고, 그 후에는 변경할 수 없습니다. 이와 대조적으로, JavaScript는 동적 타입(dynamically-typed) 언어로, 변수를 선언할 때 타입을 명시하지 않고, 변수의 타입은 프로그램이 실행되는 동안에 할당된 값에 따라 변할 수 있습니다.
### 정적 타입 언어의 예
- **Java**: 변수 선언 시 반드시 타입을 명시해야 합니다.
```java
int number = 5;
String text = "Hello";
```
- **C++**: 마찬가지로 변수의 타입을 선언해야 합니다.
```cpp
int number = 5;
std::string text = "Hello";
```
### 동적 타입 언어의 예
- **JavaScript**: 변수 선언 시 타입을 명시하지 않습니다. 대신 `var`, `let`, `const` 같은 키워드를 사용하여 변수를 선언합니다.
```javascript
let number = 5; // Number
let text = "Hello"; // String
```
- **Python**: 변수 선언 시 타입을 명시하지 않습니다.
```python
number = 5 # int
text = "Hello" # str
```
### 정적 타입 언어 vs. 동적 타입 언어
- **정적 타입 언어의 장점**:
- 컴파일 시간에 타입 검사를 수행하여 타입 관련 오류를 미리 잡아낼 수 있습니다.
- 타입이 명확하여 코드의 가독성과 유지보수성이 높아질 수 있습니다.
- 컴파일러 최적화가 더 효율적일 수 있어 실행 성능이 좋을 수 있습니다.
- **동적 타입 언어의 장점**:
- 더 유연하고 동적인 프로그래밍이 가능합니다. 변수의 타입을 실행 시간에 변경할 수 있기 때문입니다.
- 타입 시스템이 간단하여 배우기 쉽고, 빠르게 개발할 수 있습니다.
- 프로토타입, 스크립트 작성, 빠른 개발이 필요한 경우에 유리합니다.
각각의 접근 방식은 장단점이 있으며, 특정 언어를 선택할 때는 프로젝트의 요구 사항, 팀의 선호도, 그리고 개발 환경 등을 고려해야 합니다. JavaScript의 경우, 그 유연성 덕분에 웹 개발뿐만 아니라 다양한 영역에서 널리 사용되고 있습니다.
---
js vs python
JavaScript와 Python은 데이터 구조를 다루는 방식에서 차이를 보입니다. Python이 명시적으로 리스트(lists), 튜플(tuples), 딕셔너리(dictionaries)와 같은 다양한 데이터 구조를 제공하는 반면, JavaScript는 이들과 직접적으로 일치하는 데이터 구조를 가지고 있지 않습니다. 그러나 JavaScript는 이러한 데이터 구조의 기능을 모방할 수 있는 자체 데이터 타입과 구조를 가지고 있습니다.
### 리스트 (Python) vs. 배열 (JavaScript)
Python의 리스트와 JavaScript의 배열(Array)은 서로 매우 비슷합니다. 둘 다 순서가 지정된 데이터의 컬렉션을 저장하며, 변경 가능(mutable)하고, 다양한 데이터 타입을 포함할 수 있습니다.
- Python 예제: `my_list = [1, "apple", True]`
- JavaScript 예제: `let myArray = [1, "apple", true];`
### 튜플 (Python) vs. "튜플" (JavaScript)
JavaScript에는 Python의 튜플에 직접적으로 대응하는 데이터 구조가 없습니다. 그러나 ES6부터 도입된 `const` 키워드와 `Object.freeze()` 메소드를 사용하여 불변성(immutable)을 가진 배열을 생성함으로써 튜플과 유사하게 작동하게 할 수 있습니다.
- Python 예제: `my_tuple = (1, "apple", True)`
- JavaScript 유사 구현: `const myTuple = Object.freeze([1, "apple", true]);`
### 딕셔너리 (Python) vs. 객체 (JavaScript)
Python의 딕셔너리와 JavaScript의 객체(Object)는 키-값 쌍을 저장하는 데이터 구조입니다. 둘 다 유연하고 다양한 타입의 키와 값을 가질 수 있으며, 데이터에 대한 접근과 수정이 가능합니다.
- Python 예제: `my_dict = {"name": "John", "age": 30}`
- JavaScript 예제: `let myObject = {"name": "John", "age": 30};`
### Map과 Set
JavaScript는 또한 `Map`과 `Set`이라는 두 가지 유용한 데이터 구조를 제공합니다. `Map`은 키-값 쌍의 컬렉션으로, 객체보다 다양한 타입의 키를 사용할 수 있으며, `Set`은 유니크한 값의 집합을 나타냅니다. 이들은 Python의 딕셔너리와 집합(set)과 유사한 기능을 제공합니다.
JavaScript의 데이터 구조는 Python에서 제공하는 것만큼 명시적이거나 다양하지 않을 수 있지만, 유연성과 다양한 메소드를 통해 필요한 기능을 충분히 구현할 수 있습니다.
JavaScript나 Python에서 변수를 선언할 때 타입을 명시적으로 선언하는 것은 기본 문법에 포함되어 있지 않습니다. 이 언어들은 동적 타입 언어로 설계되었기 때문에, 변수의 타입은 프로그램 실행 중에 할당된 값에 의해 결정됩니다. 따라서, 이러한 언어에서는 변수 선언 시 타입을 지정하지 않고, 타입은 자동으로 추론됩니다.
### JavaScript
```javascript
let number = 5; // 이 변수는 숫자 타입으로 추론됩니다.
let text = "Hello"; // 이 변수는 문자열 타입으로 추론됩니다.
```
### Python
```python
number = 5 # 이 변수는 int로 추론됩니다.
text = "Hello" # 이 변수는 str로 추론됩니다.
```
그러나, 타입 안정성을 높이기 위해 또는 큰 프로젝트에서 개발자 간의 명확한 커뮤니케이션을 위해 타입을 명시적으로 선언하는 방법을 도입할 수 있습니다. 이를 위한 도구나 확장 기능이 두 언어에 모두 존재합니다.
### TypeScript (JavaScript의 경우)
TypeScript는 Microsoft에 의해 개발된 JavaScript의 슈퍼셋으로, 명시적인 타입 선언과 함께 다양한 기능을 제공합니다. TypeScript는 컴파일 시 JavaScript 코드로 변환되며, 이 과정에서 타입 체크가 이루어집니다.
```typescript
let number: number = 5; // 숫자 타입을 명시적으로 선언합니다.
let text: string = "Hello"; // 문자열 타입을 명시적으로 선언합니다.
```
### Type Hinting (Python의 경우)
Python 3.5 이상에서는 Type Hint를 사용하여 변수, 함수의 매개변수, 반환 값 등에 타입 정보를 제공할 수 있습니다. 이는 주로 개발자 간의 명확한 커뮤니케이션과 도구를 통한 타입 체크를 위한 목적으로 사용됩니다. 실제 실행 시 타입 체크를 강제하지는 않습니다.
```python
number: int = 5 # int 타입을 명시적으로 표시합니다.
text: str = "Hello" # str 타입을 명시적으로 표시합니다.
```
이러한 방법들은 프로그램의 안정성을 높이고, 복잡한 프로젝트에서 오류를 줄이는 데 도움이 될 수 있습니다. 그러나 기본적으로 JavaScript와 Python 자체는 동적 타입 언어이므로, 타입을 명시적으로 선언하지 않고도 사용할 수 있습니다.
댓글
댓글 쓰기