목표
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 것
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 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 선언을 통해 실제 타입을 추론하는 형식을 말한다.
참고자료
'Programming Language 이해하기 > Java 이해하기' 카테고리의 다른 글
Java 에서 패키지(Package) 라는 것을 왜 사용해야만 할까? (2) | 2024.10.03 |
---|---|
Java의 비동기(Async) 프로그래밍을 제공하는 JDK를 다시는 무시하지 말자! (1) | 2024.07.28 |
Java LocalDateTime.toString()은 JavaScript에서 어떻게 호환될까? (0) | 2021.11.02 |
#1 스터디 할래 - 1주차 (0) | 2021.10.30 |
객체지향의 재사용성과 다이나믹 디스패치, 더블 디스패치에 관한 이야기 (0) | 2021.03.06 |
댓글