
컴퓨터에서 자료 표현하기
우리가 평소에 사용하는 것은 10진수입니다. 그러나 컴퓨터는 2진수를 사용합니다.
2진수
0과 1로만 데이터를 저장함
bit(1비트) : 컴퓨터가 표현하는 데이터의 최소 단위로 2진수 하나의 값을 저장할 수 있는 메모리의 크기
byte(바이트) : 1byte = 8bit
2진수, 8진수, 10진수, 16진수

비트로 나타낼 수 있는 수의 범위
- 한 개의 비트로 나타낼 수 있는 수 : 0. 1 (2개) - 0~(2^1-1)까지 표현 가능
- 두 개의 비트로 나타낼 수 있는 수 : 00, 01, 10, 11 (4개) - 0~(2^2-1)
- 세 개의 비트로 나타낼 수 있는 수 : 000, 001, 010, 011, 100, 101, 110, 111 (8개) - 0~(2^3-1)
직접 실습해보기
ackage ch04;
public class BinaryTest {
public static void main(String[] args) {
int num=10;
int bNum= 0B1010; //0B로 시작하는 숫자는 2진수다.
int oNum=012; //0으로 시작하는 숫자는 8진수다.
int xNum=0XA; //0X로 시작하는 숫자는 16진수다.
System.out.println(num);
System.out.println(bNum);
System.out.println(oNum);
System.out.println(xNum);
}
}
결과
10
10
10
10
2진수, 8진수, 16진수를 표현하기 위해 각각 0B, 0, 0X를 앞에 붙여줍니다.
위 수를 모두 System.out.println을 통해 출력하면 10진수로 나옵니다.
변수(Variavle)
프로그램에서는 게임의 레벨, 학생의 성적, 회원의 전화번호 등 항상 변하는 값을 나타낼 필요가 있습니다.
그 때 표현하려는 수에 맞는 데이터 타입( 자료형 ) 을 이용하여 변수를 선언합니다.
표현하려는 자료가 숫자, 문자, 문자열 등 다양할 수 있으므로 그에 맞는 자료형을 사용해야 합니다.
변수 선언은 자료형과 변수명으로 선언합니다. 선언과 동시에 초기화 할 수 있습니다.
int age;
age=10
int level=10000;
변수의 이름 규칙
패키지명은 소문자로 정한다는 규칙이 있습니다. 클래스명은 앞글자가 대문자여야 한다는 규칙이 있습니다.
변수도 역시 변수명 규칙이 존재합니다.
- 변수 이름은 영문자(대문자, 소문자)나 숫자를 사용할 수도 있고, 특수문자 중에는 $와 _만 사용 (ex. count100, _master)
- 변수 이름의 시작은 숫자로 할 수 없음 ( ex. 27days(X), 1abc(X))
- 자바에서 이미 사용하고 있는 예약어는 사용할 수 없음 (while, break 등)
- 변수 이름은 프로그램내에서 사용되는 것이므로 그 용도에 맞고 가독성이 좋게 만드는것이 중요 ex) int numberOfStudent;
변수와 메모리
변수를 선언하면 해당되는 자료형의 크기 만큼 메모리가 할당 됩니다.
변수는 할당된 메모리를 가리키는 이름입니다.
int level = 10;
-> 4byte 정수형 메모리가 level이라는 이름으로 할당됩니다. 그 안에 10이 저장되어 있습니다.
기본 자료형의 종류와 크기

메모리 사이즈는 정해져 있습니다. 바이트 수가 지정되어 있어야 램을 관리하기가 쉬워집니다.
원시 자료형은 다 stack에 저장됩니다.
참조 자료형은 다 heap에 저장됩니다.
스택과 힙은 같은 공간이며 스택은 위에서 부터 쌓이고 heap은 위에서 부터 쌓입니다.
경계선을 넘어가면 오버플로우가 발생합니다.
자료형 크기 비교
byte (1) < short (2) < int (4) < long (8) < float (4) < double (8) < String
정수 자료형
정수는 크게 4개의 자료형이 있습니다.
byte= 8비트지만 부호비트 한자리를 제외하고 -2^7 ~ 2^7-1 까지 표현할 수 있습니다. short, int, long도 마찬가지 입니다.

int num = 10;
10이 저장되어있는 공간이 4byte짜리인 것입니다.
byte와 short
- byte : 1바이트 단위의 자료형 동영상, 음악 파일, 실행 파일의 자료를 처리할 때 사용
- short: 2바이트 단위의 자료형 C/C++ 언어와 호환 시 사용
int
- 자바에서 사용하는 정수에 대한 기본 자료 형
- 4바이트 단위의 자료형
- 프로그램에서 사용하는 모든 숫자(리터럴)은 int 로 저장됨
- 32 비트를 초과하는 숫자는 long 자료형으로 처리
long
- 8바이트 자료형
- 숫자의 뒤에 알파벳 L 또는 l 을 써서 long 형임을 표시 함
- 예) int num = 12345678900; // 오류 - int로 담을 수 없는 큰 수를 선언했기 때문입니다.
long lnum = 12345678900; //오류
long lnumber = 12345678900L; // ok
숫자 자체가 항상 4byte로 잡힙니다. 그래서 long으로 선언했다고 하더라도 오류가 나는것입니다.
큰 숫자는 long형으로 잡으라고 L을 뒤에 붙여줘야 합니다.
실수 자료형
실수를 표현할때는 부동소수점 방식을 사용합니다.
부동소수점 방식이란?
- 실수는 정수 보다 정밀하기 때문에 정수와는 다른 방식으로 표현해야 함
- 부동 소수점 방식으로 실수 값 0.1 표현
- 지수부와 가수부로 표현 함
- 컴퓨터에서는 밑수를 2로 사용
- 정규화 : 가수가 밑수보다 작은 한 자리까지 가수로 표현 되는 것
- 컴퓨터에서는 밑수가 2 이므로 정규화를 하게 되면 가수부분의 첫 번째 자리 숫자는 항상 1임
예) 0.2 표현 0.4 X 2-1 정규화 하면 1.6 X 2-3

정규화를 통해 실수는 1.m x 2ⁿ로 표현됩니다.
float형과 double형

자바에서는 실수의 기본타입은 double을 사용합니다.
flost와 double 예제
package ch07;
public class DoubleTest {
public static void main(String[] args) {
double dnum=3.14;
float fnum=3.14f; //일반적으로 실수는 8바이트로 잡혀있음. float에 저장하고 싶을때 f를 붙여준다.
System.out.println(dnum);
System.out.println(fnum);
}
}
결과
3.14
3.14
실수의 기본 타입은 double로 실수는 8바이트로 잡힙니다. 그래서 4바이트인 float에 저장하고 싶을때는 f를 붙여줘야 합니다.
부동 소수점 방식의 오류
지수와 가수로 나타내는 부동 소수점 방식에서는 지수부가 0을 표현할 수 없기 때문에 약간의 오차가 발생할 수 있습니다
public class DoubleTest2 {
public static void main(String[] args) {
double dnum = 1;
for(int i = 0; i<10000; i++) {
dnum = dnum + 0.1;
}
System.out.println(dnum);
}
}
결과
1001.000000000159
문자 자료형
문자도 정수로 표현합니다.
- 어떤 문자를 컴퓨터 내부에서 표현하기 위해 특정 정수 값을 정의
- A 는 65
- 문자세트 : 각 문자를 얼마로 표현할 것인지 코드 값을 모아둔 것을 문자세트(charater set)라 함
(ex. ASKII, euc-kr, utf-8, utf-16)

인코딩은 문자가 숫자로 변환되는 것, 디코딩은 숫자에서 다시 문자로 변환 되는 것입니다.
A라는 문자를 컴퓨터에서는 특정한 숫자로 표현합니다.
그 숫자는 우리가 약속한 값입니다. 그 약속을 한 것들을 문자세트라고 합니다.
ASKII code는 알파벳과 숫자 특수 문자등을 1바이트에 표현하는데 사용하는 문자세트입니다.
모든 나라의 문자들을 하나의 코드로 표준화 한것이 유니코드입니다.
유니코드는 2byte로 표현합니다. 1byte는 아스키와 완벽하게 호환이 됩니다. 2byte를 쓸 때 다른 언어들과 호환해서 사용합니다.
utf-16은모든 문자를 2byte 표현합니다.
utf-8은 1byte ~ 4byte, 유동적으로 표현합니다. 좀 더 효율적으로 사용하는 것이 utf-8방식입니다.
'A', "A"는 같지 않다.
'A'은 2byte짜리 문자
"A"는 문자열 - 속을 들여다 보면 A10 (문자열을 나타내는 null캐릭터가 같이 있다.)
자바에서의 문자 표현
- 문자를 위한 데이터 타입 char ch = 'A';
- 내부적으로 숫자료 표현되므로 숫자를 넣어도 문자가 출력될 수 있음
- char ch2 = 66;
- char에는 양수만 쓸 수 있음
char 예제
package ch08;
public class CharacterTest {
public static void main(String[] args) {
char ch1 = 'A';
System.out.println(ch1);
System.out.println((int)ch1);
char ch2=66;
System.out.println(ch2); //char로 인식되서 출력된다.
System.out.println((char)ch2); //의미 없는 캐스팅
int ch3=67;
System.out.println(ch3);
System.out.println((char)ch3);
char han = '한';
char ch = '\uD55c'; //16진수로 표현되어있다. 16진수는 숫자 하나가 4비트로 표현된다. 숫자가 4개니까 2바이트다 .
System.out.println(han);
System.out.println(ch);
}
}
한글 유니코드 표를 보고 '한'에 해당되는 유니코드를 선언했습니다.
결과
A
65
B
B
67
C
한
한
정리하면 char라는 자료형은 자바에서 2바이트(유니코드)로 쓰고, 내부적으로 해당되는 코드 값에 대한 정수값을 가지고 있습니다.
논리형
- true(참), false(거짓) 두 가지만 나타냄
- 1바이트를 사용 함
- 값이 존재하는지, 배열이 비었는지, 결과가 참인지 거짓인지등을 표현
boolean isMarried = true;
System.out.println(isMarried);
자료형 없이 변수 사용 (지역변수)
- Local variable type inference
- 추론 가능한 변수에 대한 자료형을 선언하지 않음
- 한번 선언하여 추론 된 변수는 다른 타입의 값을 대입 할 수 없음
- 지역 변수만 사용 가능
package ch09;
public class LocalVariableInter {
public static void main(String[] args) {
var i = 10;
var j = 10.0;
var str = "test";
System.out.println(i);
System.out.println(j);
System.out.println(str);
var str2= str;
System.out.println(str2);
str="hello"; //가능
//str=3; 불가능
}
}
결과
10
10.0
test
test
str=3이 불가능 한 이유는 이미 string으로 형이 정해졌기 때문입니다.
변하지 않는 수
변하지 않는 수는 상수라고 합니다.
상수
- 상수는 변하지 않는 수
- 원주률 3.14, 1년 12개월 등
- final 예약어를 사용하여 선언
- 상수를 사용하면 변하지 않는 값을 반복하여 사용할 때 의미있는 문자로 인식하기 쉽고
혹, 변하더라도 선언한 부분만 변경하면 되므로 여러부분을 수정할 필요가 없음
package ch10;
public class ContantTest {
public static void main(String[] args) {
final int MAX_NUM=100;
final int MIN_NUM;
MIN_NUM=0; //사용하기 전에 반드시 값을 지정해야 한다.
System.out.println(MAX_NUM);
System.out.println(MIN_NUM);
}
}
리터럴
- 프로그램에서 사용하는 숫자, 문자, 논리값을 뜻함
- 리터럴은 상수 풀(constant pool)에 있음
- 정수 리터럴은 int 로 실수 리터럴은 double 로 저장됨
정수의 범위가 넘어가는 경우는 L,l을 float로 사용하려는 경우는 F,f 식별자를 써줘야 함
형 변환 (Type Conversion)
- 서로 다른 자료형 간에 연산등의 수행을 위해 하나의 자료형으로 통일하는 것
- 묵시적 형 변환(explicit type conversion, 자동 형 변환)과 명시적 형 변환(implicit type conversion, 강제 형 변환)이 있음
- 바이트 크기가 작은 자료형에서 큰 자료형으로 형 변환은 자동으로 이루어 짐
- 덜 정밀한 자료형(정수)에서 더 정밀한 자료형(실수)으로의 형 변환은 자동으로 이루어 짐
- 반대의 경우는 직접 타입 캐스팅을 해줘야 하고, 값 손실이 발생합니다.

타입 캐스팅은 큰 것을 작은 곳에 넣기 위한 것으로 그 대신 손실이 반드시 발생합니다.
앞에 캐스팅 하기 위한 자료형을 괄호호 붙여줍니다.
작은 것을 큰 곳에 넣을 때는 자동으로 들어갑니다. (promotion이라고 합니다.)
형 변환 예제
package ch10;
public class TypeConversion {
public static void main(String[] args) {
double dNum = 1.2;
float fNum = 0.9F;
int iNum1 = (int)dNum + (int)fNum;
int iNum2 = (int)(dNum + fNum);
System.out.println(iNum1);
System.out.println(iNum2);
}
}
결과
1
2
iNum1은 1+0 이기 때문에 1이 나오고, iNum2는 2.1을 int한 것이기 때문에 2입니다.
'Java' 카테고리의 다른 글
| [Java] 참조 자료형 변수 (0) | 2022.09.21 |
|---|---|
| [Java] 객체 구현 (0) | 2022.09.21 |
| [Java] 제어문 (0) | 2022.09.20 |
| [Java] 자바의 연산자들 (0) | 2022.09.19 |
| [Java] 자바프로그래밍이란 (0) | 2022.09.19 |