02-1 컴퓨터는 데이터를 어떻게 표현할까?
-1. 컴퓨터에서 수를 표현하는 방법
- 컴퓨터는 모든 데이터를 1과 0으로 표현한다.
(1) 비트(bit), 바이트(byte) : 비트는 0또는 1로 표현할 수 있는 최소단위, 8비트가 모여서 1바이트
(2) 10진수, 2진수 : 10진수는 우리가 실생활에 쓰는 숫자, 2진수는 0과 1 두개로만 표현되는 수
(3) ASCII : 영문자, 숫자, 특수문자를 8비트 값의 수로 미리 정의 해 둔 코드
(4) 2진수, 16진수, 8진수 : 2진수는 비트 값을 그대로 표현할 수 있지만 길이가 너무 길어 3비트의 8진수나 4비트의 16진수를 사용
- 프로그램에서 2진수 사용할 때는 숫자 앞에 0B, 8진수는 0, 16진수는 0X (ex. 10진수 10은 2진수로 0B1010, 8진수로 012, 16진수로 0XA)
-2. 부호 있는 수를 표현하는 방법
- 컴퓨터는 숫자를 0과 1로만 표현할 수 있기때문에, 부호를 나타내는 비트는 맨 앞에 붙이며, 부호비트가 0이면 양수, 1으면 음수다
(1) 8비트로 5를 나타내면 0000 0101 이다
(2) 음수는 1000 0101 일거 같지만 0000 0101과 1000 0101을 더하면 0000 0000이 나오지 않는다
(3) 따라서 음수는 양수와 더했을 때 0이 되는 값이여야한다. 프로그래밍에서는 이 값을 '2의 보수'라고 한다
(4-1) 1의 보수 구하기 : 어떤 수 A가 있을 때 이 수와 더해서 1이되는 수를 'A에 대한 1의 보수'라고함. 5의 1의 보수는 1111 1010로 즉, 2 진수에 대한 1의 보수는 0과 1의 값이 반전. ---> 더하면 1111 1111
(4-2) 제일 낮은 자리에 1더하기 : 0000 0000으로 만들기 위해 제일 낮은 자리에 1을 더하면 된다. 따라서 1의 보수를 구해서 더 한 후 그 값에 1을 더하면 된다. 따라서 +5의 2의 보수는 1111 1011(-5)다.
02-2 변수란 무엇일까?
-1. 변수 선언하고 값 대입하기
package chapter2;
public class Variable1 {
public static void main(String[] args){
int level;
level = 10;
System.out.println(level);
}
}
-2. 변수 초기화하기
package chapter2;
public class Variable2{
public staic void main(String[] args){
int level = 10;
System.out.println(level);
}
}
-3. 변수 이름 정하기
제약 사항 | 예시 |
변수 이름은 영문자, 숫자를 사용할 수 있고, 특수 문자는 $, _ 만 사용할 수 있다 | _master, won$, g_level |
변수 이름은 숫자로 시작할 수 없다 | 27days(X), 1abc(X) |
자바의 예약어는 사용할 수 없다 | while, int, break |
02-3 변수가 저장되는 공간의 특성, 자료형
-1. 변수와 메모리
변수는 컴퓨터 내부의 메모리 공간에 저장되고, 메모리는 프로그램이 실행되는 작업 공간이다.
-2. 기본 자료형의 종류
정수형 | 문자형 | 실수형 | 논리형 | |
1byte | byte | boolean | ||
2byte | short | char | ||
3byte | int | float | ||
4byte | long | double |
-3. 정수 자료형
자료형 | 바이트 크기 | 수의 범위 |
byte | 1 | -2^7 ~ 2^7-1 |
short | 2 | -2^15 ~ 2^15-1 |
int | 4 | -2^31 ~ 2^31-1 |
long | 8 | -2^63 ~ 2^63-1 |
(1) byte 형
(2) short 형
(3) int 형 : 정수 표현형으로 int를 가장 많이 쓰는 이유는 컴퓨터에서 정수로 연산을 할 때 4바이트 단위로 처리하는 것이 가장 효율적이기 때문
(4) long 형 : long형으로 처리하려면 할당문의 숫자끝에 L(l)을 작성해야한다.
<자료형이 다른 정수끼리 더하면 어떻게 될까?>
- 예를 들어 short, byte를 더하면 기본단위인 int형으로 변환된다.
-4. 문자 자료형
(1) 문자 인코딩 : 문자를 정해진 코드 값으로 변환하는 것 (ex. 아스키코드, 유니코드(전 세계의 모든 문자를 처리할 수 있도록 만든 표준 문자 전산 처리 방식))
(2) 문자 디코딩 : 코드 값을 다시 문자로 변환하는 것
package chapter2;
public class ChapterEx1{
public static void main(String[ ] args){
char ch1 = 'A';
System.out.println(ch1); //A
System.out.println((int)ch1); //65
char ch2 = 66;
System.out.println(ch2); //B
int ch3 = 67;
System.out.println(ch3); //67
System.out.println((char)ch3); //C
}
}
- 형변환을 통해 출력
package chapter2;
public class ChapterEx2{
public static void main(String[ ] args){
char ch1 = '한';
char ch2 = '\uD55C';
System.out.println(ch1); //한
System.out.println(ch2); //한
}
}
- 16진수 숫자 하나가 4비트를 사용하므로, '한'을 표현하는데 4비트 4개(16비트), 즉 2바이트를 사용
- char형은 음수 값을 표현할 수 없다
package chapter2;
public class ChapterEx3{
public static void main(String[ ] args){
int a = 65;
int b = -66;
char a2 = 65;
//char b2 = -66; 문자형 변수에 음수를 넣으면 오류 발생
System.out.println((char)a); //A
System.out.println((char)b); //? --> 알 수 없는 문자라는 의미
System.out.println(a2); //A
}
}
<자바는 UTF-16 인코딩을 사용한다.>
-5. 실수 자료형
(1) 부동 소수점 방식
실수값 0..1은 1.0X10^-1 로도 표현할 수 있다. 이처럼 가수부분(1.0)과 지수부분(-1)을 나누어서 실수를 나타내는 방법 (10은 밑수)
- 컴퓨터는 숫자를 표현할때 2의 n 승의 형태로 나타내기 때문에 밑수로 주로 2를 사용한다.
- 여기서 가수를 밑수보다 작은 한자리짜리 가수로 표현하는 것을 정규화라고 한다
- 0.2를 정규화하면 1.6 X 2 ^-3이다. 따라서 모든 실수는 밑수 2로 정규화를 할 때 1.m X 2^n과 같이 표현할 수 있다.
(2) float형과 double형
- float형은 부호 1비트, 지수부 8비트, 가수부 23비트로 총 32비트(4바이트) 사용
- double형은 부호 1비트, 지수부 11비트, 가수부 52비트로 촐 64비트(8바이트) 사용
package chapter2;
public class DoubleEx1{
public static void main(String[ ] args){
double dnum = 3.14;
float num = 3.14F; //F는 식별자로 f도 가능 (longdml L,l과 비슷)
System.out.println(dnum);
System.out.println(fnum);
}
}
<부동소수점 방식의 오류 : 약간의 오차가 존재한다 하지만 더 넓은 실수의 값을 표현하기 위해 부동 소수점 방식을 사용>
-6. 논리 자료형
논리 자료형은 어떤 변수의 참, 거짓의 값을 나타내는 데 사용한다. 종류는 boolean형 한가지 뿐이다.
- boolean형 변수는 true나 false만 대입할 수 있고, 그 결과 값도 true, false로 출력된다
package chapter2;
public class BooleanEx{
public static void main(String[ ] args){
boolean isMarried = true; //boolean 변수를 선언하고 초기화
System.out.println(isMarried);
}
}
-7. 자료형 없이 변수 선언하기
var 는 자료형을 쓰지 않고 변수를 사용할 수 있는 방법이다.
(1) 한번 선언한 자료형 변수를 다른 자료형으로 사용할 수 없다 ( str = "test"(o) --> str = 3; (x))
(2) var 자료형 없이 변수를 선언하는 방법은 '지역변수'만 가능하다
package chapter2;
public class TypeInference{
public static void main(String[ ] args){
var i = 10;
var j = 10.0;
var str = "hello";
System.out.println(i);
System.out.println(j);
System.out.println(str);
str = "test"; //다른 문자열은 대입 가능
//str = 3; //str변수는 String형으로 먼저 사용되었기 때문에 정수 할당 불가
}
}
02-4 상수와 리터럴
-1. 상수 선언하기
변하지 않는 값인 상수는 [final] 예약어를 사용해서 선언한다. 또한 상수는 변하지 않기 때문에 선언과 동시에 값을 지정하는 것이 좋다
package chapter2;
public class Constant{
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);
//MAX_NUM = 1000; //오류 발생, 상수는 값 변경 불가
}
}
-2. 상수를 사용하면 편리한 이유
프로그램 내부에서 반복적으로 사용하고, 변하지 않아야 하는 값을 상수로 선언하여 사용하면 좋다.
ex) 학급수가 30명인 코드를 작성하다가 35명으로 증가 했을 경우, 30으로 쓴 부분을 다 찾아서 고쳐야 하므로 매우 번거롭다
-3. 리터럴
- 리터럴이란 프로그램에서 사용하는 모든 숫자, 문자, 논리값을 일컫는 말.
- 리터럴은 프로그램이 시작할 때 시스템에 같이 로딩되어 특정 메모리 공간인 상수 풀에 놓인다.
ex) int num = 3; 문장에서 값 3이 메모리 공간 어딘가에 존재해야 num 변수에 그 값을 복사할 수 있다. 즉 숫자가 변수에 대입되는 과정은 일단 숫자 값이 어딘가 메모리에 쓰여 있고, 이 값이 다시 변수 메모리에 복사 되는 것이다.
<또잉.. 알긴 안다만... 뭔가 확 와닿게 이해가 가지 않군...!>
02-5 형 변환
-1. 형 변환이란?
각 변수의 자료형이 다를 때 자료형을 같에 바꾸는 것
int n = 10; //int형 변수 n에 정수 값 10을 대입
double dnum = n; //int형 변수 n의 값을 double형 변수 dnum에 대입
(1) 바이트 크기가 작은 자료형에서 큰 자료형으로 형 변환을 자동으로 이루어짐
(2) 덜 정밀한 자료형에서 더 정밀한 자료형으로 형변환은 자동으로 이루어짐
그 외의 경우에는 자동으로 형 변환을 해야한다
-2. 묵시적 형 변환
(1) 바이트 크기가 작은 자료형에서 큰 자료형으로 대입하는 경우
byte bNum = 10; //1바이트
int iNum = bNum; //byte형 변수 bNum 값을 int형 변수 iNum에 대입함, 남은 3바이트는 0으로 채워짐
(2) 덜 정밀한 자료형에서 더 정밀한 자료형으로 대입하는 경우
int iNum2 = 20;
float fNum = iNum2; //같은 4바이트더라도, fNum이 더 정밀하므로 float형으로 변환
(3) 연산 중에 자동 변환되는 경우
int iNum = 20;
float fNum = iNum;
double dNum;
dNum = fNum + iNum; //2번의 형변환 (1)우항에서 int형이 float형으로 (2)좌항에서 double형으로 변환
<묵시적 형변환>
package chapter2;
public class ImplicitConversion{
public static void main(String[] srgs){
byte bNum = 10;
int iNum = bNum;
System.out.println(bNum); //10
System.out.println(iNum); //10
int iNum2 = 20;
float fNum = inum2;
System.out.println(iNum); //10
System.out.println(fNum); //20.0
double dNum;
dNum = fNum + iNum;
System.out.println(dNum); //30.0
}
}
-3. 명시적 형 변환
(1) 바이트 크기가 큰 바료형에서 작은 자료형으로 대입하는 경우
int iNum = 10;
byte bNum = (byte)iNum; //강제로 형을 바꾸려면 바꿀 형을 괄호를 써서 명시해야함
int iNum = 1000;
byte bNum = (byte)iNum; //1000이 byte형 범위 (-128~127)를 넘기 때문에 -24출력됨
(2) 더 정밀한 자료형에서 덜 정밀한 자료형으로 대입하는 경우
double dNum = 3.14;
int iNum2 = (int)dNum; //실수 자료형 double을 정수 자료형 int로 형 변환, 소수점 이하 생략
(3) 연산 중 형 변환
package chapter2;
public class ExplicitConversion{
public static void main(String[] args){
double dNum1 = 1.2;
float fNum2 = 0.9F;
//명시적 형변환
int iNum3 = (int)dNum1 + (int)fNum2; // 두 실수가 각각 형 변환되어 더해짐
//float -> double로 묵시적 형변환 후 명시적 형변환
int iNum4 = (int)(dNum1 + fNum2); //두 실수의 합이 먼저 계산되고 형 변환됨
System.out.println(iNum3); //1
System.out.println(iNum4); //2
}
}
'Programming > JAVA' 카테고리의 다른 글
Ch4. 제어 흐름 이해하기 (0) | 2021.07.18 |
---|---|
Ch3. 자바의 여러 가지 연산자 (0) | 2021.07.17 |
Ch1. 자바 프로그래밍 시작하기 (0) | 2021.07.06 |
스레드와 멀티태스킹, 고급 스윙 컴포넌트 (0) | 2020.12.30 |
그래픽 (0) | 2020.12.30 |
댓글