🦈 자바 변수와 자료형 정리 🦈
variable
데이터를 저장할 수 있는 메모리 상의 공간
int a; // 변수 a의 자료형은 int
double x; //변수 x의 자료형은 double
a = 123; // int형 변수 a에 값 123 대입
x = 12.23; // double형 변수 x에 값 12.23 대입
String b = "Hello world" // 선언과 동시에 문자 대입
자료형 + 변수명 형태로 선언_와 $ 외의 특수 문자 사용 불가능특정 단어를 미리 정해 두어 자바 언어를 동작하는 것
abstract continue for new switch
assert default goto package synchronized
boolean do if private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while
변수에 적재할 데이터가 메모리에 어떻게 저장되고 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 키워드
크게 기본형, 참조형으로 나뉜다.
| 기능 | 기본형 | 참조형 |
|---|---|---|
| null 초기화 | O | X |
| Generic 타입에서 사용 | X | O |
| 숫자 간 산술 연산 | O | X |
| 값 비교 | == | equals() |
overflow : 해당 타입이 표현할 수 있는 최대 표현 범위보다 큰 수를 저장할 경우 발생
underflow : 해당 타입이 표현할 수 있는 최소 표현 범위보다 작은 수를 저장할 경우 발생
값을 직접 저장하는 타입
boolean x = true;
boolean y = (1 == 2); // false
''로 감싸주어야 한다.char x = 'a'; // 문자값
char y = 97'; // 아스키코드
char z = '\u0061`; // 유니코드
a라는 문자를 문자값, 아스키코드, 유니코드로 표현할 수 있다.
L를 붙여 컴파일 에러를 방지해야 한다.int x = 10;
long y = 100;
주로 int, long 형을 사용한다.
정수형 데이터 타입 사용 시 데이터의 최소, 최대 크기를 고려해야 한다.
정수 overflow 또는 underflow가 발생하게 되면 전혀 다른 값이 저장될 수 있다.
underscore 표기법을 이용해 값을 표현할 수 있으며, 큰 수를 한눈에 파악할 수 있다.
이는 jdk 7부터 지원하며, 일상에서 수를 표현하는 단위인 콤마 , 대신 언더바 _ 를 사용해 수를 표현하는 문법이다.
int x = 1000_000_000 // = 1000,000,000
F를 붙여 컴파일 에러를 방지해야 한다.float x = 1.0
double y = 1.23;
컴퓨터 메모리는 한정적이기 때문에 실수의 소숫점을 표현할 수 있는 수의 제한이 존재한다.
이를 해소하기 위해 부동 소수점 방식을 사용한다.
float x = 3.14; // 3.14를 float로 저장
부호 = 0
지수 = 128 (즉, 2^(1))
가수 = 1.57 (이진수로 변환됨)
부동 소수점 방식 : 정수는 고정된 자리수로 저장, 실수는 소수점 위치가 유동적
부호, 지수, 가수로 나뉘어져 있으며 10^-38 ~ 10^38 범위의 널은 범위의 실수를 표현할 수 있다.
==를 사용해 값 비교 시 비교하고자 하는 값과 근사값을 비교하게 될 경우가 존재한다.double a = 0.1 + 0.2;
double b = 0.3;
if (Math.abs(a - b) < 1e-9) {
System.out.println("거의 같음");
}
실수형에서 overflow가 발생할 경우 무한대의 값을 가지게 되며, underflow가 발생할 경우 0이 된다.
기본형을 제외한 나머지 자료형
클래스, 사용자 정의 클래스, 배열, 열거 타입 등이 포함
객체를 가리키는 4byte의 참조값을 가지며, 초기값이 null이다.
Person p = new Person();
Person이라는 p 변수는 4byte로 Stack에 저장되고,
new Person()로 생성된 객체는 객체 크기만큼 Heap에 저장된다.
JVM 환경에 따라 참조값이 달라진다.
32bit JVM : 일반적으로 4byte
64bit JVM : 8byte일 수 있으나, 일부 JVM이 Compressed OOP를 사용해 4byte로 유지하기도 한다.
문자열을 표현하는 자료형
다양한 내장 메서드를 가져 여러 기능을 구현할 수 있다.
String a = "Hello world"; // 리터럴 방식
String b = new String("Hello"); // 생성자 방식
String 인스턴스는 한 번 생성하면 Read only로, 변경 불가능하다. = 불변 객체
따라서 덧셈 연산자를 이용해 문자열 결합을 수행하면 기존 문자열에 할당되는 것이 아니라 새로운 String 인스턴스가 생성된다.
String x = "123";
String y = "사오육칠";
x += y; // "123사오육칠"이라는 값을 저장하는 주소 값을 새로운 Stack 메모리 영역에 할당한다.
포장 클래스, 기본 타입을 객체로 다루기 위해 사용하는 클래스
래퍼 클래스로 감싸고 있는 기본 타입 값은 외부에서 변경 불가
값 변경 시 새로운 포장 객체를 생성해야 한다.
java.lang 패키지에 포함되어 제공
각 타입에 해당하는 데이터를 파라미터로 전달받아 해당 값을 가지는 객체로 생성
Boxing : 기본 타입을 래퍼 클래스로 변환하는 과정
Unboxing : 래퍼 클래스를 기본 타입으로 변환하는 과정
Java 1.5 이상에서는 Auto Boxing/Unboxing되며, 이전 버전에서는 수동으로 값 변환을 해야한다.
//Java 1.5 이상
int a = 1;
Integer b = a; // auto boxing
int c = b; // auto unboxing
// Java 1.5 미만
int a = 1;
Integer b = new Integer(a); //boxing
int c = b.intValue(); // unboxing