본문 바로가기

JAVA

[Java] 이자바 Chapter2. 변수와 타입

반응형

1. 변수 - 변수란? / 변수의 선언 / 변수의 사용 / 변수의 사용 범위

2. 데이터 타입 - 기본 / 정수 / 실수 / 논리

3. 타입 변환 - 자동 타입 변환(Promotion) / 강제 타입 변환(Casting)

 

1. 변수

1) 변수

변수 : 하나의 값을 저장할 수 있는 메모리 공간. 다른 값으로 바꿀 수 있다. 초기화 되어야 읽을 수 있음.

타입 변수이름;

 

2) 변수 이름 명명 규칙

  1. 첫글자는 문자거나 $, _ 되고, 숫자 안됨.
  2. 영어 대소문자 구분됨.
  3. 첫문자는 영어 소문자, 다른 단어 붙을 때는 첫자 대문자 (Snake 방식)
  4. 길이 제한 없음
  5. 자바 예약어 사용 불가. (예약어 : 문법과 관련된 단어들)

 

3) 리터럴

소스코드 내에서 직접 입력된 값. 정수, 실수, 문자, 문자열, 논리 리터럴 있음.

  • 정수 리터럴 [byte, char, short, int, long]
    • 10진수 : 소수점 없는 정수리터럴
    • 8진수 : 0으로 시작되는 리터럴
    • 16진수 : 0x or 0X로 시작하고 0~9 숫자나 A, B, C, D, E, F 또는 a, b, c, d, e, f로 구성된 리터럴
  • 실수 리터럴 [float, double]
    • 10진수 실수 : 소수점이 있는 리터럴
    • 10진수 지수와 가수 : 대문자 E 또는 e가 있는 리터럴은 10진수 지수와 가수로 간주. 가수 * 10^지수. 5E7 -> 5*10^7
  • 문자 리터럴 [char]
    • 작은 따옴표로 묶은 텍스트는 하나의 문자 리터럴.
    • 이스케이프 문자 : 역슬래쉬가 붙은 문자 리터럴. 특수한 용도로 사용됨.
      • '\u16진수' : 16진수에 해당하는 유니코드
      • '\r' : 리턴. 카트리지를 앞으로 당기는 것에서 시작되었지만, 자바에서는 'r'도 마찬가지로 'n'처럼 줄바꿈의 기능 수행. 
  • 문자열 리터럴 [String]
    • 큰따옴표로 묶은 텍스트는 문자열 리터럴.
    • 내부에서 이스케이프 문자 사용 가능.
    • String은 기본 타입이 아닌 클래스 타입이다.
  • 논리 리터럴 [boolean]
    • true, false

 

4) 변수의 사용 범위

변수는 선언된 블록 내에서만 사용 가능. {}

 

 

 

 

 

2. 데이터 타입

1) 기본타입

자바 언어 차원에서 기본적으로 제공해주는 타입으로, 정수, 실수, 논리 타입이 있다. 

변수는 선언하면 타입을 변경할 수 없다.

최상위부호비트 (MSB: Most Significant Bit) : 0 양수, 1 음수. 수를 표현할 수 있는 비트는 byte의 경우 8-1=7bit이다.

char과 boolean 제외하고는 다 msb 사용. 즉, 두 타입 제외하고는 음수 가질 수 있다.

 

2) 정수타입

byte(1byte = 8bit) -> short(2) -> int(4) -> long(8)

char(2) --> 문자가 유니코드로 저장되므로 사실 char도 정수형으로 보는 게 맞다.

  • byte
    • 1byte 부호있는 정수값
    • 실행 중 값 범위 초과할 경우 : 최소값부터 다시 반복 저장. 127 넘으면 -128부터 다시 시작
      (127에서 ++1하면 -128, -128에서 --1하면 127)
  • char
    • 2byte 부호없는 정수값
    • 유니코드 : 세계 각국의 문자들을 2byte 표현되는 코드값으로 매핑한 국제 표준 규약. 한 문자를 유니코드로 저장.
    • 직접 유니코드 정수값을 저장 가능
    • 유니코드를 알고 싶을 때 : 일단 char 변수 저장하고 그걸 int 타입 변수에 저장하면 된다.
      char c = 'A'; int uniCode = c;
    • 빈(empty)문자 처리 : char c = ' ';하거나 String str=""; 해야 한다. char c = ''; 불가. 빈문자는 유니코드에 매핑 안되어 있어서 공백이라도 넣어줘야 함.
  • short
    • 2byte 부호있는 정수값
    • 자바에선 잘 사용하지 않고, c언어와 타입 호환 위해 가끔 사용
  • int
    • 4byte 부호있는 정수값
    • 자바에서 기본 정수값
    • 약 -21억~ 21억까지 저장 가능
    • 변수에 어떤 진수로 저장해도 이진수로 변환되어서 저장된다.
  • long
    • 8byte 부호있는 정수값
    • int 범위의 리터럴은 상관없고, int 범위 초과 시 l또는 L 붙여야 한다. 
      long var2 = 20L;

 

3) 실수타입

float(4) -> double(8)

부동소수점(floating-point) 방식으로 저장. 즉, 가수와 지수로 나눠서 저장. 

부동소수점 방식으로 저장하면 동일한 메모리 크기를 가지는 int, long보다 더 큰 수를 저장할 수 있다.

가수는 0<=m <= 1 범위의 실수.

1.2345 -> 0.12345 * 10^1 -> 가수 부분에 12345 저장, 지수 부분에 1 저장.

정수 리터럴에 10의 지수를 나타내는 E나 e가 포함되어 있을 때는 실수 타입에 저장해야 한다. double var = 3e6;

  • float
    • 부호(1bit) + 지수(8bit) + 가수(23bit) = 32bit = 4byte
    • float 리터럴은 끝에 F나 f 붙인다.
    • float var = 10; (ㅇ) float var=10.0; (x) float var = 10.0f; (o)
  • double
    • 부호(1bit) + 지수(11bit) + 가수(52bit) = 64bit = 8byte
    • 실수 리터럴의 기본 타입

 

4) 논리타입

boolean(1)

1byte 크기 논리값으로 true, false 저장

상태값 저장할 필요성 있을 때. 조건문, 제어문의 실행 흐름을 변경할 때 사용.

 

 

 

 

 

 

3. 타입변환

1) 타입 변환

데이터 타입을 다른 타입으로 변환하는 것. 종류에는 자동 타입 변환과 강제 타입 변환이 있다.

 

2) 자동 타입 변환 (묵시적 타입 변환, Promotion)

프로그램 실행 도중에 작은 타입은 큰 타입으로 자동 변환

큰크기타입 = 작은크기 타입       -> 자동 타입 변환

  • byte(1) < short(2) < int(4) < long(8) < float(4) < double(8)
  • long(8) ->  float(4) : long 타입으로 표현할 수 있는 수보다 float(부동소수점 방식)이 더 많으므로 물리적인 바이트 수가 적더라도 float으로 자동 타입 변환.
  • char -> int : char가 2바이트이기 때문에 가능. 유니코드에 해당하는 수가 int에 들어간다.
  • 예외 : byte, short -> char 는 안된다. char는 2바이트지만 범위가 0~65000이다. 음수값을 저장할 수 있다. 그런데 byte, short는 음수값이 들어갈 수 있기 때문에 char에 못들어간다. 따라서 강제타입변환해야만 한다.

3) 강제 타입 변환 (명시적 타입 변환, Casting)

큰 타입을 작은 타입 단위로 쪼개고 "끝 한부분만" 작은 타입으로 강제적 변환.

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

  • 끝 한부분만 넣으므로 원래 값이 보존되지 않을 수 있다. byte(1) <- int(4)할 때, 위 세바이트는 버리고 끝 한 바이트만 들어간다.
  • MAX_VALUE, MIN_VALUE : 강제타입 변환 전에 값이 보존될 것인지(손실이 되지 않는지) 검사할 때 유용하다. (아래 예제 참조)
  • int -> float(x) /double(o) : int를 float으로 변환했다가 해당수를 다시 int로 변환하면 값이 달라져 있다. float은 0.123...*10^0 이런식으로 표현해서 가수 부분은 23비트이다. int는 32비트인데 이보다 작다. 따라서 int 값이 손실될 수 있다. double의 경우에는 가수 부분이 52비트이다. 32비트보다 크므로 int값이 그대로 보존된다.
  • int 이하의 타입 연산의 결과는 int
    • int result = [byte / char / short / int 변수] 연산자(+, -, *, /, %) [byte / char / short / int 변수]
    • java에서 정수 타입의 연산의 기본은 int이다. 따라서 int 이하의 타입끼리 연산을 하면 자동으로 int로 저장.
    • int 이하의 정수 타입을 연산하게 되면 자동으로 int 타입으로 변환된 후 연산하게 된다. byte + byte라면 각각 다 int로 변환된 후 연산을 한다. 따라서 결과도 당연히 int로 나온다.
    • charValue + 1 , char + char도 int
  • long 타입 연산은 무조건 long
    • long result = [long 변수] 연산자 [byte / char / short / int]
    • 피연산자 중에 long이 하나라도 있으면 나머지 정수 피연산자들은 전부 long타입으로 변환
  • 실수리터럴 및 double 연산은 double
    • double result = [실수리터럴 / double] 연산자 [byte / char / short / int/ float / double]
  • float은 두 피연산자 모두 float이거나 정수일 경우에만
    • float result = [float] 연산자 [float]
    • float result = [float] + 5(정수)
//MIN_VALUE, MAX_VALUE 사용 예제
if( ( i < Byte.MIN_VALUE ) || ( i>Byte.MAX_VALUE ) ) {
	System.out.println("byte 타입으로 변환 불가");
} else {
	byte b = (byte) i;
	System.out.println(b);
}

 

728x90
반응형