1. 변수
1. 변수란 ?
단 하나의 값을 저장할 수 있는 메모리 공간
2. 변수의 선언과 초기화
int age; // 변수의 선언
age = 25; // 변수의 초기화
변수 타입 : 변수에 저장될 값이 어떤 타입인지를 지정해주는 것 (정수형, 실수형, 문자형 등등..)
변수 이름 : 메모리 공간에 이름을 붙여준 것
→ 변수를 선언하면, 메모리의 빈 공간에 ' 변수 타입에 알맞은 크기의 저장공간이 확보되고, 앞으로 이 저장공간은 '변수 이름'을 통해 사용 가능
🐯 왜 변수를 선언한 이후 반드시 변수를 초기화 해주어야될까?
메모리는 여러 프로그램이 공유하는 자원이다. 전에 다른 프로그램에 의해 저장된 garbage value가 남아있을 수 있기 때문에 반드시 초기화 해주어야 한다!!
3. 변수의 명명규칙
식별자 규칙
- 대소문자가 구분되며 길이에 제한이 없다. → True와 true는 서로 다른 것으로 간주된다.
- 예약어를 사용해서는 안된다. → true는 예약어라서 사용할 수 없지만, True는 가능하다.
- 숫자로 시작해서는 안된다. → top10은 허용하지만, 7up은 허용되지 않는다.
- 특수문자는 '_'와 '$'만을 허용한다. → $harp은 허용되지만, S#arp은 허용되지 않는다.
자바 프로그래머들에게 권장하는 규칙
- 클래스 이름의 첫 글자는 항상 대문자로 한다. 변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다.
- 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다. (lastIndexOf, StringBuffer)
- 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 '_'로 구분한다.
2. 변수의 타입
🐯 자료형은 크게 '기본형'과 '참조형'으로 나뉜다.
기본형 변수 : 실제 값을 저장함. boolean, char, byte, short, int, long, float, double
참조형 변수 : 객체의 주소를 저장함. 8개의 기본형을 제외한 나머지 타입 (새로운 클래스를 작성한다는 새로운 참조형을 추가하는 셈), null 또는 객체의 주소 (4Byte)를 값으로 가짐. 이때 JVM이 32비트가 아니라 64Bit면 변수의 크기는 8Byte!
1. 기본형
타입 | 분류 | 크기 | 저장 가능한 범위 | 기본 값 | 정밀도 | 기타 |
boolean | 논리형 | 1byte | true, false | false | 자동 형변환 X, 0과 1로 표현 X | |
char | 문자형 | 2byte | 유니코드 | '\u0000' | ||
byte | 정수형 | 1byte | $$-2^7$$~$$2^7-1$$ | 0 | ||
short | 정수형 | 2byte | $$-2^{15}$$~$$2^{15}-1$$ | 0 | ||
int | 정수형 | 4byte | $$-2^{31}$$~$$2^{31}-1$$ | 0 | 정수형의 기본 자료형 | |
long | 정수형 | 8byte | $$-2^{63}$$~$$2^{63}-1$$ | 0L | 정수 리터럴 뒤에 L(l)을 붙임 | |
float | 부동 소수점형 | 4byte | $$1.4*10^{-45}$$~$$3.4*10^{38}$$ | 0.0f | 7자리 | 실수 리터럴 뒤에 F(f)을 붙임 부호 비트 1 + 지수 비트 8 + 가수비트 23 |
double | 부동 소수점형 | 8byte | $$4.9*10^{-324}$$~$$1.8*10^{308}$$ | 0.0 | 15자리 | 실수형의 기본 자료형 부호 비트 1 + 지수 비트 11 + 가수비트 52 |
🐯 타입 선택의 기준
정수형일때, 대략 10자리 수 (약 20억)이면 int형을 19자리 수라면 long으로 변수를 선언하는 것이 좋다! 저장 범위를 넘어서면 원하지 않는 결과가 나옴.
실수형은 정수형과 저장 형식이 달라서 훨씬 큰 값을 표현할 수 있지만 오차가 발생할 수 있다! 따라서 정밀도를 감안하여 선택해야된다.
2. 상수와 리터럴
상수 : 값을 저장하는 공간, 한번 값을 저장하면 이후에 다른 값으로 변경 X, 타입 앞에 final 키워드를 붙여서 선언한다.
리터럴 : 그 자체로 값을 의미하는 것
상수 VS 리터럴 : 상수는 리터럴에 의미 있는 이름을 붙여 코드의 이해와 수정을 쉽게 만다는데 사용한다는 점에서 차이가 존재함
문자형
char에는 문자의 유니코드가 정수 형태로 저장된다. 문자에 해당하는 유니코드 값을 저장해도 동일한 문자가 저장됨.
🐯 특수 문자 다루기
\t : 탭
\b : 백스페이스
\f : form feed
\n : 개행문자
\r : carriage return
\\ : 백슬래시
\', \" : 따옴표
\u유니코드 : 유니코드 문자
정수형
정수형의 최대 범위에서 +1을 하는 경우 오버플로우가 발생한다.(언더플로우는 X) → 해당 정수형이 저장할 수 있는 최소 값이 됨
정수형의 byte와 short형은 연산시 int형으로 자동 형변환하여 연산을 수행함 → JVM의 피연산자 스택이 피연산자를 기본 4Byte로 취급하기 때문
실수형
실수형에서 오버플로우 발생 시 값이 무한대가 되고 언더플로우(실수형으로 표현할 수 있는 양의 최솟값보다 작은 값이 되는 경우) 발생시 0이 된다.
3. 형식화된 출력
출력과 문자열로 나타날 때 형식을 지정해서 나타낼 수 있다. → System.out.printf(), String.format() 사용
🐯 형식 지정자의 종류
%b : 논리형
%d : 10진수의 정수형
%o(또는 O) : 8진수의 정수형
%x(또는 X) : 16진수의 정수형 (X사용 시 영문자를 대문자로 출력)
→ %#o, %#x로 나타낼 시 숫자 앞에 각각 0x와 0이 붙는다.
%f : 부동 소수점형 → 기본적으로 소수점 아래 6자리까지만 출력하기 때문에 소수점 아래 7자리에서 반올림
%e(또는 E) : 지수 표현식의 형식으로 출력
%c : 문자형
%s : 문자열
* 정수형 형식 지정자 앞에 자릿수, 정렬 방식, 채움 문자 지정 🙆🏻♀️
* 실수형 형식 지정자의 경우 %(공백 채움 문자) 전체자리.소수점 아래 자리로 지정 🙆🏻♀️
* 문자열과 숫자형 연산시 문자열로 자동 형변환 ("hello" + 1234 = "hello1234")
3. 형 변환
변수나 리터럴의 타입을 다른 타입으로 변환하는 것, 자바에서 형변환은 캐스팅 연산자를 사용한다.
double a = 3.14;
int aToInt = (int) a;
형변환 연산자는 피연산자의 값을 읽어서 해당 타입으로 형변환한 결과를 반환하기 때문에 피연산자 값에 변화가 없다!
🐯 형변환시 오차?!
정수형 → 실수형 : 8자리 이상의 값을 float 형으로 변환하는 경우 오차가 발생한다. double로 형변환 하자
실수형 → 정수형 : 소수점 이하 값은 버려진다. 이때, 소수점 이하를 버리고 남은 정수가 해당 정수형의 저장 범위를 넘어서는 경우 오버플로우 발생
1. 자동 형변환
서로 다른 타입간의 연산을 할 때, 형변환으로 타입을 일치시키는 것이 원칙이지만, 컴파일러가 자동으로 형변환을 해주는 경우가 있다.
위 그림에 우측으로 가는 (기존의 값을 최대한 보존 할 수 있는 타입으로 자동 형변환) 방향의 변환이라면 광역화 형변환이며, 반대의 경우에는 명시적으로 형변환(casting)을 해주어야 하며 협소화 형변환이라 부른다.
🐯 float와 double은 왜 크기가 같은데 정수형 뒤쪽에 위치할까?
보통 자료형의 크기가 큰 것일수록 값의 표현범위가 크기 마련이지만, 실수형은 정수형과 값을 표현하는 방식이 다르기 때문에 같은 크기일지라도 실수형이 정수형보다 훨씬 더 큰 표현 범위를 갖기 때문에 float와 double이 같은 크기인 int와 long보다 오른쪽에 위치한다!
🐯 형변환시 주의점
1. boolean을 제외한 나머지 7개의 기본형은 서로 형 변환이 가능하다!
2. 기본형과 참조형은 서로 형변환 할 수 없다!
3. 서로 다른 다른 타입의 변수 간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.
•──⋅참고 자료⋅──•
📚 남궁성, [Java의 정석], 도우출판 (2016)