Hayden's Archive
[자바/Java] 변수와 자료형 본문
참고 도서 : Do it! 자바 프로그래밍 입문 ( https://book.naver.com/bookdb/book_detail.nhn?bid=13797129 )
참고 강의 : Do it! 자바 프로그래밍 입문 인프런 강의 ( https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9E%85%EB%AC%B8 )
변수 Variable
- 변수 : 자료 값을 저장할 공간
- 변수를 선언한다 : 변수의 자료형을 선택하고 이름을 정하는 것. 변수를 선언하면 컴퓨터 내부의 메모리에서 공간이 할당됨.
- = : 오른쪽 값을 왼쪽에 대입한다.(컴퓨터는 사람과 달리 코드를 오른쪽에서 왼쪽으로 읽음)
- 초기화 : 변수에 값을 저장하는 것. 처음으로 되돌리는 것이 아님.
- 변수 이름은 숫자로 시작할 수 없으며, 자바에서 이미 사용 중인 예약어(reserved word)는 변수로 사용할 수 없다.
- 카멜 표기법(camel case / camel notation) - numberOfStudent / 파스칼 표기법(pascal case) - NumberOfStudent / 스네이크 표기법(snake case) - number_of_student
정수 자료형 Integar Data Type
- 자바에서는 제공하는 자료형은 기본 자료형과 참조 자료형(클래스형)이 있음. 기본 자료형에는 정수형(byte(1바이트), short(2바이트), int(4바이트), long(8바이트)), 문자형(char(2바이트)), 실수형(float(4바이트), double(8바이트)), 논리형(boolean(1바이트))이 있음.
- 프로그램이 실행되어 정수 값을 연산할 때 4바이트를 기본 단위로 사용하며, byte형과 short형은 컴퓨터가 연산을 편리하게 하려고 내부적으로 int형으로 변환함. 하지만 1바이트 단위로 데이터를 조작하는 경우도 있고, 다른 언어(C나 C++)와 호환이 가능하도록 short형을 사용하는 경우도 있음.
- long형은 자바에서 정수를 표현하는 가장 큰 단위의 자료형이지만, 자바는 모든 정수 값을 기본으로 int형으로 처리하므로 long형을 그냥 선언하면 오류가 난다. 따라서 숫자 뒤에 long형을 나타내는 식별자인 L이나 l을 붙여야 한다.
ex) long num = 12345678900; (X) / long num = 12345678900L;
ex) long num = 1000; // 이 경우 에러X. 1000은 int형의 범위 안에 있어서 long형으로 자동형 변환됨.
- 자바에는 정수를 사용할 때 양수, 음수를 모두 표현. 다른 언어의 unsigned형(양수만 표현)이 없음.
문자 자료형 Character Data Type
- 문자 세트 : 0과 1로만 표현하는 컴퓨터에서 어떤 문자를 컴퓨터 내부에서 특정 정수 값으로 정하자고 약속했고 이러한 코드 값을 모아둔 것.
- 인코딩(encoding) : 문자를 정해진 코드 값으로 변환하는 것. ex) 아스키 코드에 따라 A를 65로 표현함.
- 디코딩(decoding) : 코드 값을 다시 문자로 변환하는 것. 인코딩의 반대. ex) 65를 다시 A로 바꿈.
- 아스키 코드는 1바이트만 사용.(영문자는 대문자, 소문자, 특수 문자, 기호를 포함해도 1바이트로 표현할 수 있음.)
- 유니코드(unicode) : 각 언어의 표준 인코딩을 정의해놓은 것. 전 세계의 모든 문자를 처리할 수 있도록 만든 표준 문자 전산 처리 방식. 한글 등 다른 언어 문자는 복잡하고 다양하여 1바이트만으로 모든 문자를 표현하기 어려워서 2바이트 이상 사용. 유니코드의 1바이트는 아스키 코드 값과 호환, 그 밖의 문자는 2바이트나 그 이상의 조합으로 표현. (참고 : http://www.unicode.org )
- 자바는 유니코드에 기반하여 문자를 표현. 따라서 자바의 문자 자료형인 char형은 2바이트 사용.
- 문자를 변수에 대입하면 문자 그대로 저장되는 것이 아니라 그 문자에 해당하는 정수 값(아스키 코드 값)이 저장됨.
- 문자와 문자열은 전혀 다른 값을 가짐. 문자열 끝에는 항상 널 문자('\0)가 있음. 'A'는 정수 값 65로 정해져 있는 문자이지만 "A"는 "A\0"과 같이 쓰임.
- 유키코드 값을 직접 사용해서 문자를 나타낼 수도 있음.
- 한글 유니코드는 http://www.unicode.org/charts/PDF/UAC00.pdf 에서 확인 가능
public static void main(String[] args) {
System.out.println((int)'A'); // 아스키 코드값 65 출력
System.out.println((char)66); // 정수 값에 해당하는 문자 B 출력
char ch1 = 'C'; char ch2 = 67;
System.out.println(ch1); // C 출력
System.out.println(ch2); // 역시 C 출력
char ch1 = 'ㅂ';
System.out.println(ch1); // ㅂ 출력
System.out.println((int)ch1); // 12610 출력
char ch3 = '한';
char ch4 = '\uD55C';
System.out.println(ch3); // '한' 출력
System.out.println(ch4); // 유니코드 값으로 '한' 출력. 16진수로 나타냄.
// 16진수 숫자 하나가 4비트를 사용하므로 D55C에 4비트 4개, 즉 2바이트 사용.
// char ch5 = -66;
// 문자형 변수에 음수를 넣으면 오류가 발생함.
}
- 유니코드를 표현하는 인코딩 방법으로 UTF-8과 UTF-16이 있음.
- UTF-16 : 자바는 UTF-16 인코딩을 사용함. UTF-16은 모든 문자를 2바이트로 표현하는데 메모리 낭비가 있을 수 있음.(알파벳은 1바이트만 있어도 표현 가능)
- UTF-8 : 인터넷에서 많이 사용함. 각 문자마다 1바이트에서 4바이트까지 사용하여 문자를 나타냄. 비교적 메모리 낭비가 적고 전송 속도가 빠름.
* comment : 이전에도 문자 인코딩 방식에 대충 ANSI와 유니코드가 있다는 걸 알았고 UTF가 유니코드에 해당된다는 걸 알고 있었으며 문자 인코딩 방식을 잘못 건드리면 글자가 죄다 깨진다는 것 정도의 지식은 경험을 통해 인지하고 있었다. 하지만 책을 읽고 정리하면서 인코딩에 대해서 자세하게 이해하고 각각의 차이점을 명확하게 알게 되었다. ANSI코드는 아스키코드를 의미하며( 관련 포스팅 : https://hayden-archive.tistory.com/54 ), 유니코드도 사용하는 바이트에 따라서 UTF-16과 UTF-8로 나뉜다는 것을 알았다. 그래서 HTML 공부할 때 UTF-8이 나왔구나...
실수 자료형 Real Data Type
- 실수는 정수와 표현 방식이 다르며 지수와 가수를 구분해서 표현하는 부동 소수점 방식을 써서 실수를 나타낸다.
- float형은 총 4바이트=32비트(부호 1비트+지수부 8비트+가수부 23비트)를 사용하고, double형은 총 8바이트=64비트(부호 1비트+지수부 11비트+가수부 52비트)를 사용한다.
- 자바에서 실수는 double형을 기본으로 사용하므로 float형을 쓸 때는 숫자 뒤에 F나 f를 붙여줘야 한다.
ex) float fnum = 3.14F; 혹은 float fnum = 3.14f;
- 부동 소수점 방식은 더 넓은 범위의 실수 값을 표현할 수 있지만 약간의 오차가 발생할 수 있다.(∵ 지수로 표현되는 값이 0을 나타낼 수 없기 때문. ex) 2^1=2, 2^-1=1/2, 2^0=1)
논리 자료형 Logical Data Type
- boolean형 변수는 1바이트로 값을 저장하며 true(참), false(거짓) 두 가지 값만 가짐.
- 자료형을 쓰는 이유? 어떤 변수가 얼마만큼의 메모리를 사용하고 어떤 방식으로 그 값을 저장할지 자료형으로 선언해주기 위함.
- 지역 변수 자료 추론(local variable type inference) : 자바 10부터는 자료형을 쓰지 않고도 변수를 사용할 수 있음.
: var를 사용하여 변수를 선언하면 컴파일러가 알아서 int, double, String 같은 자료형으로 컴파일함.
: var를 사용할 때 유의할 점 2가지 ①한번 선언한 자료형 변수를 다른 자료형으로 사용할 수 없음. ②var로 자료형 없이 변수를 선언하는 방법은 지역변수만 가능함.
* comment : 현재 내가 쓰고 있는 버전은 자바 8이므로 지역 변수 자료 추론을 쓸 일이 없겠다. 지역변수만 가능하고 제약 사항이 있으므로 그냥 지금처럼 자료형과 함께 변수를 선언하는 것을 버릇으로 들이는 게 좋겠다. 자바 10부터 이런 기능이 생겼다는 걸 알고만 넘어가자.
상수와 리터럴
- 상수(constant) : 항상 변하지 않는 값. 상수는 final 예약어를 사용해서 선언한다. 상수 이름은 대문자를 주로 사용하며 여러 단어를 연결하는 경우에 _ 기호를 사용하면 보기 좋다. 한 번 선언한 상수는 변하지 않으므로 선언과 동시에 지정하는 것이 좋다.
public static void main(String[] args) {
final int MAX_NUM = 100;
// MAX NUM = 1000; // 상수는 초기화 불가능. 오류 뜸.
}
- 상수를 쓰면 편리한 이유? ex) 학생 수가 30명이었는데 35명으로 늘어난 경우 30을 직접 썼을 경우에는 일일이 찾아서 코드를 수정해야 하지만 상수를 쓴 경우에는 선언한 부분의 값만 바꿔주면 됨.
- 리터럴(literal) : 프로그램에서 사용하는 모든 숫자, 문자, 논리값(true, false)을 일컫는 말. 리터럴은 변수나 상수 값으로 대입할 수 있다. 리터럴은 프로그램이 시작할 때 시스템에 같이 로딩되어 특정 메모리 공간인 상수 풀(constant pool)에 놓인다.
즉, 숫자가 변수에 대입되는 과정(int num = 3;)은 일단 숫자 값(3)이 어딘가 메모리(상수 풀)에 쓰여져 있고, 이 값이 다시 변수 메모리(num)에 복사되는 것이다.
형 변환 Type Conversion / Type Casting
- 정수와 실수를 더할 때 그대로 연산을 수행할 수 없고 하나의 자료형으로 통일한 후 연산을 해야 한다.
- 형 변환의 종류 : ① 묵시적 형 변환(자동 형 변환) ② 명시적 형 변환(강제 형 변환)
- 형 변환의 기본 원칙 :
① 바이트 크기가 작은 자료형에서 큰 자료형으로 형 변환은 자동으로 이루어짐. ex) int형 -> long형
② 덜 정밀한 자료형에서 더 정밀한 자료형으로 형 변환은 자동으로 이루어짐. ex) long형 -> float형 // long형은 8바이트, float형은 4바이트지만, 실수가 정수보다 범위가 더 넓기 때문.
-> 반대 방향으로 갈 경우 강제로 변환해야 하고 자료 손실이 발생할 수 있음.
- 묵시적 형 변환
-명시적 형 변환
ex) int iNum = 10; byte bNum = (byte)iNum;
-> iNum이 10 일 때는 문제 안 되는데 1000일 때 byte형이 표현할 수 있는 범위(-128~127)를 넘어서고 자료의 손실이 생겨서 문제가 생김.
- 실수 자료형->정수 자료형일 때도 명시적 형 변환. 이 때 실수의 소수점 이하를 버리고 정수형이 됨.
- 실수형끼리 먼저 더하고 한꺼번에 정수형으로 바꾸는 것과 실수형을 먼저 정수형으로 바꾸고 더하는 것이 서로 연산 결과가 다를 수 있음.