0614. 데이터 타입과 변수, 배열
데이터 저장
bit에 0 1 로만 저장 = 데이터타입 0, 1 → 2진수로만 바꾸면 다 저장할 수 있음
1. 정수 - 2의 보수→ 2진수 → 메모리
2. 문자 - Unicode 2byte(UTF-16) in JVM→ 2진수 → 메모리
3. 논리 - true=1, false=0→ 2진수 → 메모리
4. 부동소수점 - IEEE-754→ 2진수 → 메모리
부동소수점
부동소수점을 2진수로 변환 (IEEE-754 명세)
12.375 = 123.75 10^-1 = 1237.5 10^-2 = 12375 * 10^-3
ㄴ> 고정소수점
나머지는 부동소수점 (소수점이 고정되지않고 돌아다님)
보통 소수점이 있으면 부동소수점이라함
-
소수점 앞의 정수를 2진수로 변환 : 12 → 1100
-
소수점 뒤의 값을 2진수로 변환 : 0.375 → 0.011
소수점을 2로 곱해 나온 결과에서 정수부분만 차례로 표기, 소수부분이 0이거나 반복되면 중지
⇒ 1100.011 (2진수)
정규화 : 왼쪽에 1만 남도록 소수점 이동 → 1.100 011 *
-
가수부 = 소수점 오른쪽
100011
-
지수 = 2의 지수, 3 → excess K 이용해 2진수로 변환
3+127(K)= 130 = 10000010
4byte = 총 32bit. 맨 앞 부호 1bit + 지수 8bit + 가수부 23bit
부호비트 1bit → 1 음수 / 0 양수 ⇒ 0
지수 8bit → 지수 3을 excess K 방법따라 변환한 2진수 8비트 ⇒ 1000 0010
나머지 가수부는 sign magnitude 방식 그대로 저장. 모자란 비트는 전부 0으로 ⇒ 10001100000000000000000
→ 0100 0001 0100 0110 0000 0000 0000 0000 ⇒ 0x41460000
부동소수점 오차 발생
부동소수점을 2진수로 바꿀 때 가끔 오차 발생 (소수점이하가 딱 나눠떨어지지 않을때)
실무에선 보통 소수점 n째자리에서 반올림하는 등의 처리로 오차 없앰
메모리 크기에 따른 부동소수점 저장 범위
4byte 메모리 – 1 8 23 - 최대 유효자릿수 7자리까지 거의 정상적으로 저장 가능
8byte 메모리 – 1 11 52 - 최대 유효자릿수 15~16자리까지 가능
-
유효자릿수 : 소수점을 뺀 숫자의 수 ex. 12.375 → 12375 5자리
정수의 경우는 ‘-x ~ +y’ 이런 식의 범위가 명확
부동소수점은 IEEE-754 방식 따라 2진수로 바뀌기때문에 범위를 명확하게 정의XX
부동소수점과 유효자릿수
유효자릿수라도 정규화 저장할 때 완전히 2진수로 변환불가한 경우가 있음
- 소수점 이하의 수를 2진수로 바꿀 때 딱 떨어지지 않음
- 일부 부동소수점은 2진수로 완벽히 변환 불가 → 적절히 반올림해서 사용
System.out.println((1.123f + 1.004f) == 2.127f); //false
System.out.println((2.0f + 0.127f) == 2.127f); //true
→ 부동소수점의 연산은 정수의 연산처럼 완전하게 떨어지지 않음
프로그래밍 기본 문법
-
Data를 표현하는 방법 → 리터럴 literal
-
Data를 저장하는 방법 → 변수 선언 variables
-
Data를 연산하는 방법 → 연산자 operator
-
명령어 흐름을 제어하는 방법 → 조건문, 반복문
-
명령어를 기능단위로 묶는 방법 → 메서드 method
Data를 저장하는 방법
-
Data를 저장할 메모리를 준비시킨다 = 변수선언
-
준비한 메모리에 데이터를 넣는다
[ 메모리 종류 ][ 메모리 라벨 ] ;
데이터타입 변수
ex.int age; boolean working;
float height; char gender;
화질 화소 데이터 관계
-
Red pixel 1개 → 11111111 00000000 00000000 R G B → 24bit → 3byte
-
1024*768 사진 → 786,432개의 pixel → 786천 화소 → 2,359,296 byte=2.36MB
더 큰 화소에서 찍은 사진을 낮은 해상도의 디스플레이에서 보면 원래 화질에서 저하된 사진으로 보게됨
인터넷같은곳에 올릴때는 JPEG, GIF 등의 형식으로 압축해서 올림
-
jpeg – 손실압축. 색을 일부 손실시켜서 압축. 압축률 큼. 원본 복귀불가
확대시켜서 보면 사진이 얼룩덜룩하지만 작게보면 ㄱㅊ해서 제일 많이 쓰임.jpg
-
비트맵 bmp – 원본 그대로 파일
-
gif – 무손실압축. 압축률 작음. 색을 살리면서 압축해서 jpeg보다 크기 큼
-
-
1920*1080 동영상 → 1초에 24프레임
원본 용량 구하기 → HD : 19201080 = 약 2MB 24 = 48MB
48*60 → 1분에 2.8GB → 80분 영화일 때 224GB
너무 용량 크니까 압축 ⇒ MPEG → 4~8GB (손실압축)
동영상을 플레이하려면 압축을 풀면서 재생 → 압축한 방식으로 해제해야함
원본영상 224GB → 압축 → 압축파일 8GB → 해제 → 원본영상
압축방법 = 압축알고리즘 → encoding 어떤 형태의 data를 다른 형태로 바꾸는 것
파일 전체를 압축해제하면 용량 너무 커서 플레이되는 일부분만 압축해제
압축해제 = 압축방법따른 압축해제 알고리즘 ⇒ decoding 원래 형태로 복원하는 것
- 디코딩 알고리즘 = codec 코덱 (인코드 디코드의 합성어)
정수값을 저장할 메모리를 준비시키는 명령어
정수메모리 data type
byte 1byte → byte kor; -128 ~ +127
short 2byte → short ton; -32768 ~ +32767
int 4byte → int popul; 약 -21억 ~ 약 +21억
long 8byte → long balance; 약 -922경 ~ 약 +922경
부동소수점 data type
float 4byte → float height; 유효자릿수 7자리
⇒ 단정도 single precision
double 8byte → double money; 유효자릿수 15~16자리
⇒ float에 비해 2배 더 정밀한 값 저장 가능 → 배정도 double precision
논리값 data type
Boolean 4byte → Boolean working; //java에서 int type취급 → 4byte
true = 1, false = 0
배열일 경우 각 Boolean 변수는 1byte로 다뤄짐
문자 data type
char 2byte → char c; - unicode2 (utf-16) 0~65535
short 2byte → short s; - -32768 ~ +32767
Primitive Data Type
자바에서 기본으로 사용할 수 있는 데이터 타입
-
정수 – byte 1, short 2, int 4, long 8
-
부동소수점 – float 4, double 8
-
논리 – Boolean 4
-
문자 – char 2
변수(variable)
값을 저장하는 메모리
변수 선언
데이터를 저장할 메모리를 확보 = 변수 생성
값을 저장할 메모리의 종류와 크기를 결정하고 그 메모리에 이름을 부여
변수 선언 후 바로 그 이름을 사용하여 메모리에 접근하고 값 부여
보통 "변수를 생성한다" 라고 표현
문법
메모리종류 메모리이름; int a;
확보된 메모리에 값 저장
문법
변수명 = 변수 또는 리터럴; a = 20;
변수명 = 변수명; b = a;
변수타입 변수명 = 값; int a = 20;
용어
-
= : assignment operator. 할당연산자
-
l-value : = 왼쪽에 있는 변수. l-value 자리에 리터럴 불가능
-
r-value : = 오른쪽에 있는 변수나 리터럴
의미
= 오른쪽에 지정된 값을 왼쪽 변수가 가리키는 메모리에 저장
사용
변수 선언과 값 저장을 한 번에 하는 것을 '변수 초기화 문장'
변수 여러 개를 한번에 선언 가능 int a = 10, b = 20;
해당 메모리에 다른값 저장 가능
변수 선언 후에 사용해야함
같은 블록 내에서 중복선언 불가
l-value 와 r-value
l-value = r-value ;
l-value – only 변수
r-value – 리터럴, 변수,
200 = a; a = 200;
b = a;
!! a변수와 b변수가 같다는 것X
a변수에 현재 저장된 값을 b변수에 저장
변수에 문자 저장
char c;
c = '헐';
System.out.println(c);
// 프린트 결과는 문자 '헐'
// But 실제 변수 c에 저장된 데이터는 '헐'의 유니코드값인 0xd5d0임.
실제로 변수에 문자 자체가 저장되는 것은 아님
문자에 대한 UTF-16 BE = ucs2 값이 저장
⇒ char type의 메모리에 저장되는 것은 해당 문자의 유니코드값
char 변수와 int 변수
char c;
int i;
c = 65;
i = 65;
System.out.println(c); // A 출력
System.out.println(i); // 65 출력
입력값이 같아도 println() 명령어가 데이터타입을 파악해 그에 따른 결과 출력
배열
같은 종류의 메모리를 연속해서 여러 개 준비하는 방법
문법
메모리종류[] 메모리이름 = new 메모리종류[개수];
데이터타입[] 변수명 = new 데이터타입[개수];
ex) int[] arr1= newint[5];
C언어 스타일
데이터타입 변수명[] = new 데이터타입[개수];
ex) intarr[] = new int[5];
배열의 크기는 int 타입의 최대 값에서 2를 뺀 값이다.
배열의 최대값 = Integer.MAX_VALUE - 2
int[] arr = new int[Integer.MAX_VALUE -2];
변수 선언과 배열에 값 저장
변수명 [인덱스] = 값;
인덱스 : 0 ~ (개수-1)
□□□□□ – 0 1 2 3 4
배열 변수와 배열 메모리
int[] arr = new int[5];
- arr → 변수
arr에는 주소값이 들어감
ex. arr[100] – 배열 메모리의 시작 주소
일반 값이 아닌 주소를 저장하는 변수 = 레퍼런스 referance
자바에는 값을 저장하는 primitive data type변수와
주소를 저장하는 reference 변수가 있음
primitive data type과 reference
int a;
a = 100; // 정수값
int [] a = new int[5];
//a - 레퍼런스 변수 : 주소 저장
int[] a = new int[3];
a[0] = 100;
a[1] = 200;
a[2] = 300;
System.out.println(a[0]); //100
a = new int[5];
System.out.println(a[0]); //0
-
아래에서 배열 a가 새로운 배열 new int로 덮어씌워짐
⇒ 기존의 배열은 레퍼런스가 다 지워져서 사용할 수 없는 상태
-
기존의 배열은 Garbage 쓰레기가 됨
Garbage 와 garbage collecor
말 그대로 쓰레기값. 더이상 사용하지 않는 메모리값
JVM는 종료 시 사용한 모든 메모리 OS에 반납 → 이때 garbage가 메모리에서 삭제
JVM 실행 중에도 메모리 부족하면 garbage 찾아 제거해 메모리공간 확보
→ garvage를 찾아 제거하는 역할 = ‘가비지 수집기’ Garbage collector
garbage collector : 가비지를 제거해 사용할 메모리를 확보하는 일을 함
메모리 부족 시, cpu 한가할 때 작동
메모리가 부족하지 않으면 JVM 종료때까지 garbage collector 일 안함
배열 초기화
int arr1[] = new int[3];
arr1[0] = 100;
arr1[1] = 200;
arr1[2] = 300;
//일일히 값을 초기화 해주는 방법도 있지만
int[] arr2 = new int[]{100, 200, 300, 400};
int[] arr3 = {100, 200, 300, 400};
//이렇게 배열 선언과 초기화를 한번에 진행하는 방법도 있음
JVM이 사용하는 메모리
실행 → JVM(java.exe) → 사용할 메모리 요청 → Windows OS → 사용 메모리 확보 → 사용 허락
→→ H/W관리 → RAM 사용 → 메모리 부족 → garbage collector 실행 → 쓰지 못하는 메모리 삭제
→ 그래도 부족? → OS에 요청
Author And Source
이 문제에 관하여(0614. 데이터 타입과 변수, 배열), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hyunn12/0614-datatype-variable-array저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)