0614. 데이터 타입과 변수, 배열

18436 단어 JAVA기초JAVA기초

데이터 저장

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 * 232^3

  • 가수부 = 소수점 오른쪽

    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에 요청

좋은 웹페이지 즐겨찾기