1. DataTypes
변수를 선언하면 해당되는 자료형의 크기 만큼 메모리가 할당된다. 변수는 할당된 메모리를 가리키는 이름이다. 자바의 자료형은 primitive type 8종류와 reference type(non-primitive)으로 이루어져 있다. 분류는 아래와 같다.
Primitive Type
정수형(byte, short, int, long)의 경우에는 표현범위가 -2^(n-1) ~ 2^(n-1) - 1 임을 기억하자. 자바에서 사용하는 정수에 대한 기본 자료형은 int이다. 자바의 정석에 따르면 int는 CPU가 가장 효율적으로 처리할 수 있는 타입이기 때문에 일반적으로도 int를 많이 사용한다고 한다. 효율적인 실행보다 메모리를 절약이 필요할 때는 상황에 맞는 자료형을 사용하는 것이 적절하다. 프로그램에서 사용하는 모든 숫자(리터럴)는 int로 저장된다. 만약 long 보다 큰 숫자가 필요하다면 BigInteger 클래스를 사용한다.
리터럴은 프로그램에서 사용하는 숫자, 문자, 논리 값을 의미한다. 리터럴은 상수 풀(constant pool)에 존재한다. 다음에 JVM 구조를 다룰 때 만날 것 같다. 정수 리터럴은 int, 실수 리터럴은 double로 저장되며, int의 범위가 넘어가는 경우에는 L, l을 사용하고 float로 사용하려는 경우에는 F, f 식별자를 사용한다.
어떤 문서에는 boolean 타입이 1bit라고 써있는데 또 어디서는 1byte라고 적혀있다. 기본적으로 CPU는 1바이트보다 작은 데이터를 처리할 수 없기 때문에 1바이트로 boolean을 표현하고 실질적으로는 1bit를 사용하는 것 때문에 이러한 혼용이 생긴 것 같다.
자바에서 실수의 기본 자료형은 double을 사용한다. 또한, 자바스크립트와 마찬가지로 실수형(float, double)을 표현할 때 IEEE 754 표준을 사용한다. 기본적으로 부동 소수점 방식을 사용하면 고정 소수점 방식보다 더 많은 범위를 표현할 수 있지만 오차가 존재한다는 단점이 있다. 이러한 오차를 해결하기 위해서 자바는 BigDecimal 클래스를 제공한다.
문자가 숫자로 변환되는 것은 encoding, 숫자에서 다시 문자로 변환되는 것은 decoding이라고 한다. 각 문자를 얼마로 표현할 것인지 코드 값을 모아둔 것을 charater set이라고 한다. 예를 들어 ASKII, euc-kr, 유니코드(uft-8, utf-16) 등이 있다. 자바 생태계에서는 어떤 것을 사용할까?
JVM은 문자(char)나 문자열(String)을 메모리에 저장할 때 utf-16 인코딩 방식을 사용한다. JVM이 문자열을 UTF-16 방식으로 저장하는 이유 글에 따르면 utf-8은 랜덤 액세스에 비효율적이라고 한다. 다음에 한번 더욱 깊게 봐야겠다.
기억해야할 부분
- char을 제외한 모든 숫자형은 부호가 있다. (signed)
- 자료형의 크기는 모든 플랫폼에서 동일하게 유지된다.
- 자바의 char 타입은 유니코드(utf-16) 문자 집 합을 사용하기 때문에 2바이트이다.
- 객체가 아니기 때문에 null을 가질 수 없다.
- primitive type은 사용하기 전에 선언이 되어야 한다.
Reference Type
자바에서 primitive type을 제외한 모든 데이터 유형은 reference type이다. reference type의 변수는 데이터를 그대로 저장하지 않고, 데이터를 저장하는 메모리의 주소만 저장한다. 즉, 참조형의 변수는 데이터를 다른 영역에 저장하고 그 주소만을 이용한다. 종류로는 Array, Enum, Interface,
2. Type conversion
type conversion이란 서로 다른 자료형 간에 연산 등의 수행을 위해서 하나의 자료형으로 통일하는 것이다. 종류로는 묵시적 형 변환(implicit type conversion, 자동 형 변환)과 명시적 형 변환(explicit type conversion, 강제 형 변환)이 있다. 아래는 기본형의 자동 형 변환이 가능한 방향이다.
기억해야할 부분
- 바이트 크기가 작은 자료형에서 큰 자료형으로 형 변환은 자동으로 이루어진다.
- 덜 정밀한 자료형에서 더 정밀한 자료형으로의 형 변환은 자동으로 이루어진다.
byte b1 = 10;
int i1 = b;
int i2 = 20;
float f1 = i2;
int i3 = 10;
byte b2 = (byte)i3;
double d1 = 3.14;
int i4 = (int)d1;
그럼 다음과 같은 질문이 떠오를 수 있다. short <-> char 은 모두 2바이트 이므로 자동형 변환이 가능할까? 결론을 말하자면 자동 형변환이 불가하다. [Java의 정석]제2장 변수 - 3. 형 변환에 따르면 short과 char은 모두 2 byte의 크기를 갖지만, 서로 범위가 달라서 둘 중 어느 쪽으로의 형 변환도 값 손실이 발생할 수 있으므로 자동적으로 형 변환이 수행될 수 없다.
3. Type of variables
자바에는 세 가지 유형의 변수가 있다.
- 지역 변수
- 인스턴스 변수
- 정적 변수
class Smaple {
static int a = 1; //static variable
int data = 1; //instance variable
void method(){
int b = 2; //local variable
}
}
지역 변수(Local Variables)
지역 변수는 메서드 본문 내부에 선언된 변수이다.
인스턴스 변수(Instance Variables)
인스턴스 변수는 static 키워드가 없이 정의되며 메서드 선언 외부에서 정의된다.
정적 변수(Static Variables)
정적 변수는 프로그램 실행 시작 시 한 번만 초기화된다. 인스턴스의 생성과 상관없이 사용 가능하다.
'개발(레거시) > 자바' 카테고리의 다른 글
String, String Buffer, String Builder (0) | 2022.11.12 |
---|---|
Generic, Variance (1) | 2022.10.31 |
Basic Syntax, DataStructures (0) | 2022.10.30 |