하나의 값을 저장할 수 있는 메모리 공간
으로 프로그램 실행 도중에 필요한 데이터를 저장해놓는 공간을 의미
Java는 Camel Case
명명 규칙을 따라 첫 문자는 소문자, 그 이후에 연결되는 문자의 첫자는 대문자로 표기
예 : camelCase
대소문자 구분이 되기 때문에 같은 뜻의 단어더라도 대소문자가 다르면 서로 다른 변수로 인식
예 : camelCase, calmelcase
이름을 지을 때에는 숫자를 먼저 입력 불가
유형 | 설명 | 예시 |
---|---|---|
Class | 대문자로 시작, 주로 명사 | class Thread class Person |
Interface | 대문자로 시작, 주로 형용사 | interface Runnable |
Method | 소문자로 시작, 주로 동사 | add() run() setId() |
Variable | 소문자로 시작 | int age; String name String studentNumber |
package | 소문자로 구성 | com.example.util |
Constant | 대문자로 구성 | static final int PI = 3.1415 |
자바에서는 변수 선언 위치에 따라 선언만 했을 때, 초기화되지 않는 경우와 초기화되는 경우가 나뉜다
이는 각 변수의 생성 시기와 관련이 있는데, 자바에는 클래스 변수
, 인스턴스 변수
, 지역 변수
가 있다
class StudentOfOneHighSchool{
int studentNumber; // 인스턴스 변수
static int schoolNumber; //클래스 변수
boolean isFreshMan(){
boolean isTrue = false; //지역 변수
//...
}
}
전역 변수에 해당하는 클래스 변수, 지역 변수는 클래스, 인스턴스가 생성될 때 메모리에 같이 할당되기 때문에 기본값으로 묵시적 초기화
지역 변수는 메서드 등 안에서 생성되어 사용되어야하는데 이 경우 선언 후, 초기화하지 않고 사용 시 컴파일/런타임 오류 발생
int value = 10; //기본형 자료형의 명시적 초기화
Person person = new Person(); //참조형 자료형의 명시적 초기화
class Person{
int cnt;
String type;
int age;
String studentNumber;
Person(int age, String studentNumebr){
this.cnt++;
this.type="a";
this.age = age;
this.studentNumber = studentNumber;
}
Person(int age){
this.cnt++;
this.type="a";
this.age = age;
this.studentNumber = "123456";
}
}
static {}
{}
class Person{
int cnt;
String type;
int age;
String studentNumber;
{
this.cnt++;
this.type="a";
}
Person(int age, String studentNumebr){
this.age = age;
this.studentNumber = studentNumber;
}
Person(int age){
this.age = age;
this.studentNumber = "123456";
}
}
byte, char, short, int, long 변수에 저장할 수 있음
1. 10진수 소수점이 없는 정수
2. 8진수 0으로 시작되는 정수
3. 16진수 0x, 0X로 시작하고 0~9, A~F/a~f로 구성된 정수
float, double 변수에 저장할 수 있음
1. 10진수 실수 소수점이 있는 수
2. 10진수 지수와 가수 E/e가 있는 수
char 변수에 저장할 수 있음
1. 작은 따옴표로 묶은 텍스트, 단 하나의 문자열만을 문자로 취급
2. ₩가 붙은 문자리터럴은 특수용도
이스케이프 문자 | 용도 |
---|---|
₩t | 수평 탭 |
₩n | 줄 바꿈 |
₩r | 리턴 |
₩" | 큰 따옴표 |
₩' | 작은 따옴표 |
₩₩ | ₩ |
₩u(16진수) | 16진수에 해당하는 유니코드 |
₩n, ₩r의 차이점
- ₩n : 개행, 커서의 위치를 다음줄로 이동
- ₩r : 커서의 위치를 현재 줄의 맨 앞으로 이동
String 변수
에 저장할 수 있음
1. 큰 따옴표로 묶인 텍스트, 문자열 리터럴 내부에서 이스케이프 문자 사용 가능
boolean에 저장할 수 있음
1. true
2. false
변수는 선언된 블록 내에서만 사용이 가능하다
1. 메소드 블록 안에서 선언된 경우에는 해당 메소드에서만 사용 가능하며, 다른 메소드에서는 사용할 수 없다.
2. if, for 블록 안에서 선언된 경우, if문/for문 안에서만 사용 가능하며 각 조건문, 반복문을 벗어난 경우 사용할 수 없다
3. class 블록 안에서 선언된 경우, 해당 class에서만 사용 가능한 지역 변수가 된다.
종류 | 기본 타입 | 메모리 사용 크기(byte(bit)) | 값의 범위 |
---|---|---|---|
정수 | byte char short int long | 1byte(8bit) 2byte(16bit) 2byte(16bit) 4byte(32bit) 8byte(64bit) | -128~127( ~ ) 0~65535(0 ~ ) -32768~32767( ~ ) ~ ~ |
실수 | float double | 4byte(32bit) 8byte(64bit) | 1.4E-45 ~ 3.4E38 4.9E-324 ~ 1.7E308 |
논리 | boolean | 1byte(8bit) | true, false |
byte, short, int, long, float, double의 최상위비트는 부호비트로 0은 양수, 1은 음수를 의미하기 때문에 수를 표현할 수 있는 자리수는 할당된 byte - 1이 됨
❶ byte
부호 있는 정수값 저장하며, 값의 범위를 초과한 경우 최소값(-128)부터/최대값(127)부터 다시 반복 저장
비트 연산 생각해보면
(127 + 1) 01111111 + 00000001 => 1000000 = -128
(-128 - 1) 10000000 - 00000001 => 01111111 = 127
❷ char
하나의 문자를 유니코드로 저장하기 때문에 정수형으로 간주하며, 부호가 없는 정수값을 저장
문자 | 유니코드(16진수) | 2진수 | 10진수 |
---|---|---|---|
A | 0x0041 | 00000000 01000001 | 65 |
B | 0x0042 | 00000000 01000010 | 66 |
가 | 0xAC00 | 10101100 00000000 | 44032 |
❸ short
부호가 있는 정수값을 저장하며, C언어와의 타입 호환을 위해서 사용됨
❹ int
부호가 있는 4byte 크기의 정수값을 저장, 10/8/16진수 저장 가능
메모리에 저장될 때는 2진수로 저장되며 4byte 크기를 차지하기 때문에 32bit로 표현되어 저장됨
예 : 10 -> 00000000 00000000 00000000 00001010
❺ long
8byte 크기의 부호가 있는 정수값을 저장, int 범위를 벗어나는 정수리터럴을 대입할 경우 L/l을 붙여야 함
부동 소수점 (floating-point) 방식으로 저장하며 지수 비트, 가수 비트로 나뉘어 저장됨
지수, 가수 비트로 나뉘어 표현하는 방식을 통해 동일한 메모리 크기를 가지는 int / long 보다 더 큰 수를 저장할 수 있음
기본 타입은 double이기 때문에 float 리터럴은 F/f를 붙여 구분
❶ float
부호 비트 (1) + 지수 비트 (8) + 가수 비트 (23)
❷ double
부호 비트 (1) + 지수 비트 (11) + 가수 비트 (52)
1 byte 크기를 가지며 true / false를 저장해 두 가지 상태값을 가질 수 있음
데이터 타입을 다른 타입으로 변환하는 것
따로 타입을 명시하지 않아도 알아서 변환
작은 타입을 큰 타입으로 변환할 때 적용됨
byte(1) -> short(2) -> int(4) -> long -> float -> double
char(2) -> int(4)
따로 타입을 명시해야만 강제적으로 타입이 변환
큰 타입을 작은 타입 단위로 쪼개고 끝 한 부분만 작은 타입으로 강제 변환함
4 byte 크기의 int 타입 변수를 1 byte 크기의 byte 타입으로 변환한다면 마지막 1byte만 byte 형으로 강제 변환
값이 손실되는 걸 방지하기 위한 검사
if(i < Byte.MIN_VALUE || i > Byte.MAX_VALUE){
System.out.println("변환 불가");
}else{
byte b = (byte) i;
System.out.println(b);
}
같은 타입의 피연산자 사이에서만 연산이 수행되기 때문에 서로 다른 타입의 피연산자는 같은 타입, 크기가 큰 타입으로 자동 변환되어 연산됨
작은 타입으로 연산하고 싶다면 강제 변환
int result = a + b;
// a : byte | char | short | int
// b : byte | char | short | int
long result = a + b;
// a : long
// b : byte | char | short | int | long
double result = a + b;
// a : 실수 리터럴 | double
// b : byte | char | short | int | float | double
float result = a + b;
// a : float
// b : float