변수(Variables)
데이터가 저장되는 공간
변수의 특징
- 1개의 변수에는 1개의 값만 할당 할 수 있다.
- 변수에 지정된 값은 재할당을 통해 변경 가능하다.
- 값의 형태에 맞는 자료형을 사용해야한다. 예) String = 1234; (x)
- 변수명은 소문자로 시작해야한다.
- 대소문자를 구분해야하며 공백은 포함이 불가능하다.
- 자바 예약어(int, double, String 등)는 변수로 사용할 수 없다.
공백을 사용해야 할 때는 대문자를 사용하여 구분한다.이러한 방법을 카멜 케이스(Camel Case)라고 한다. 예) int productPrice = 10000;
데이터 타입
기본형(PrimitiveType)
정수형
- byte(1 byte - 8 bits) : -2^7 ~ 2^7-1(-128 ~ 127)의 범위를 나타낼 수 있다.
- short(2 bytes) : -2^15 ~ 2^15-1(-32,768 ~ 32,767)의 범위를 나타낼 수 있다.
- int(4 bytes) : -2^31 ~ 2^31-1의 범위를 나타낼 수 있다.
- long(8 bytes) : -2^63 ~ 2^63-1의 범위를 나타낼 수 있다.
일반적으로 많이 사용하는 정수형 데이터는 int 타입이며, 보통 long 타입은 웹서비스나 웹 애플리케이션을 만들 때 객체 각각의 고유한 값을 가지는 아이디를 만들 때 사용된다.
실수형
- double(8 bytes) : 소수점 15자리까지의 정밀도
- float(4 bytes) : 소수점 7자리까지의 정밀도
float 데이터를 다룰 때 뒤에 f를 붙여야하는 번거로움이 있기 때문에 일반적으로 실수형 데이터를 표현할 때에는 double 타입을 사용한다.
문자형
- char(2 bytes) : 작은따옴표('')를 사용한다.
문자열은 말 그대로 문자를 나열한 것이고 문자형 데이터는 문자 한 개만 다룰 수 있는 데이터 타입이다. 정수를 입력하면 아스키(ascii)코드로 변환되어 나온다. 그 외에도 16진수 형태의 유니코드를 입력하여도 문자형으로 출력된다.
논리형
참거짓(True, False) 값. 불, 불린, 불리언 등으로 불린다. 참과 거짓 외에도 논리적으로 판단할 수 있는 표현식을 넣어도 된다.
참조형(Reference Type)
참조형 데이터의 값 => 힙 메모리
변수에 대입되는 값 => 힙 메모리 영역의 주소값
참조형 데이터 타입은 원칙적으로 new 연산자를 이용하여 객체를 구성하는 방식이다.
String = new String(original: "Hello!");
System.out.printIn(a);
참조형 데이터의 값을 나타내는 부분(Hello!)은 변수 a가 아닌 힙 메모리 영역에 생성된다. 변수(a)에 대입되는 실제 값는 힙 메모리 영역의 주소값이 대입된다. 즉, a는 힙 메모리의 어느 곳에 Hello!라는 문자열이 있는지 주소만 가지고 있을 뿐 값을 가지고 있는 것은 아니다.
그래서 String 같은 경우, new 연산자를 활용하지 않고 값 자체를 변수에 대입하여 사용한다. 이를 리터럴(Literal) 방식이라고 한다.
String b = "Hello!";
그럼 a와 b의 값은 같은 주소 값을 가지고 있을까?
if (a == b) {
System.out.printin("a == b");
}
결과는 아니다. 같은 Hello!라는 값이어도 a라는 변수, b라는 또다른 변수를 선언했기 때문이다.
같은 값으로 또다른 변수를 선언하여 비교해보자.
String c = "Hello!";
if (b == c) {
System.out.printin("a == b");
}
그런데 이번에는 b와 c가 힙 메모리에 같은 데이터를 가르키고 있다고 나온다.
리터럴 방식으로 문자열을 대입하면 기존에 힙 메모리에 동일한 값이 있는지 먼저 확인한다. 그리고 동일한 값이 있으면 새롭게 그 객체를 힙 메모리에 만들지 않고 기존의 주소를 가져간다. new 연산자 방식은 new 연산자를 새로 만드는 작업만 한다. 그렇기 때문에 기존에 같은 문자열 데이터가 있든 없든 무조건 새로 생성한다.
상수(Constants, final variables)
변수와 상반되는 개념
상수의 특징
- 한 번 값이 할당되면 이후에 재할당이 불가능하다.
- 전체를 대문자로 표시하고 단어간 구분은 _로 한다.
프로그램 내에서 한 번이라도 변경이 필요한 값들은 상수로 선언하면 안된다. 공통적으로 값을 곱해주어야한다던지, 공식 같은 로직에서만 사용해야한다.