1. Introduction
자바의 철학 중에는 "가능한 간결하게" 라는 것이 있는데, 이 덕분인지 키워드도 50개밖에 안되고 기본적인 변수를 다루는 것도 C와 같이 사용된다. 물론 실제로 코드가 간결한지는 음...ㅋㅋㅋ
문제는 철저하게 객체지향 언어로 설계된 자바는 모든 것을 클래스 또는 객체로 표현해야 하는데, 간단한 정수나 문자까지 클래스로 표현하기에는 너무 복잡하고 번거롭다는 것.
이를 해결하는 방법이 바로 프리미티브 타입 (원시 타입, Primitive type)이다.
2. Explanation
프리미티브 타입은 기본 변수형에 해당하는 int, char 등의 타입을 클래스로 두지 않고 특수한 기본 변수로 취급하겠다는 의미이다.
덕분에 이 원시타입은 복사, 파라메터로 전달될 때 주소를 사용하지 않고 변수 그 자체가 움직인다.
또한, 같은 값을 할당해도 같은 위치를 가리키게 하는 것이 아니라, 값을 복사해 주기 때문에 원래 변수에 영향이 가지 않는다.
int a = 3
int b = a
b = 2 // 이렇게 해도 a의 값은 바뀌지 않는다.
물론 이렇게 해도 기본 변수를 클래스처럼 다뤄야 할 때가 생긴다. 이럴 때 사용하는 것이 Wrapper class (래퍼 클래스).
프리미티브 타입에 해당하는 타입은 다음과 같다.
- boolean
- byte
- short
- int
- long
- float
- double
- char
3. Problem
하지만, 이 똥고집 덕분에 자바는 문자열 비교할 때 이상한 짓을 해야 하는데 C++, 파이썬과 다르게 ==으로 문자열이 같은지 확인할 수 없다.
String a = "asdf"
String b = new String("asdf")
sysout(a == b) // false
sysout(a.equals(b)) // true
이게 String을 프리미티브 타입으로 취급하지 않아서 그런것이다. 자바의 ==은 프리미티브 타입에 대해서는 값만 비교하고 그렇지 않으면 주소값을 비교한다. 위에 선언한 a, b 두 string은 값은 같으나 메모리 주소가 다르기 때문에 비교해도 false를 출력한다.