본문 바로가기
Programming Language 이해하기/Java 이해하기

#2 스터디 할래 - 2주차

by simplify-len 2021. 11. 14.

목표

자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.

학습할 것

  • 프리미티브 타입 종류와 값의 범위 그리고 기본 값
  • 프리미티브 타입과 레퍼런스 타입
  • 리터럴
  • 변수 선언 및 초기화하는 방법
  • 변수의 스코프와 라이프타임
  • 타입 변환, 캐스팅 그리고 타입 프로모션
  • 1차 및 2차 배열 선언하기
  • 타입 추론, var

---

 

프리미티브 타입 종류와 값의 범위 그리고 기본 값

자바는 사용할 수는 자료형을 크게 2가지로 나눕니다.

1. Primitive Type

2. Referance Type

1. Primitive Type 은 쉽게 우리가 알고 있는 int, long, double, boolean, byte 등이 있습니다. 각각의 타입에 대한 범위는 어떻게 될까?

 아니 이 범위를 왜 알아야할까부터 고민해보자. 자바에는 int 의 범위를 넘어서게 되면 overflow 라는 것이 발생합니다.

예를 들어 int 의 경우에는 4byte 의 크기를 갖습니다. 1byte는 8bit 로 구성되어 있기 때문에 총 32개의 bit가 존재하게 됩니다.

32개의 비트 중 가장 앞에있는 비트는 부호를 표현하는 비트이기 때문에 총 2^31까지 숫자로 표현됩니다.

그러므로 int 라는 타입이 표현될 수 있는 수는 -2^31 ~ 2^31-1 까지입니다.

 2^31-1 이라는 숫자의 타입의 의미는 

| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1  ... 총 32개 를 의미합니다.

 

좋아요.

그럼 나머지 자료형에 대한 범위도 이제는 추측이 가능하겠죠?

boolean  - 1 byte 

byte        - 1 byte  

short      - 2 byte

int           - 4 byte

long        - 8 byte

float        - 4 byte

double    - 8 byte

char        - 2 byte(유니코드)

 

2. Reference type 이란 어떤것일까?

- 기본형 타입을 제외한 타입들이 모두 참조형 타입(Reference Type) 으로 빈 객체를 의미하는 Null 이 존재합니다.

값이 저장되어 있는 곳의 주소값 을 저장하는 공간으로 힙(Heap) 메모리에 저장됩니다.

레퍼런스 타입의 문제는 NullPointerException 에 대한 에러가 발생할 수 있는 가능성에 있습니다.

--

추가내용

자바 8 부터 unsigined 타입이 추가가 되었다.

사용 방법은 아래와 같다.

int i = Integer.parseUnsignedInt("220000000");
System.out.println(Integer.toUnsignedString(i));

그러나, 그냥 BigInt 를 사용하는게 좋을 것 같다.

리터럴

자바에는 리터럴이라는 것이 존재합니다. 가장 흔히 아는 것은  `String name = "Len"` 이렇게 new 키워드를 사용하지 않고 객체를 생성하는 방법을 의미할 때 리터럴이라고 합니다.

 

그 외에도 String 이 아니라, 정수나 실수에도 리터럴이 붙습니다.

예를 들어 이런거겠죠?

int a = 1;

long b = 1L;

boolean a = true;

 

이런식의 코드를 의미합니다.

단, 조건이 있다면, int a = null 이렇게 존재해서는 안됩니다.

 

그 외 _(underbar) 로 좀더 가시성있게 표현가능하다.

int a = 1_000_000_000;
System.out.println(a);

변수 선언 및 초기화하는 방법

변수를 선언하는 방법에 대해서는 간단하다. Java 의 경우

String value = "Foo";

타입을 지정하고 변수이름을 지정해서 변수를 선언합니다.

 

변수를 선언할 때 주의해야될 점으로는 변수이름의 규칙을 엄격히 지켜야한다는 점에 있습니다.

 

변수의 첫번째 글자는 문자이거나 '$', '_' 이어야하고 숫자로 시작할 수 없습니다.

또한 영어 대소문자가 구분되며, 첫문자는 영어 소문자로 시작해야하며, 다른 단어가 붙을 경우에는 첫 문자를 대문자로 합니다.

 

조금더 면밀히 살펴봐야할 부분으로는 초기화하는 방법에 대해서 조금 더 살펴볼 필요가 있습니다. 바로 선언하는 시점에서의 중요성을 이야기하고 싶은데요.

저도 처음 자바를 배울 때는 몰랐다가 실무를 하면서 점차 익혔던것 같아요.

 

일반적인 초기화 블록과, 정적 초기화 블록.

public class Main {
    
    int a = 10;

    { // 일반적인 초기화 블록
        System.out.println("initial block >>> 언제 실행될까요?");
        System.out.println(a);
    }

    static { // 정적 초기화 블록
        System.out.println("static block >> 언제 실행될까요?");

    }

    public static void main(String[] args) {
        Main main = new Main();
        int a = main.a;
        a = 50;
        System.out.println(a);
        System.out.println(">>>>>>> 언제 실행될까요?");
    }
}

위 코드의 순서는 어떻게 될까요?

static block >> 언제 실행될까요?
initial block >>> 언제 실행될까요?
10
50
>>>>>>> 언제 실행될까요?

이런식으로 동작합니다.

 

타입 추론, var

자바 버전 10부터는 type inference 기능이 되었습니다.

 

method 호출 및 선언과 variable 혹은 object 선언을 통해 실제 타입을 추론하는 형식을 말한다.

 

참고자료

https://www.baeldung.com/java-type-erasure

댓글