일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- typeorm
- SROOM
- 티스토리챌린지
- 멀티테넌시
- 파일조회
- NestJS
- monorepo
- YouTube Data API
- 책임부과
- nestjs libraries
- nestjs decorator
- 어드민 페이지
- coarse-grained
- guard
- 오브젝트
- 자바
- jest
- Mock
- nestjs library
- 오블완
- java
- Connection pool
- API 개발
- fine-grained
- mailerservice
- 추상 클래스
- SW마에스트로
- 셀렉트어드민
- 권한검증
- API 설계
- Today
- Total
독산구너
자바에는 왜 undefined가 없을까? 본문
목차
글의 목적
제 주력 언어는 자바이고 자바의 타입과 논리구조가 익숙합니다. 그렇기에 최근 인턴과정에서 사용하게 된 Typescript를 다루는것이 생각보다 어려웠습니다. 어려움 중 하나였던, 타입(Type)의 차이에 대해 일부분 알아보고, 이를 공유하고자 합니다.
글을 쓰게 된 이유
이광근 교수님의 '컴퓨터 과학이 여는 세계'에서는 컴퓨터의 타입(Type)을 '프로그램이 최종적으로 만드는 데이터의 종류' 라고 설명합니다. 언어가 포함하는 논리식의 결과물(데이터)를 '종류' 까지만 초점을 가지고 분류한 결과물이라는 것입니다.
이 대목에서 "그럼 자바와 자바스크립트의 논리식의 차이점이 있는건가?" 라는 질문이 들었습니다. 자바스크립트는 자바와 다르게 undefined, NaN, Infinity와 같은 더 세부적으로 나눠진 타입들이 있기도 하고, number와 같이 자바에 비해 포괄적이 타입이 존재하기도 합니다.
그렇다면
왜 자바의 논리식 결과물 종류로는 undefined, NaN, Infinity가 필요하지 않았고(또는 없어야 했고), 자바스크립트는 이것이 필요했는지(없으면 안됐는지), 왜 자바는 숫자 종류를 세부적으로 나눴고(나눠야만 했고), 자바스크립트는 포괄적으로 설명해도 됐는지(했어야 했는지) 알아볼 필요가 있겠습니다.
먼저 제가 가져온 타입인 undefined, NaN, Infinity, number가 산출되는 논리식을 예시로 살펴보겠습니다.
1. undefined
let x; // 변수를 선언만 하고 초기화하지 않음
console.log(x); // undefined
function getValue(obj) {
return obj.nonExistentProp; // 객체에 없는 속성을 참조
}
console.log(getValue({})); // undefined
이 타입은 "값이 할당되지 않는 변수" 또는 "정의 되지 않은 속성"입니다.
그렇다면 자바에서는?
int x; // 초기화하지 않음
System.out.println(x); // 컴파일 오류 발생
대체되는 타입이 존재하지 않고, 컴파일 오류가 발생합니다.
사실 자바에서는 변수를 초기화하는 것이 기본이기 때문에, "정의되지 않는 속성"을 허락하지 않는다고 볼 수 있겠습니다.
2. NaN(Not-a-Number)
console.log(0 / 0); // NaN
console.log(parseInt("abc")); // NaN
이 타입은 "숫자가 아닌 결과"를 나타내는 타입입니다.
자바에서는?
System.out.println(0 / 0); // ArithmeticException 발생
Integer.parseInt("abc"); // NumberFormatException 발생
undefined와 같이 컴파일 오류를 내며 허용하지 않는것을 볼 수 있습니다. 자바에서는 "숫자가 아닌 결과"를 허용하지 않습니다.
3. Infinity와 -Infinity
console.log(1 / 0); // Infinity
console.log(-1 / 0); // -Infinity
이 타입은 "양의 무한대" 또는 "음의 무한대"를 나타내는 타입입니다. 위 논리식을 통해 산출됩니다.
자바에서는 Integer.MAX_VALUE, Double.MAX_VALUE 처럼 숫자 자료형의 최대값을 나타내는 "값"은 있지만, 무한대를 나타내는 "타입"은 없습니다.
4. 숫자 타입의 포괄성 vs 세부성
자바스크립트는 숫자 타입이 number, 단 한개입니다.
let x = 42; // 정수
let y = 3.14; // 부동소수점
console.log(typeof x); // "number"
console.log(typeof y); // "number"
자바는 숫자타입을 세부적으로 나눕니다.
- 정수: byte, short, int, long
- 실수: float, double
왜 그럴까?
왜 이런 타입 종류의 차이, 다시말해 허용하는 논리식의 차이가 일어날까요?
이는 자바스크립트가 동적 언어로, 다양한 환경에서의 유연성과 관대함을 중시해서 프로그램이 중단되지 않도록 설계되었고, 자바는 정적타입과 예외 처리를 통해 논리적 오류를 방지하고 문제를 명시적으로 처리하고자 하는 의도를 가지고 있음을 알 수 있습니다.
자바스크립트는 빠른 개발과 간결한 코드를 위해 초기화 되지 않은 상태도 허용하는 유연성을 가졌고, 계산 실패를 하더라도 프로그램이 중단되지 않도록 NaN, Infinity를 반환했습니다. 자바는 예측 가능한 실행환경을 제공하기 위해 의도치 않은 동작을 허용하지 않는 것을 볼 수 있습니다.
그러면 한단계 더 나아가서, 왜 자바와 자바스크립트가 그런 의도를 가지게 되었는지까지 알아보겠습니다.
자바(Java)
1. 시대적 요구
1990년대 초, 컴퓨터는 주로 업무용 시스템이나 대규모 네트워크 애플리케이션에서 사용되었습니다. 이러한 환경에서는 안정성과 확장성, 유지보수가 중요한 요소로 꼽혔습니다. 특히 서버 측 애플리케이션, 임베디드 시스템, 그리고 대규모 분산 네트워크 환경에서는 신뢰할 수 있는 소프트웨어가 요구됐습니다.
• 선마이크로시스템즈(Sun Microsystems)는 이러한 요구를 충족시키기 위해 “플랫폼 독립적인 언어”를 목표로 자바를 개발했습니다.
2. 주요 설계 목표
• 플랫폼 독립성: “한 번 작성하면 어디서나 실행된다(Write Once, Run Anywhere)“라는 철학 아래, 자바는 JVM을 통해 다양한 플랫폼에서 동일하게 동작하도록 설계되었습니다.
• 안정성과 예측 가능성: 대규모 시스템에서는 버그로 인해 전체 시스템이 중단될 위험이 크기 때문에, 자바는 컴파일 타임에 타입 체크를 엄격히 하고 예외 처리를 강제했습니다.
자바스크립트(JavaScript)
1. 시대적 요구
1995년, 인터넷이 대중화되기 시작하면서 웹 브라우저의 역할이 단순한 정보 열람을 넘어 동적인 사용자 경험을 제공하는 방향으로 확장되고 있었습니다. 브라우저 기반의 인터랙티브한 웹페이지가 필요해지면서, 넷스케이프(Netscape)는 HTML과 CSS를 보조하며 사용자와의 상호작용을 처리할 수 있는 스크립트 언어를 원했습니다.
2. 주요 설계 목표
• 빠른 학습 곡선: 웹 개발자와 디자이너는 전문 프로그래머가 아니었기에, 누구나 쉽게 사용할 수 있는 언어가 필요했습니다. 자바스크립트는 문법이 단순하고 동적으로 타입을 처리하며, 프로그램이 중단되지 않도록 관대한 오류 처리를 채택했습니다.
• 빠른 개발: 웹 환경은 빠르게 변화하므로, 간단한 코드를 빠르게 작성하고 실행할 수 있는 언어가 요구되었습니다.
결국, 자바는 신뢰성과 안정성을 중시하는 엔터프라이즈 환경에서 태어났고, 자바스크립트는 빠른 개발과 유연성이 중요한 웹 환경에서 탄생했다는 본질적인 차이가 각 언어의 설계 철학, 그리고 타입에까지 반영된 것으로 보입니다.
글을 쓰면서
언어마다 차이가 있다는 것은 알고있었지만, 그 원인에 대해 알아본것은 처음입니다. 빠른 변화가 일어나는 웹에서의 경량화된 언어인 자바스크립트, 다양한 플랫폼에서 통일성있게 안정적으로 동작해야 하는 자바의 입장을 들어본것은 처음이라 흥미롭고 재밌었습니다 ㅎㅎ
언어의 특성으로 그 의도와 역사를 파악할 수 있다는 것이 신기했고, 프로그래밍 의도에 따라 언어를 선택해 사용할 줄 알아야 한다고 생각이 들었습니다.
'컴퓨터에 대해서' 카테고리의 다른 글
논리 게이트만으로 메모리 읽기 구현 (6) | 2024.11.17 |
---|