[day02] java-basic : 자바 데이터형

3 분 소요

메모리의 단위

  • bit : 0과 1로 이루어진 단위, 컴퓨터가 이해할 수 있는 단위
  • byte : 프로그램 및 개발자가 이해할 수 있는 단위, bit들의 집합, 8bit = 1byte

1byte의 단위가 중요한 이유

  • 0 ~ 255 범위의 수 총 256가지를 표현할 수 있다.
  • signed(양수만) / unsigned(음수+양수) 중에서 자바는 unsigned만 있다.
  • 계산한 결과는 RAM 이라는 메모리에 저장된다.
  • 데이터 타입의 원래 목적은 상수타입을 저장하기 위함이다.
  • 상수의 종류? : 정수형 상수, 실수형 상수, 문자형 상수, 문자열 상수, 논리값 상수
  • 실수, 정수는 무한대의 숫자를 유한한 형태로 낭비 없이 효율적으로 메모리를 관리하며 표현하기 위해 여러개의 데이터타입으로 나눠진다.

기본 자료형

  • 정수의 기준은 int(4byte)이다.
  • 실수의 기준은 double(8byte)이다. 더욱 정밀하게 표현해야 하기 때문이다.
  • float를 사용하면 컴퓨터는 double로 변환 후 다시 float으로 형변환하기 때문에 double을 사용하는 것보다 비효율적이다.
  • 실수는 정수부, 가수부, 지수부로 나눠서 계산해야 하기 때문에 정수계산보다 시간이 더 걸린다.
  • 그래서 의미없이 정수를 실수 데이터타입으로 저장하면 속도가 더욱 느려져서 좋지 않다.
  • 기본 자료형은 변수값으로 실제 값을 저장한다.
  • 따라서 기본 자료형은 변수와 값이 모두 stack메모리에 저장되어 있다.

참조 자료형

  • 자바에서는 기본 자료형 외에도 클래스 하나하나가 다 자료형이 될 수 있다.
  • 이를 참조 자료형(Reference Type) 이라고 한다.
  • 기본 자료형은 소문자로 시작하고, 참조 자료형은 클래스니까 대문자로 시작한다.

  • 문자열을 저장할 수 있는 자료형은 참조 자료형이다.
  • String이 바로 문자열을 저장할 수 있는 참조 자료형이다.
  • 참조 자료형은 변수가 실제 값을 저장하지 않고, 실제 값이 저장되어 있는 주소값을 저장한다.
  • 따라서 변수명은 stack메모리에, 실제 값은 heap메모리에 따로 따로 저장되는 것이다.
  • new 키워드를 통해 heap 영역에 새로운 공간을 만들어서 저장하라고 명령할 수 있다. (예 : String s = new String("hello");)
  • new의 갯수(heap메모리)와 참조변수(Stack메모리)의 갯수는 일치해야 한다.

  • 하나의 참조변수에 계속 new키워드를 통해 새로운 heap메모리 공간을 만들어주면 RAM 메모리에 사용되지 않는 공간이 생겨서 Memory Leak가 생긴다.
  • 자바에서는 이렇게 사용되지 않는 메모리를 JVM 자체의 Garbage Collector(GC)가 관리한다.
  • gc()라는 메소드가 있긴 하지만, 정확한 작동 시간을 설정하거나 예측할 수는 없다.

상수 변수 : final

  • 값을 하나로 고정시키고 싶을 때 final이라는 키워드를 사용하면 해당 변수는 설정한 단 하나의 값만을 가진다.
  • 상수형 변수는 명명규칙에 따라서 변수명을 다 대문자로 작성해야 한다.(예 : final boolean BOOL = true;)

문자형 상수

  • 자바에서는 한글이나 한자 한 글자도 문자에 포함이 된다.
  • 그래서 '가' 또한 한글자이기 때문에 char로 인식된다.
  • 컴퓨터는 0과 1만 인식할 뿐, a/B/% 와 같은 문자는 인식하지 못하기 때문에 문자를 바이트코드로 변환해 표현한 것이 아스키코드 이다.
  • 모든 한글은 아스키코드로 다 표현할 수 없기 때문에 2byte의 숫자체계로 표현하고 이를 유니코드 라고 한다.
  • 자바는 유니코드로 구성되어 있기 때문에 한글도 사용이 가능한 것이다.
  • 자바에서의 바이트타입은 C, C++ 과 소통하기 위해 사용되는 타입니다.
  • System.out.printf("%c%c\n", 'A', 'b');의 출력값은 Ab이지만 System.out.println('a' + 10 + 'B' + "A")의 출력값은 173A이다.

유니코드

  • 유니코드 65인 문자를 char 변수에 저장하려면 16진수 형태로 표현해야 한다.
  • 2진수의 3비트씩 묶고 8진수, 4비트로 묶으면 16진수로 표현할 수 있다.
  • ch = '\u0041'; // 유니코드 65인 문자를 ch에 저장 (16진수 형태로 표현)

  • 8진수와 16진수 중에서 개발자 입장에서는 속도를 빨리하기 위한 연산에서는 16진수를 사용한다.
  • 개발자입장에서 byte가 단위이기 때문에 1byte인 8bit를 4bit씩의 배수로 표현할 수 있는 16진수를 8진수보다 많이 사용하는 것이다.

  • char는 유니코드이니까 2byte이다. 2byte를 16진수로 표현하기 위해서는 4자리가 필요하다. (1byte는 16진수 2자리)
  • image

EUC-KR와 UTF-8차이

  • EUC-KR : 유니코트 기반이라 한글 하나를 2byte로 해석한다.
  • UTF-8 : 한글 하나를 3byte로 인식한다. (초, 중, 종성)

형변환

  • 형변환은 크기를 가지고 있는 대상만 가능하다.
  • 그래서 boolean형은 형변환이 불가하다.

  • 형변환이란 연산자를 기준으로 좌변과 우변안에 타입이 다른 경우 발생된다. (기본자료형의 형변환)
  • 컴퓨터는 연산자를 기준으로 왼쪽과 오른쪽의 자료형이 같아야 연산할 수 있기 때문이다.

  • 자바에서는 객체 형변환도 가능하다. (참조형 형변환)

  • char의 정수값을 알고싶다면? 정수형 int로 형변환을 하면 된다.
char ch = 'A';
System.out.println((int)ch);
  • 형변환의 종류에는 크게 (1) 묵시적 형변환, (2) 명시적 형변환 이 있다.

묵시적 형변환

  • 묵시적 형변환은 자료형을 명시해주지 않아도 큰 type의 자료형을 따라 자동으로 연산되는 것을 의미한다.
  • 묵시적 형변환에 따라서 'a' + 20의 연산에서 a가 int형으로 인식되어 결과가 97이 된다.
  • 기본적으로 컴퓨터는 연산 시에는 큰 수의 type을 따르기 때문이다.
  • 묵시적 형변환이 발생한다면 형변환 자료형을 명시해주지 않아도 된다.

명시적 형변환

  • 명시적 형변환은 큰 data type을 작은 data type으로 변환해주는 것이다.
  • 예시 :
System.out.println((int)12.3 + 45);
int num = (int)12.35;