Chap 02. Java 변수와 자료형 [Do it! 자바 프로그래밍 입문]

doriskim·2022년 11월 11일
0

*본 내용은 [Do it! 자바 프로그래밍 입문] 책과 강의를 보고 공부하면서 요점 정리한 내용입니다.

◼ 2진수, 8진수, 16진수

✔ 16진수의 장점

2진수 4자리가 16진수 1자리로 표현될 수 있다.
예시) 2진수 0000 1010 → 16진수 0 A
주소 값을 사용할 때 자주 사용한다.


✔ Java에서 2진수, 8진수, 16진수 표현법

2진수는 숫자 앞에 0B를, 8진수는 숫자 앞에 0을, 16진수는 숫자 앞에 0X를 붙여 표현한다.

int num = 10; //10진수
int bNum = 0B1010; //2진수
int oNum = 012; //8진수
int hNum = 0XA; //16진수

위 num, bNum, oNum, hNum을 출력하면 모두 10이 나온다.
(10진수로 출력 됨.)


✔ 컴퓨터가 부호 있는 수를 표현하는 방법

컴퓨터는 모든 데이터를 0과 1로 표현한다.(2진수)
부호 또한 0과 1로 표현하는데 0은 양수, 1은 음수를 나타낸다.
정수의 가장 왼쪽에서 부호를 표현하는데 이때 이 비트를 부호비트(MSB)라고 한다.

예시)
0000 0101 이때 맨 앞의 0이 MSB, 양수 표현
1000 0011 이때 맨 앞의 1이 MSB, 음수 표현


✔ 음수 만들기(2의 보수 만들기)
1. 1의 보수를 구한다. (0과 1을 바꾼다.)
2. 제일 낮은 자리에 1을 더한다.
3. 이때 나온 결과가 음수(2의 보수)이다.

예시) 0000 0101의 2의 보수를 구해보자
1. 1111 1010
2. 1111 1011
3. 1111 1011이 0000 0101의 2의 보수이다. 0000 0101은 10진수로 5이고 1111 1011은 10진수로 -5이다.


◼ 변수

✔변수 선언시 유의점
1. 변수의 이름은 알파벳, 숫자, _, $로 구성된다.
2. 대소문자를 구분한다.
3. 숫자로 시작할 수 없고, 키워드(while, break 등)를 변수의 이름으로 사용할 수 없다.
4. 이름 사이에 공백이 있을 수 없다.
5. 이름을 정할 때 가독성을 위해 의미 있는 이름으로 지어야 한다.
6. 자바는 카멜표기법을 이용한다. (시작은 소문자로, 단어가 바뀌면 대문자로)

예시)

int ns; 				//(X)
int numberOfStudents; 	//(O) 가독성 있는 이름으로, 카멜표기법 이용

◼ 자료형

정수형문자형실수형논리형
1바이트byte--boolean
2바이트shortchar--
4바이트int-float-
8바이트long-double-

▪ 정수 자료형

자료형바이트 크기수의 범위
byte127-2^7 ~ 2712^7-1
short2215-2^{15} ~ 21512^{15}-1
int4231-2^{31} ~ 23112^{31}-1
long8263-2^{63} ~ 26312^{63}-1

1byte는 8bit이다.
맨 앞 자리는 부호비트이므로 한 가지 경우의 수를 뺀다.
또 0의 경우를 빼야하므로 -1을 해준다.

✔ byte와 short

  • byte
    ∙ 1바이트 단위의 자료형
    ∙ 동영상, 음악 파일 등 실행 파일의 자료를 처리할 때 사용하기 좋은 자료형

  • short
    ∙ 2바이트 단위의 자료형
    ∙ 주로 C/C++ 언어와의 호환시 사용

✔ int
∙ 자바에서 사용하는 정수에 대한 기본 자료형
∙ 4바이트 단위의 자료형
∙ 프로그램에서 사용하는 모든 숫자(리터럴)은 기본적으로 int(4바이트)로 저장됨
∙ 32비트를 초과하는 숫자는 long형으로 처리해야 함

✔ long
∙ 8바이트 자료형
∙ 가장 큰 정수 자료형
∙ 숫자 뒤에 L 또는 l을 써서 long형임을 표시해야 함

∙ 예)

int num = 12345678900; // 오류남. int의 범위 넘은 값 대입
long num = 12345678900; // 오류남.

//숫자(리터럴) 123456900 은 기본형이 int인데 int의 범위가 넘는 수
//--> 숫자(리터럴) 12345678900을 long으로 처리하도록 명시

long num = 12345678900L; // 정상작동. 소문자 l을 써도되지만 1과 구분하기 위해 대문자로 씀

※부가설명
int num = 10;
위 코드는 어딘가 저장되어 있는 10을 num에 복사,대입 하는 과정이다.
이때 어딘가 저장된 10은 몇 byte로 저장되어 있을까? 모든 숫자 중 정수는 4byte(int형)로 저장시킨다. 이 10을 '리터럴'이라고 한다.

long num = 1234567890;
만약 위처럼 4byte가 저장할 수 있는 범위를 넘은 큰 수를 저장하고자 하면 error가 난다. 어딘가 저장되어 있는 1234567890이 4byte이기 때문이다. 따라서 뒤에 L을 붙여 8byte로 저장시킨다.(소문자 l도 가능하지만 1과 착각될 수 있기에 L 사용 추천)

long num = 1234567890L;
어딘가 8byte로 저장된 1234567980이 num에 long 자료형으로 대입된다.

float도 같은 이유로 뒤에 f, F를 넣는다.


▪ 문자 자료형

✔ char
컴퓨터에서는 문자도 내부적으로는 비트의 조합(정수)로 표현됨
자바에서는 문자를 2바이트로 처리

∙ 인코딩 - 각 문자에 따른 특정한 숫자 값(코드 값)을 부여 (예. 'A' → 65)
∙ 디코딩 - 숫자 값을 원래의 문자로 변환 (예. 65 → 'A')

✔ 문자세트
∙ 문자세트: 문자를 위한 코드 값(숫자 값)들을 정해 놓은 세트
∙ 아스키(ASCII): 1바이트로 영문자, 숫자, 특수문자 등을 표현 함
∙ 유니코드(Unicode): 한글과 같은 복잡한 언어를 표현하기 위한 표준 인코딩 UTF-8, UTF-16이 대표적
(https://www.unicode.org/charts/PDF/UAC00.pdf 참고)

∙ 문자를 변수에 저장하면? 문자에 해당하는 코드 값이 저장됨
∙ 자바는 유니코드 UTF-16 인코딩 사용함


▪ 실수 자료형

✔ float와 double
∙ 실수는 기본적으로 double로 처리함
∙ 부동 소수점 방식: 실수를 지수부와 가수부로 표현함. 무한의 실수를 표현하기 위한 방식.

∙ 실수 자료형: float(4바이트) double(8바이트)

∙ float형으로 사용하는 경우 숫자에 f, F를 명시함

double dnum = 3.14;
float fnum = 3.14F;

System.out.println(dnum); // 3.14 출력됨
System.out.println(fnum); // 3.14 출력됨

▪ 논리형 자료형

✔ boolean
∙ 논리값 true(참), false(거짓)을 표현하는 자료형 boolean으로 선언

boolean isMarried = true;

◼ 자료형 없이 변수 사용하기 (자바10)

∙ 자바10부터 가능
∙ 자료형이 필요한 이유: 변수를 선언할 때는 변수가 사용할 메모리 크기와 타입을 구분하기위해 자료형을 사용
∙ 지역 변수 자료형 추론(local variable type inference): 변수에 대입되는 값을 보고 컴파일러가 추론

∙ 지역 변수에서만 가능
∙ 나중에 자료형 바꿀 순 없음

var num = 10;
var dNum = 10.0;
var str = "hello";

↓

int num = 10;
double dNum = 10.0;
String str = "hello";

◼ 상수와 리터럴

✔ 상수
∙ 상수: 변하지 않는 값 (cf. 변수: 변하는 값)
∙ 상수 이름은 주로 대문자로 짓는다.

final double PI = 3.14;
fianl int MAX_NUM = 100;

∙ final로 선언된 상수는 다른 값을 대입할 수 없음

PI = 3.15; //에러 발생

∙ 프로그램내에서 변경되지 말아야하는 값을 상수로 선언해두고 혹시 변경되는 경우 선언된 값만 수정


✔ 리터럴
∙ 다음 코드에서 우측 값에 해당하는 10을 리터럴이라고 한다.

int num = 10;

∙ 리터럴: 프로그램에서 사용하는 모든 숫자, 값, 논리 값
∙ 예) 10, 3.14, 'A', true
∙ 리터럴에 해당되는 값은 특정 메모리 공간인 상수 풀(constant pool)에 있음
∙ 필요한 경우 상수 풀에서 가져와서 사용
∙ 상수 풀에 저장할 때 정수는 int로 실수는 double로 저장
∙ 따라서 long이나 float값으로 저장해야하는 경우 식별자(L, l, F, f)를 명시해야 함


◼ 형 변환 (type conversion)

∙ 자료형은 각각 사용하는 메모리 크기와 방식이 다름
∙ 서로 다른 자료형의 값이 대입되는 경우 형변환이 일어남

묵시적 형 변환: 작은 수에서 큰 수로, 덜 정밀한 수에서 더 정밀한 수로 대입되는 경우

long num = 3; // int값에서 long으로 자동으로 형 변환. L,l을 명시하지 않아도 됨

명시적 형 변환: 묵시적 형 변환의 반대의 경우. 반환되는 자료형을 명시해야 함. 자료의 손실이 발생할 수 있음.

double dNum = 3.14;
int num = (int)dNum; // 자료형 명시

0개의 댓글