본문 바로가기

BACKEND/JAVA

[이것이 자바다] 2장 변수와 타입

변수란?

값을 저장할 수 있는 메모리 공간

변수란 이름은 > 프로그램에 의해서 수시로 값이 변동될 수 있기 때문이다. 

복수 개의 값을 저장할 수 없고, 하나의 값만 저장할 수 있다.

따라서, 하나의 값을 저장할 수 있는 메모리 공간을 의미한다.

 

변수 선언 방법

// 타입  변수이름
int age;
double value;

// 같은 타입에서 여러개 변수 선언 방법
int x,y,z;

// 변수 값 저장
int score = 90;

 

예약어는 변수 이름을 지정할 수 없다.

분류 예약어
기본 데이터 타입 boolean, byte, char, short, int, long, float, double
접근 지정자 private, protected,public
클래스 class, abstract, interface, extends, implement, enum
객체 new, instanceof, this,super, null
메소드 void, return
제어문 if, else, switch, case, default, for, while, break,continue
논리값 true, false
예외처리 try, catch, finally, throw,throws
기타 transient, volatile, package, import, synchronized,native,final

 

정수 리터럴
10진수 : 0,75,100
8진수 : 02,-04
16진수 : 0x4 0xB3

실수 리터럴
소수점이 있는 리터럴은 10진수 실수 : 0.25, -1.3
대문자 E 또는 소문자 e가 있는 실수 리터럴
5E7 : 5 x 10^7
0.12E-5 : 0.12 x 10^-5

 

 

★ 변수는 메소드 블록 내 어디에서든 선언할 수 있지만, 변수 사용은 제한이 따른다. 기본적으로 변수는 선언된 블록 내에서만 사용이 가능하다.

 

변수 사용 범위

public class VariableExample{
	public static void main(String[] args){
    	int v1 = 10;
        if(v1>5){
        	int v2 = v1-5;
        }
        int v3 = v1+v2+5;
        // v2는 if문 안에 있는 변수이므로 사용할 수 없어 컴파일 에러 발생
    }
}

 

 

기본(원시: primitive) 타입

정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입을 말한다.

타입에 따라 저장할 수 있는 값의 종류와 범위가 달라진다.

값의 종류 기본 타입 메모리 사용 크기
정수 byte 1 byte 8 bit
char 2 byte 16 bit
short 2 byte 16 bit
int 4 byte 32 bit
long 8 byte 64 bit
실수 float 4 byte 32 bit
double 8 byte 64 bit
논리 boolean 1 byte 8 bit

 

> double는 높은 정밀도를 가진다. -> 높은 정밀도는 범위가 더 크기 때문이다.

 

 

** 타입 변환

제목 귿로 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다.

자동(묵시적) 타입 변환, 강제(명시적) 타입 변환이 있다.

 

1. 자동(묵시적) 타입 변환 - promotion

프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것

작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생

byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)
☞ float가 int와 long보다 더 큰 타입으로 표시된 이유는 표현할 수 있는 값의 범위가 float가 더 크기 때문이다.

 

2. 강제(명시적) 타입 변환

큰 크기의 타입은 작은 크기의 타입으로 자동 타입 변환을 할 수 없다.

예를 들자면 4byte인 int타입을 1byte인 byte타입에 다믕ㄹ 수 없다. -> 큰 그릇의 물을 작은 그릇 안에 모두 넣을 수 없는 것을 의미

캐스팅(Casting) : 강제적으로 큰 데이터 타입을 작은 데이터 타입으로 쪼개어서 저장하는 것

 작은 크기 타입  =  (작은 크기 타입) 큰 크기 타입

 

* 연산식에서의 자동 타입 변환

연산?

기본적으로 같은 타입의 피연산자 간에만 수행되기 때문에 서로 다른 타입의 피연산자가 있을 경우 두 피연산자 중 크기가 큰 타입으로 자동 변환된 후 연산을 수행한다.

 

// int 타입과 double 타입 연산 
int intValue = 10;
double doubleValue = 5.5;
double result = intValue + doubleValue;
// intValue가 double 값으로 변환하여 연산
// 따라서 result = 15.5 값이 저장된다.

 

여기서 int 타입을 꼭 연산해야 할 경우에는? double 타입을 int 타입으로 강제 변환하고 연산 수행

int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int)doubleValue;
// double 타입을 int형으로 강제 타입 변환을 하여 연산을 한다.
// double타입이 int타입으로 연산되었기 때문에 result는 15가 저장된다.

 

 

char ch = 'A';
int result = ch + 1;	// 'A' 유니코드보다 1이 큰 유니코드가 저장
char na = (char)result	// 'B'가 저장된다.