티스토리 뷰

반응형

2.Chapter02 : 변수와 타입


2.1 변수


2.1.1 변수란?


변수란, 하나의 값을 저장할 수 있는 메모리 공간이다. (수시로 값 변동될 수 있다.)


2.1.2 변수의 선언


int age;          //정수(int)값을 저장할 수 있는 age 변수 선언

double value;    // 실수(double) 값을 저장할 수 있는 value 변수 선언


- 같은 타입의 변수 한번에 선언가능

int x,y,z;


- 변수 명명 규칙

' 첫 번째 글자는 문자이거나 '$','_'이어야 하고 숫자로 시작할 수 없다.

' 영어 대소문자가 구분된다.

' 첫 문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 첫문자를 대문자로 한다.(관례)

ex) maxSpeed

' 문자 수(길이)의 제한은 없다.

' 자바 예약어는 사용할 수 없다.


2.1.3 변수의 사용

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

int score2 = 90; //변수 선언과 동시에 값 저장


2.1.4 변수의 사용 범위


변수는 선언된 블록 내에서만 사용이 가능하다.

public class Main {

public static void main(String[] args) {
int v1 = 15;
if(v1>10){
int v2 = v1 - 10;
}
int v3 = v1+v2+5; //v2 변수를 사용할 수 없기 때문에 컴파일 에러가 발생
}
}



2.2 데이터 타입


모든 변수에는 타입이 있으며, 타입에 따라 저장할 수 있는 값의 종류와 범위가 달라진다.


2.2.1 기본(원시 : primitive) 타입


값의 종류 

기본 타입 

메모리 사용크기 

 정수

byte 

1 byte 

char 

2 byte 

short 

2 byte 

int 

4 byte 

long 

8 byte 

 실수

float 

4 byte 

double 

8 byte 

논리 

boolean 

1 byte



2.2.2 정수 타입(byte, char, short, int, long)


- 자바는 기본저긍로 정수 연산을 int 타입으로 수행한다. 그렇기 때문에 저장하려는 값이 정수 라면 특별한 이유가 없다면 int 타입에 저장.

- int 타입의 저장 범위를 넘어서는 큰 정수는 반드시 소문자 'l' 또는 대문자 'L'을 붙여야 한다. 일반적으로 혼돈되지 않게 대문자 'L'을 붙인다. ex) long var2 = 20L;


2.2.3 실수 타입(float, double)


- 소수점이 있는 실수 데이터를 저장할 수 있는 타입. 정수 타입보다 훨씬 더 큰 범위의 값 저장 가능.

- float 타입 변수에 저장하려면 뒤에 소문자'f' 또는 대문자 'F'를 붙여야 한다.

ex) float var = 3.14F;


2.2.4 논리 타입 (boolean)


- 논리값 true/false를 저장할 수 있는 데이터 타입이다. 상태 값에 따라 조건문과 제어문의 실행 흐름을 변경하는데 주로 이용된다.


2.3 타입 변환


타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것으로, 자동 타입변환과 강제 타입 변환으로 나뉜다.


2.3.1 자동 타입 변환


자동 타입 변환(Promotion)은 프로그램 실행 도중에 자동적으 타입 변환이 일어나는 것이며, 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다.


byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)


float이 long보다 더 큰 타입으로 표시된 이유는, 표현할 수 있는 값의 범위가 float이 더 크기 때문이다.


public class Main {

public static void main(String[] args) {
byte byteValue = 10;
int intValue = byteValue; //자동 타입 변환 발생

int intValue2 = 200;
double doubleValue = intValue2; //200.0
}
}

자동 타입 변환이 발생되면 변환 이전의 값과 변환 이후의 값은 동일하다. 손실 없이 보존된다.


2.3.2 강제 타입 변환


강제적으로 큰 타입의 데이터를 작은 데이터 타입으로 쪼개어 저장하는 것을 강제 타입 변환(캐스팅 : Casting)이라고 한다.

**데이터 손실이 되지 않도록 주의해야 한다.

public class Main {

public static void main(String[] args) {
long longValue = 300;
int intValue = (int) longValue; //intValue는 300이 그대로 저장된다.

double doubleValue = 3.14;
int intValue2 = (int) doubleValue; //intValue는 정수 부분인 3만 저장된다.
}
}

long 타입 변수에 300이 저장되어 있을 경우, 8Byte 중 끝의 4Byte로 300을 충분히 표현 할 수 있으므로, 이것을 int 타입으로 강제 타입 변환해도 300이 그대로 유지된다. 그러나, 데이터 크기에 따라 손실이 발생될 수 있다.



기본타입별 최대값 상수와 최소값 상수... 일부는 생략
Byte.MAX_VALUE;
Byte.MIN_VALUE;
Short.MAX_VALUE;
Short.MIN_VALUE;
Integer.MAX_VALUE;
Integer.MIN_VALUE;
Double.MAX_VALUE;
Double.MIN_VALUE;
public class Main {

public static void main(String[] args) {
int num1 = 123456780;
int num2 = 123456780;

float num3 = num2;
num2 = (int)num3;

int result = num1 - num2;
System.out.println(result); // -4 출력

/* 동일한 값을 저장했기 때문에 0이 나올 것이라 기대 했지만, 결과가 다르게 나타났다.
int 값을 손실 없이 float 타입으로 변환하려면 32비트 이상이어야 하는데,
23비트로 표현이 안되어 정밀도 손실이 발생됐다.
안전하게 변환하려면 52비트로 표현가능한 double로 변환하면 된다.
*/
}
}


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


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


public class Main {

public static void main(String[] args) {
//서로 다른 타입의 피연산자간 연산시 크기가 더 큰 타입으로 자동 변환 후 연산
int intValue = 10;
double doubleValue = 5.5;
double result = intValue + doubleValue; // result에 15.5 저장된다. intValue가 double 값으로 변환


//작은 타입으로 꼭 연산해야 한다면, 강제 변환 후 연산
int intValue2 = 10;
double doubleValue2 = 5.5;
int result2 = intValue2 + (int)doubleValue2; // result에 15가 저장

}
}









반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함