Programming/JAVA

데이터 타입, 변수, 배열 그리고 타입추론

잇나우 2020. 12. 21. 23:31
반응형

데이터 타입

JAVA의 데이터 타입은 Primitve Type과 Reference Type으로 나뉜다.

  • 기본형 타입 (Primitive Type)

    • 미리 정의되어 제공되는 데이터 타입으로 원시 타입이라고도 함.

    • 기본값이 있기 때문에 Null을 허용하지 않는다. 기본형 타입에 Null을 넣고 싶다면 래퍼 클래스를 사용해야한다.

    • 스택(Stack) 메모리에 실제값을 저장한다.

    • 값을 저장할 수 있는 범위가 있어 크기를 벗어나면 컴파일 에러가 난다.

      타입 할당되는 메모리 크기 기본값 데이터 표현 범위
      논리형 boolean 1 byte false true, false
      정수형 byte 1 byte 0 -128 ~ 127
      short 2 byte 0 -32, 768 ~ 32,767
      int 4 byte 0 -2, 147, 483, 648 ~ 2, 147, 483, 647
      long 8 byte 0L -9, 223, 372, 036, 854, 775, 808 ~ 9, 223, 372, 036, 854, 775, 807
      실수형 float 4 byte 0.0F (3.4 * 10^-38) ~ (3.4 * 10^38)의 근사값
      double 8 byte 0.0 (1.7 * 10 ^ -308) ~ (1.7 * 10 ^ 308)의 근사값
      문자형 char 2 byte (유니코드) '\u0000' 0 ~ 65, 535

추가로 1 Byte = 8 bit 이며 하나의 메모리 주소가 가지는 데이터의 크기가 1byte(8bit)이고 1 bit는 2진수 한자리를 의미한다. 1 bit가 증가하면 표현할 수 있는 가짓수가 2배가 된다. (00, 01 -> 00, 01, 10, 11) 2배씩 커지기 떄문에 비트의 수와 표현 범위의 수는 2의 거듭제곱으로 나타낼 수 있다.
byte 자료형의 크기는 1 byte 이기때문에 즉 8 bit, 2의 8제곱 이다.
컴퓨터에서 음수를 표현 하기위해 MSB라는 것을 사용하는데, MSB란 Most Significant Bit의 줄임말로 최상위 비트를 뜻한다. 보통 가장 왼쪽에 위치한 비트를 의미한다. 부호 비트라고도 부른다.


MSB의 값이 0이면 양수 1이면 음수라고 판단한다.
즉 1 byte에 경우 -128 ~ 127까지의 표현범위를 가진다. unsigned 자료형을 사용한다면 양수의 자료형만 표현할 수 있는데 자바에서는 지원하지 않았지만 자바 8부터는 래퍼 클래스에 unsigned에 관련한 메소드가 추가되었다고 한다.

  • 참조형 타입 (Reference Type)
    • 기본형 타입을 제외한 모든 타입은 레퍼런스 타입이다.
    • Null값이 존재한다. 기본값 Null
    • 힙(Heap) 메모리에 주소값을 저장한다.
    • 런타임 에러가 발생한다. 예로 객체가 배열을 Null 값으로 받으면 NullPointerException이 발생한다.
    • 할당되는 메모리크기는 4 byte
    • 클래스 타입(class type), 인터페이스 타입(interface type), 배열 타입(array type), 열거 타입(enum type)

리터럴 (literal)

상수와 리터럴 둘다 변하지 않는 데이터를 의미한다. 코드상에서 상수는 변하지 않는 변수를 뜻한다. 리터럴이란 데이터 그 자체를 의미한다. 변수에 넣는 변하지 않는 데이터를 의미.

int a = 1;
int final a = 1;

a는 변수이고 int 앞에 final이 붙은 a는 상수이다. 여기서 리터럴은 1이다. 1과 같이 메모리에 저장되어 있는 변하지 않는 데이터 그 자체를 리터럴(literal) 이라고 부른다.

  • 정수 리러털
    일반적으로 사용하는 자료형. 모든 정수값은 정수 리터럴이다. 8진수, 10진수, 16진수를 사용해 표현할 수 도 있다.
    // 접두문자를 추가하여 n진수로 나타낼 수 있다.
    int int_1 = 0b10;       // ob -> 2진수
    int int_2 = 010;        // 0 -> 8진수
    int int_3 = 10;            // 없음 -> 10진수
    int int_4 = 0x10;        // 0x -> 16진수
    // 정수형 데이터의 기본값이 int형 이기 때문에 long 데이터 자료형에 정확한 long 리터럴을 지정하기 위해서는 숫자뒤에 l 또는 L을 추가해야한다.
    int long_1 = 10L;
  • 실수 리터럴
    부동 소수점 리터럴이라고도 한다. 소수점 이하를 가진 10진수의 값들을 의미한다. 부동 소수점의 기본형은 double 타입이다. (숫자뒤에 d나 D를 추가해도 되지만 안해도 상관없다.)
    float 타입에 경우 숫자뒤에 f 또는 F를 명시 해야한다.
    float number1 = 1.234F;
    float number2 = 1.234f;
    double number3 = 1.234;
    double number4 = 1.234d;
    double number5 = 1.234D;
  • 문자 리터럴
    자바의 모든 문자는 유니코드를 사용한다. 정수로 변환될 수 있으며, 연산도 가능하다. 단일 인용 부호''를 사용해 나타낸다
    char c1 = 'a';  
    char c2 = "가";
    char c3 = '\123'    // \XXX -> 8진 문자
    char c4 = '\u1234'  // \uXXXX -> 16진수 유니코드 문자
  • 논리 리터럴 (boolean)
    두 개의 논리값, 참(true)과 거짓(false)만 있다.
    boolean b1 = true;
    boolean b2 = 2 > 5;
  • 문자열 리터럴
    이중 인용 부호 ""를 사용한다.
    String str = "Hello, Java";

인스턴스(클래스 데이터)는 보통 동적으로 사용되기 때문에 리터럴이 될 수 없다. 하지만 데이터가 변하지 않도록 설계를 한 불변 클래스 (immutable class)의 경우 객체 리터럴, 혹은 리터럴이라고 부른다. 자바의 String 등 클래스가 해당되어 리터럴의 종류에 문자열이 포함된다.

변수 (Variable)

변수는 값(value)이 저장된 메모리공간에 붙여진 대표 이름

  • 변수 선언
    변수를 사용하기 전에 데이터 타입을 명시해 변수를 선언해주어야 한다. 그 뒤에 변수 이름을 작성한다.
    int number;     // 정수형 타입의 변수 number를 선언
    // 같은 데이터 타입이면 한번에 여러 변수를 선언할 수 있다.
    int number1, number2, number3;

변수를 초기화하는 방법은 =를 사용한다. 대입 연산자라고 부른다.

// number 변수의 선언과 초기화를 동시에
int number1 = 10;

// 변수 선언을 한 후 초기화
int number2;
number2 = 10;

변수의 스코프와 라이프타임

변수의 스코프는 그 변수에 접근할 수 있는 범위를 말한다. 자바에서는 블록 스코프{}를 사용한다.

public class Scope {
    int num1;                  // 인스턴스 변수, 필드, 전역 변수
    static int num2 = 1;    // 클래스 변수, 정적 변수

    public static void main(String[] args) {  // 매개 변수, 파라미터
        int num2 = 5;        // 지역변수, 로컬변수, 메소드 내에 선언된 변수
        System.out.println(number);    
    }
}

> 5

변수를 사용할 때, 먼저 자신과 가까운 블록에서 해당 변수를 찾고 없을 경우 상위 블록 스코프에서 해당 변수를 찾는다.

  • 라이프타임
    모든 변수는 life cycle을 가지게 된다.

    • 인스턴스 변수
      객체가 생성될 때 변수가 생성된다. 인스턴스 참조가 없을때 GC에서 객체를 지워버리게 된다. 그때 인스턴스 변수도 같이 지워진다.

    • 클래스 변수
      클래스 변수인 정적 변수는 클래스가 처음 호출될 때 생성되며, 프로그램이 종료되는 시점에 사라진다.

    • 매개 변수
      메소드가 호출될때 해당 매개변수가 생성되고 메소드가 종료될때 매개변수 또한 사라진다.

    • 지역 변수
      메소드 시작에 생성되며 메소드가 종료되면 같이 사라진다.

      타입 변환

    • 타입 캐스팅 (Type Casting)
      크기가 더 큰 자료형을 크기가 작은 자료형에 대입하는 것을 의미한다.

      int num = 10;
      byte by = (byte) a;
      // 데이터의 표현 범위를 벗어나는 값을 강제로 캐스팅하게 되면 데이터의 손실이나 변형이 생길 수 있다.
    • 타입 프로모션 (Type promotion)
      타입 캐스팅과는 반대의 개념. 더 작은 데이터타입을 큰 데이터타입에 대입하는 것을 의미한다.

      byte by = 10;
      int num = by;   // 캐스팅처럼 명시적으로 표시할 필요가 없다.
      // 데이터 손실이나 변형이 없다.

      레퍼런스 타입도 타입 변환이 가능하다. 상속관계인 부모 클래스로의 타입변환은 다형성에 의해 자동적으로 되지만 자식 클래스로의 타입변환은 타입 캐스팅이 필요하다.

배열

배열은 동일한 타입의 데이터를 연속된 공간에 정해진 수만큼 저장하는 자료구조이다.

  • 배열 선언
    배열을 선언하기 위해선 []를 사용해야한다.
    // 배열을 선언하는 방법은 두가지가 있다.
    int[] arr1;
    int arr2 [];
    

// 배열을 선언할때는 크기를 명시해주거나, 배열을 선언할 때 직접 값을 할당한다.
int[] arr1 = new int[3];
int[] arr2 = {1, 2, 3};
int[] arr3 = new int[3] {1, 2, 3};

선언한 배열 변수는 JVM의 Runtime Stack영역에 생성된다. 배열은 레퍼런스 타입이기 때문에 값은 GC의 Heap 영역에 객체가 생성된다. 이 Heap 영역의 주소값이 변수의 값으로 할당된다.
- 2차원 배열
2차원 배열부터는 다차원 배열에 속한다.
```java
// 1차원 배열과 선언하는게 크게 다르지 않다.
int[][] arr = new int[3][3];
arr[0][0] = 0;
arr[0][1] = 1; ...

int[][] arr = {{0, 1}, {2, 3}, {4, 5}};

타입추론과 var

타입추론이란 데이터 타입을 명시하지 않아도 컴파일 단계에서 컴파일러가 데이터 타입이 무엇인지 타입을 추론한다는 것을 의미한다.

  • 타입추론
    대표적으로 제네릭과 자바 8 람다에서 사용이 된다고 한다.
    // 제네릭 사용예
    HashMap<String, Integer> hashMap = new HashMap<>();
    // 데이터 타입이 HashMap<String, Integer> 인 것을 바탕으로 추론하여 new HashMap<>()에 따로 제네릭을 표시 하지 않아도 된다.
  • var
    자바 10부터 var 구문이 생겼다. var를 사용하기 전 몇가지 주의 사항이 있다.
    1. 로컬 변수일때만 선언이 가능하다.
    2. 선언과 동시에 값을 초기화 해야한다.

참고
https://blog.naver.com/hsm622/222144931396
https://gbsb.tistory.com/6
http://www.devkuma.com/books/pages/29
https://velog.io/@jaden_94/2%EC%A3%BC%EC%B0%A8-%ED%95%AD%ED%95%B4%EC%9D%BC%EC%A7%80

반응형

'Programming > JAVA' 카테고리의 다른 글

제어문이란?  (0) 2020.12.29
연산자란?  (0) 2020.12.22
JVM이란?  (0) 2020.12.21
[JAVA] Arrays.asList()  (0) 2020.09.17
[JAVA] 쓰레드 (Thread), Runnable 인터페이스  (0) 2020.03.15