대입 연산자(=)
를 사용한다.// 변수의 선언
int age;
double value;
// 값 저장
age = 30;
valute = 0.5;
//변수의 선언과 저장
int score = 90;
작성 규칙 | 예 |
---|---|
첫 전째 글자는 문자이거나 $ ,_ 이어야 하고 숫자로 시작할 수 없다.(필수) | 가능 : price, $price, _companyName 불가능 : 1v, @speed, $#value |
영어 대소문자를 구분한다.(필수) | firstname과 firstName은 다른 변수 |
첫 문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 첫 문자를 대문자로 한다.(관례) | maxSpeed, firstName,carBodyColor |
자바 예약어는 사용할 수 없다.(필수) | ----------------------------------------------- 기본타입(char, int, double) 접근 제한자(private, public) 클래스와 관련된 것(class, abstract, interface) 객체와 관련된 것(new, instanceof, this, super, null) 메소드와 관련될 것(void, return) 제어문과 관련된 것(if, else, switch, for, while) 논리값(true, false) 예외처리와 관련된 것(try, catch, finally, throws) 기타(package, import, static, final) |
int hour = 3;
int minute = 5;
int totalMinute = (hour * 60) + minute;
int totalMinute = (3 * 60) + minute;
int totalMinute = 180 + 5;
int totalMinute = 185;
int x = 10; // 변수 x에 10을 저장
int y = x; //x에 저장된 값을 변수 y에 복사(저장)
자바의 모든 변수는 중괄호 {} 블록
내에서 선언되고 사용된다.
메소드 블록 내에서 선언된 변수를 로컬 변수라고 부르는데, 로컬 변수는 메소드 블록 내부에서만 사용되고 메소드 실행이 끝나면 메모리에서 자동으로 없어진다.
public class VariableExample{
public static void main(String[] args) {
int value = 10; // 로컬 변수
int sum = value + 20; // 로컬 변수
System.out.println(sum);
}
}
변수는 블록 내 어디에서는 선언할 수 있지만, 변수 사용에는 제한이 따른다.
변수는 자신이 선언된 위치로부터 자신이 속한 블록 내부에서만
사용할 수 있다.
메소드 블록 내에는 다른 중괄호 {} 블록들이 작성될 수 있다.
예를들어 조건문에 해당하는 if(){}
, 반복문에 해당하는 for(){}
등이 중괄호 블록을 가질 수 있다.
이러한 중괄호 {} 블록 내에서 선언된 변수는 해당 중괄호 {} 블록 내에서만 사용이 가능하고 밖에서는 사용할 수 없다.
public static void main(String[] args) {
int var1;
if() { //var1과 var2 사용가능
int var2;
}
for() { //var1과 var3 사용가능, var2는 사용못함
int var3;
}
//var1 사용가능
//var2와 var3는 사용못함
}
💡변수를 선언할 때의 주의사항
1. 변수가 어떤 범위에서 사용될 것인지를 생각하고, 선언 위치를 결정해야 한다.
2. 메소드 블록 전체에서 사용하고 싶다면 메소드 블록 첫머리에 선언한다.
3. 특정 블록 내부에서만 사용된다면 해당 블록 내에 선언한다.
자바는 정수, 실수 ,논리값을 저장할 수 있는 기본 타입
을 총8개 제공한다.
저장되는 값에 따른 분류 | 타입의 종류 |
---|---|
정수 타입 | byte, char, short, int, long |
실수 타입 | float, double |
논리 타입 | boolean |
자바에서 정수 타입은 총 5개로, 메모리 사용 크기와 저장되는 값의 범위가 서로 다르다.
타입 | 메모리 사용크기 | 저장되는 값의 허용범위 | |
---|---|---|---|
byte | 1byte(8bit) | ~ | -128 ~ 127 |
short | 2byte(16bit) | ~ | -32,768 ~ 32767 |
char | 2byte(16bit) | ~ | 0 ~ 65535(유니코드) |
int | 4byte(32biy) | ~ | -2,147,483,648 ~ 2,147,483,647 |
long | 8byte(64bit) | ~ | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
char타입은 음수 값을 가질 없으며, 나머지 정수 타입이 저장할 수 있는 값의 범위는 ~ 이다.
여기서 n은 메모리 bit수
이다. 정수 타입으로 선언된 변수에는 정수 리터럴을 대입해서 정수를 저장할 수 있다.
long타입은 수치가 큰 데이터를 다루는 프로그램에서 주로 사용된다.
기본적으로 컴파일러는 정수 리터럴을 int타입으로 간주되기 때문에, long의 경우 컴파일러에게 따로 알려주어야 한다.
long balance = 30000000000; //컴파일 에러
long balance = 30000000000L; //소문자l 혹은 대문자L을 붙여주어야 한다.
하나의 문자를 작은 따옴표('')로 감싼 것을 문자 리터럴
이라고 한다.
문자 리터럴은 유니코드
로 변환되어 저장된다. 유니코드는 세계 각국의 문자를 2byte로 표현할 수 있는 숫자(0~65535)로 매핑한 국제 표준 규약이다.
예를 들어 'A','B','가','각' 문자를 char변수에 저장할 경우 변수에 저장되는 유니코드 값은 아래와 같다.
char var1 = 'A'; //유니코드: 65
char var2 = 'B'; //유니코드: 66
char var3 = '가'; //유니코드: 44032
char var4 = '각'; //유니코드: 44033
유니코드는 정수이므로 char도 정수 타입에 속한다. 그래서 char변수에 작은따옴표('')로 감싼 문자가 아니라, 10진수 또는 16진수 형태로 유니코드를 저장할 수 있다.
💡문자 리터럴을 int타입에 저장할 경우
작은따옴표('')로 감싼 문자 리터럴은 유니코드로 변환되기 때문에 int타입 변수에도 저장할 수 있다.
char타입 변수에 저장하면 자동으로 문자로 매핑되어 출력되지만, int타입 변수에 저장하면 유니코드가 출력된다.char var1 = 'A'; int var2 = 'A'; System.out.println(var1); //A를 출력 System.out.println(var2); //65를 출력
소수점이 있는 실수 리터럴을 저장할 수 있는 타입에는 float
와 double
이 있다.
타입 | 메모리 사용크기 | 저장되는 값의 허용범위(양수기준) | 정밀도(소수점 이하 자리) |
---|---|---|---|
float | 4byte(32bit) | (1.4 x ) ~ (3.4 x ) | 7자리 |
double | 8byte(64bit) | (4.9 x ) ~ (1.8 x ) | 15자리 |
자바는 실수 리터럴을 기본적으로 double 타입
으로 해석하기 때문에 double 타입 변수에 저장해야 한다.
실수 리터럴을 float 타입 변수에 저장하면 컴파일 에러가 발생한다.
float var = 3.14; //컴파일 에러 발생
float var = 3.14f;
double var = 3.14;
double var = 314e-2;
double 타입은 float 타입보다 2배 정도 정밀도가 높기 때문에 좀 더 정확한 데이터 저장이 가능하다.
자바는 참과 거짓을 의미하는 논리 리터럴로 true
와 false
를 사용한다.
boolean stop = true;
boolean state = false;
두 변수의 타입이 동일할 경우, 한쪽 변수값을 다른 쪽 변수에 복사해서 저장할 수 있다.
byte a = 10; //byte 타입 변수 a에 10을 저장
int b = a; //변수 a에 저장된 10을 int 타입 변수 b에 복사해서 저장
원래 10은 byte 타입의 값이었으나, 복사해서 저장할 때 int 타입의 값으로 변환되었다.
자바에서는 이것을 타입 변환
이라고 한다.
자동 타입 변환은 말 그대로 자동으로 타입 변환이 일어나는 것을 의미한다.
자동타입 변환은 값의 허용 범위가 큰 타입으로 저장될 때 발생하는데, 기본 타입을 허용 범위 크기순으로 정리하면 아래와 같다.
byte < short < int < long < float < double
아래의 코드는 int 타입이 byte 타입보다 허용 범위가 더 크기 때문에 자동 타입 변환이 일어난다.
byte byteValue = 10;
int intValue = byteValue; //자동 타입 변환됨
정수 타입이 실수 타입으로 저장될 경우, 실수 타입의 허용 범위가 더 크기 때문에 무조건 자동 타입 변환이 일어난다.
long longValue = 5000000000L;
float floatValue = longValue; //5.0E9f로 저장됨
double doubleValue = longValue; //5.0E9로 저장됨
char 타입의 경우 int 타입으로 자동 타입 변환되면 유니코드 값이 int 타입에 저장된다.
char charValue = 'A';
int intValue = charValue; //65가 저장됨
💡자동 타입 변환에서의 예외
char 타입보다 허용범위가 작은 byte 타입은 char 타입으로 자동 타입 변환될 수 없다.
왜냐하면 char타입의 허용범위는 음수를 포함하지 않는데, byte 타입은 음수를 포함하기 때문이다.byte byteValue = 65; char charValue = byteValue; //컴파일 에러
큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나눠서 저장하는 것을 강제 타입 변환(castiong)
이라고 한다.
강제 타입 변환은 캐스팅 연산자 괄호()
를 사용하는데, 괄호 안에 들어가는 타입은 나누는 단위이다.
int intValue = 10;
byte byteValue = (byte) intValue;
int intValue = 10;
char charValue = (char) intValue;
System.out.println(charValue); //'A' 출력
실수 타입(float, double)은 정수 타입(byte, short, int, long)으로 강제 타입 변환을 사용해야 한다. 이 경우 소수점 이하 부분은 버려지고, 정수 부분만 저장된다.
double doubleValue = 3.14;
int intValue = (int) doubleValue; //3
정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산을 수행한다.
byte reulst1 = 10 + 20;
System.out.println(result);
byte x = 10;
byte y = 20;
int result2 = x + y;
System.out.println(result2);
정수 연산식에서 모든 변수가 int 타입으로 변환되는 것은 아니고, 두 피연산자 중 허용 범위가 큰 타입으로 변환되어 연산을 수행한다.
예를 들어 int 타입보다 허용 범위가 더 큰 long 타입이 피연산자로 사용되면 다른 피연산자는 long 타입으로 변환하고 연산을 수행한다. 따라서 연산 결과는 long 타입 변수에 저장해야 한다.
byte value1 = 10;
int value2 = 100;
long value3 = 1000L;
long result = value1 + value2 + value3;
System.out.println(result);
실수 타입 변수가 산술 연산식에서 피연산자로 사용될 경우, 피연산자 중 하나가 double 타입이라면 다른 피연산자도 double 타입으로 자동 타입 변환되어 연산을 수행한다. 따라서 연산 결과는 double 타입이 된다.
int 타입과 double 타입을 연산하는 경우에도 int 타입의 피연산자가 double 타입으로 자동 변환되고 연산을 수행한다.
만약, int 타입으로 연산을 해야하는 경우에는 강제 변환을 해주어야 한다.
int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int) doubleValue; //15
연산식에서 +
연산자가 연이어 나오면 앞에서부터 순차적으로 + 연산을 수행한다.
만약 먼저 수행된 연산이 결합 연산이라면 이후 + 연산은 모두 결한 연산이 된다.
int value = 1 + 2+ 3; //6
String str = 1 + 2+ "3"; //"33"
String str = 1 + "2" + 3; //"123"
String str = "1" + 2 + 3; //"123"
변환타입 | 사용 예 |
---|---|
String ➡️ byte | String str = "10"; byte value = Byte.parseByte(str); |
String ➡️ short | String str = "200"; short value = Short.parseShort(str); |
String ➡️ int | String str = "300000"; int value = Integer.parseInt(str); |
String ➡️ long | String str = "40000000000"; long value = Long.parseLong(str); |
String ➡️ float | String str = "12.345"; float value = Float.parseFloat(str); |
String ➡️ double | String str = "12.345"; double value = Double.parseDouble(str); |
String ➡️ boolean | String str = "true"; Boolean.parseBoolean(str); |