
변수란 데이터를 저장하는 메모리 공간이다. 메모리 공간의 크기는 데이터 타입에 따라 달라질 수 있다.
변수(variable)이라는 이름 때문에 혼동 될 수 있지만, 변수(변하는 수)이기 때문에 데이터가 바뀌는 것이 아니라, 저장된 데이터의 값이 변할 수도 있기 때문에 변수라 부르게 되는 것이 조금 더 적합한 표현인것 같다.
Java의 데이터 타입은 크게 기본형(Primitive type)과 참조형(Reference type)으로 나눌 수 있다.
기본형 데이터 타입은 크게 논리, 정수, 실수, 문자타입으로 나눌 수 있다.
| Category | Type | bit | Value |
|---|---|---|---|
| Logic | boolean | true/false | |
| Integer | byte | 8 | -128 ~ 127 |
| short | 16 | -32768 ~ 32767 | |
| int | 32 | -2147483648 ~ 2147483647 | |
| long | 64 | -2^63 ~ 2^63 | |
| Real number | float | 32 | +/- ( 1.4E-45 ~ 3.4E38 ) |
| double | 64 | +/- ( 4.9E-324 ~ 1.8E308 ) | |
| Character | char | 16 | \u0000 ~ \uFFFF |
boolean 타입의 크기(bit)는 JVM에 따라 달라질 수 있으며, 정확하게 정의된 값이 아니다.unsigned가 존재하지 않는다.1.1+0.1 != 1.2float형과 double형의 차이는 단순히 bit수로 인해 표현할 수 있는 값의 범위가 넓은것은 아니다. Java 뿐 아니라 IEEE754에 지정된 실수형 데이터 표현 방식의 차이다.float & double : IEEE754IEEE754에 따르면, 실수형 데이터의 precision은 다음과 같다.
2^24 < 10^8Java에서 변수를 선언할 때는 2가지를 명시해주어야 한다.
int a; // 정수타입의 변수
Object obj; // Object type의 변수
위와 같이 변수를 선언한 후, 변수에 = 연산자를 통해 값을 할당할 수 있다.
a = 10;
obj = new Object();
변수 선언 단계에서는 변수의 타입에 따라 필요한 메로리가 할당되며, 할당 단계에서 메모리에 데이터를 삽입(?)지정(?)하게 된다.
위 두 과정은 하나의 line에서 아래와 같이 작성할 수 있다.
int a = 10;
Object obj = new Object()
new Constructor()는 생성자를 호출하여 객체를 생성하는 방식이다. 추후 Class에 관련한 포스팅에서 자세히 알아보도록 하겠다.
Type casting은 크게 자동/수동 casting으로 나눌 수 있을것이다. (사실 틀린 표현이다)
Type casting은 기본형(primitive)타입 끼리, 그리고 참조형(reference)타입 끼리 수행될 수 있으며, 기본형과 참조형의 연산 중 수행되지 않는다. Wrapper class의 경우 해당하는 기본형 타입과의 Autoboxing과 unboxing을 지원한다.
Java의 Wrapper Class란 Integer, Long, Double 등 기본형 데이터를 객체로서 다루기 위해 사용하는 class이다.
Type casting은 명시적(explicit) 형변환과 묵시적(implicit) 형변환이 있으며, 묵시적(implicit) 형변환은 Promotion이라고도 부른다.
묵시적 형변환에 의해 변환될 수 있는 데이터 타입의 관계는 아래와 같다.

묵시적 형변환이 존재하지만, 웬만하면 직접 쓰자
Java의 String은 문자열을 나타내는 특별한 객체이다. 문자열은 다양한 방법으로 생성할 수 있다.
String str1 = "Hello"; // literal string
String str2 = new String("Hi"); // new String()
두 문자열은 생성되는 메커니즘이 다르며 JVM의 메모리 구조에서 저장되는 영역도 다르다.
Java의 문자열에 대해 설명하기에는 JVM의 메모리 구조에 대한 이해가 필요하기에, 이는 추후에 문자열에 대해 깊게 다루어 보겠다. 우선은 문자열 비교는 .equals()를 통해 하는것을 권장한다.
"Hello" + "World" 이런 연산은 편하지만(
사실 나는 안편하다) 좋지 않은 방식이다. StringBuilder 많이 쓰는 것 같은데. 문자열에 대해서는 할 말이 많으니 다음 포스트에서 다뤄보겠다.
Reference type의 변수는 단순히 해당 인스턴스의 주소를 담고있다. 사실, Java의 모든 것(기본형 데이터 빼고)은 객체(?)이다. 모든 객체는 Object를 상속 받으며, 이에 대해 더 말하기에는 Java의 다형성에 대해서도 알아야 하니 이것 또한 추후에 다루어보겠다.
언어를 처음 배울 때 왜 자세히 설명하지 않고 넘어가는 일이 많은가 싶었는데 써보니까 알것 같다
사실 위 내용들 보다 이게 더 중요하지 않을까 싶다. 진짜 어렵다
Java의 변수명 작성을 위해 알아야 할 몇가지 규칙이 있다.
$과 _만 사용할 수 있다._만 써라이러한 규칙들이 있으며, 가능하면 camelCase를 사용하는 것을 권장한다. C언어로 시작하다 보니 아직 알고리즘 풀 때는 snake_case를 사용하는데 이것도 고치는게 좋겠다
사실 이러한 규칙은 하다보면 익숙해지니 제일 중요한 것은 알아보기 쉬운 변수 이름을 작성하는 것 아닐까 싶다. 이부분은 Clean code에 대해 공부하고, 가능하다면 지금까지 프로젝트에서 만났던 인상깊은(여러 의미로) 변수명과 함께 포스팅을 해보고자 한다. 포스팅 하나 했는데 할 포스팅이 몇개는 더 생겼다
==쓰지말고 .equals() method를 쓰도록 하자.