변수, 명명규칙 / 변수 타입 (기본형, 참조형) / 멤버변수(클래스변수, 인스턴스변수), 지역변수

변수(Variable) 프로그래밍언어에서의 변수는 값을 저장할 수 있는 메모리상의 공간 이렇게 저장된 값은 변경될 수 있기 때문에 수학적의미의 '변수'와 상통한다. 하나의 변수에는 하나의 값만 저

jinaon.tistory.com

 

 

 

 

1. 기본형 변수의 메모리 크기와 숫자 범위

type 타입명 저장 크기 저장 가능한 최소값 저장 가능한 최대값
정수형 byte 1byte (8bit) 2^7 2^7-1
  short 2byte (16bit) -2^15 2^15-1
  int 4byte (32bit) -2^31 (약 -20억) 2^31-1 (약 20억)
  long 8byte (64bit) 2^63-1 2^63-1
실수형 float 4byte / 정밀도 7자리 -3.4e38 ~ -1.4e-45
1.4e-45 ~ 3.4e38
  double 8byte / 정밀도 15자리 -1.8e308~ -4.9e-324
4.9e-324 ~ 1.8e308
문자형 char 2byte (8bit) u0000
0
uFFFF
65535 (2^7-1)
논리형 boolean 1byte    

 

 

 

2. 상수

변수 - 값을 저장할 수 있는 공간

상수 - 값을 저장할 수 있는 공간, 한번 값을 저장하면 변경할 수 없음 (값을 한번만 저장할 수 있는 공간)

 

상수는 변수 선언방법과 동일하게 선언하며, 변수 타입 앞에 final만 붙여주면 된다.

상수의 이름은 대문자를 이용하고, 상수의 선언과 동시에 초기화를 해주는 것이 좋다.

 

상수 선언 & 초기화

final 변수타입 상수명 = 값 ; 

final int MAX = 100;

 

 

 

3. 리터럴

리터럴(literal)은 그 자체로 직접 입력된 값(데이터)를 의미한다. 

int num = 5;
final int MAX = 100;

여기서 num은 변수, MAX는 상수, 저장된 값인 5와 10은 리터럴이다.

 

 

변수타입 변수명 = 리터럴

변수 타입 리터럴 
 boolean 논리형 false, true
byte short int  정수형 리터럴 int (접미사x)
long 정수형 리터럴 long (접미사 L)
float 실수형 리터럴 float (접미사 f, 생략가능)
double 실수형 리터럴 double (접미사 d)
char 문자형
String 문자열

변수의 타입은 저장될 값(리터럴)의 타입에 의해 결정된다.

논리형(boolean), 문자형(char), 문자열(String)에는 각각의 리터럴을 저장할 수 있는 데이터 타입이 하나씩 존재하기 때문에 따로 구분할 필요가 없다.

 

boolean b = true;
char ch = 'A';
String str = "문자열";

 

 

하지만 정수형과 실수형의 경우에는 여러 타입이 존재하기 때문에 리터럴 타입을 접미사로 구분해야 한다. 값이 출력될 때 접미사는 출력되지 않는다.

 

정수형 리터럴 : byte, short, int, long

실수형 리터럴 : float, double

 

 

1) 정수형 리터럴 - int, long

정수형 리터럴은 int, long 두가지이다.

long 리터럴은 정수형 변수타입 중에 long 에 저장되고, byte short int 변수는 int타입의 리터럴을 사용한다.

long 타입과 integer 타입은 리터럴의 접미사로 구분한다.

기본 : int 타입 (접미사 없음)

접미사 L : long 타입

byte타입 변수에 int타입의 리터럴이 저장되고, short형 변수에 int타입의 리터럴이 저장되고 int 타입 변수에 int 리터럴이 저장된다는 뜻이다.

long 타입 변수에는 long 타입의 리터럴이 저장된다. 

byte, short, int 에는 접미사 없이 숫자를 써서 변수에 저장하면 되는데, long 타입 변수에 숫자를 저장할 때는 접미사 L을 붙여주어야한다.

 

byte b = 127; //int형 리터럴이 byte에 저장된다

byte b = 128; //byte 변수 저장값 범위를 벗어나서 error!

long l = 12345; // error! 접미사 L이 필요하다.

 

 

 

정수의 진수타입은 리터럴의 접두사로 구분할 수 있다.

 

10 진수 정수 리터럴

숫자만 작성하면 된다.  ex. 0, 55, -55

 

2진수 정수 리터럴

숫자앞에 0b를 붙인다. ex. 0b0101

 

8진수 정수 리터럴 

정수 앞에 0을 붙인다. ex. 012, -05

 

16진수 정수 리터럴

숫자 앞에 0x 혹은 0X를 붙여준다. ex. 0x11, 0xA, 0XC5, 0XAB15

 

정수 접두사
10진수 접두사 없음
2진수 0b
8진수 0
16진수 0x, 0X

 

int n = 0b100;
System.out.println(n); //4 출력

2진수 100을 int에 저장했다. println으로 출력될 때는 10진수로 변환되어 값이 나타난다.

 

 

 

 

2) 실수형 리터럴 -double, float

기본 : double 타입 (접미사 d, 생략가능)

접미사 f : float 타입

 

double 타입 변수에는 double 타입이 저장되고, 접미사는 생략가능하다.

float 타입 변수에 저장할 때는 접미사 f를 붙여준다.

 

ex.

10.  = 10.0 double 리터럴

.10  = 0.10 double 리터럴

1e3 = 1000.0 double 리터럴

10f = 10.0f float 리터럴

1e3f= 1000.0f float리터럴

 

 

float n = 3.14; // error!
float n = 3.14f; //저장 가능
double m = 3.14; //저장 가능
double m = 3.14d; // 저장 가능

3.14에는 아무런 접미사가 없기 때문에 d가 생략된 double 리터럴으로 간주된다.

float 타입 변수에 그대로 저장할 수 없으니 반드시 f를 붙여주어야 한다.

double 타입 변수에는 접미사가 생략된 실수형, d가 붙은 실수형 모두 에러없이 저장된다.

 

 

 

 

 

double

소수점 포함 리터럴 ex. -5.23 , 1.34

E 또는 e 가 포함 리터럴 ex. 3E2  = 3*10^2

 

float

ex. 10f, 3.14e3f, 10.0f

 

 

접미사, 접두사는 대소문자 구분하지 않는다.

 

 

 

4. 변수와 리터럴 타입의 불일치에도 저장 가능한 경우

범위가 변수 > 리터럴일 경우 타입이 불일치 해도 저장 가능하다.

 

int > char : 문자형 리터럴 int에 저장 가능

문자형 리터럴을 정수형 변수 int로 저장할 수 있다.

char은 2byte로 0부터 2^7-1 까지 저장할 수 있다. 문자 리터럴은 유니코드로 변환되어 저장된다. 유니코드는 세계 각국의 문자를 2byte로 표현할 수 있는 숫자(0~65535(2^7-1))로 매핑한 국제표준 규약이다. 유니코드는 정수이기  때문에 char은 유니코드 정수 리터럴을 저장하는 것이다.

정수의 범위가 더 크고, char의 정수형 범위가 포함된다. 

int n = 'A' ; //'A'의 유니코드 65가 n에 저장된다.

 

문자 리터럴을 정수타입의 변수에 저장할 경우에는 유니코드값(정수)이 나오게 되고, 

char 타입에서는 자동으로 매핑되어 문자형태로 출력된다.

 

 

long > int : int 범위 정수 리터럴 ->  long에 저장 가능

long l = 100; //저장됨
long l = 2200000000; //error! int형 리터럴 범위를 벗어났다.
long l = 2200000000L; //저장됨

100에는 접미사L이 없기 때문에 int형 리터럴이다. 정수 숫자의 범위가 long 이 int를 포함하고 있기 때문에 long에 int형 리터럴이 오류없이 저장된다.

int형 변수에 저장될 수 있는 정수 리터럴의 범위를 벗어난 2^31 부터는 int형 리터럴로 쓸 수 없다.

이 경우에는 반드시 접미사 L을 붙여준다.

 

 

double > float : float 리터럴을 double 변수에 저장할 수 있다.

double d = 3.14f;

위의 경우와 동일하다. 접미사 f가 붙은 float 리터럴이 double 변수에 정상적으로 저장된다.

 

 

 

변수 범위 < 리터럴 범위 인 경우 에러, 저장할 수 없다.

float f = 3.14; //error!

double 타입이 범위가 더 크기 때문에 float에 저장할 수 없다.