자바 데이터 타입, 변수 그리고 배열
목표
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익히기.
목차
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
프리미티브 타입. 직역하면 기본형 타입이다.
기본값이 있기 때문에 Null 값이 존재하지 않고 각각 기본 값이 있다.
값의 범위와 기본 값은 아래와 같다.
(출처 : https://gbsb.tistory.com/6)
데이터 표현 범위는 할당되는 메모리 크기와 연관지어 생각할 수 있다.
우선 정수형일 경우,
1bit는 2진수 한 자리를 표현할 수 있는 크기이다.
1byte는 8bit이고 2진수 여덟 자리를 표현할 수 있다.
즉 2의 8제곱으로 계산하여 256가짓수를 표현할 수 있다.
8비트 중 맨 앞자리 비트는 0이면 양수, 1이면 음수로 나타내어 부호를 표현하고 나머지 7자리를 숫자로 표현한다.
즉 1바이트 기준일 때의 데이터 표현 범위는 '-128 ~ 127'이 되는 것이다.
실수형일 경우,
float타입(4byte)과 double타입(8byte)을 부동소수점 방식으로 표현하고 있다.
부동소수점이란 지수를 10의 제곱으로 하여 소수점을 표현하는 방식이다.
float타입은 맨 앞자리 비트는 정수형과 마찬가지로 양수, 음수를 나타내는 부호(1비트)를 표현하고
지수(10의 제곱수) 8비트, 가수(숫자) 23비트로 표현한다.
double타입은 부호는 마찬가지로 당연히 1비트.
지수 11비트, 가수 52비트로 표현한다.
(1) Primitive Type
(2) Reference Type
long count = 10000L;
float f1 = 2.3F;
double d1 = 5.6D;
char c1 = 'A'
literal은 위의 10000L, 2.3F, 5.6D, 'A' 와 같이 변수에 할당시키는 data를 리터럴이라고 표현한다.
이 리터럴을 최소한으로 사용하기 위해 상수로 선언하고 상수 변수를 사용해서 프로그램을 작성한다면 코드를 고치는데 비용을 최소화 할 수 있고 코드가 깔끔해진다.
리터럴의 타입은 값 뒤에 l, f, d를 붙임으로 정의할 수 있다.
long age = 50L 이런식으로 50을 long 타입 리터널로 나타낼 수 있다. float는 f double은 d를 리터럴 뒤에 붙일 수 있다.
리터럴 뒤에 아무런 접미사가 붙지 않을 경우 정수형은 int 타입, 실수형은 double 타입이다.
그래서 float 타입의 변수에 기본 리터럴 3.14를 넣게 된다면 더 큰 정밀도를 가진 리터럴이 낮은 타입에 들어가게 되어 에러가 난다. 그러므로 float 타입에 실수 리터럴을 넣을 땐 f접미사를 붙여야 한다.
int num;
char c;
float f1 = 3.14f;
double f2 = 3.14;
String str = "hi"
5개의 변수를 선언한 것이다.
[자료형 변수이름;] 으로 선언할 수 있고
[자료형 변수이름 = 변수값;] 으로 선언과 동시에 초기화를 할 수 있다.
변수를 어느 위치에서 명시하여 사용할 수 있고 어느 위치까지 변수가 메모리에 남아있는 지가 중요하다. 이것을 변수의 스코프와 라이프타임으로 알 수 있다.
클래스의 안에 선언 되었는지, static 키워드가 포함되었는지, block의 내부에 있는지 여부에 따라
크게 세가지로 나눌 수 있다.
타입 변환
데이터가 서로 다른 타입으로 사용되었을때 그 데이터의 표현 방식을 다른 타입으로 변환하는 것
타입 프로모션(자동 형 변환)과 캐스팅(명시적 형 변환)으로 나뉜다.
타입 프로모션
ex)
int i = 'A';
double d = 10;
char c = 1.23;
int ii = -1.23;
대입연산자(=) 기준으로 좌항과 우항의 자료형이 일치하지 않을 때, 컴파일러에 의해 자동으로 형변환이 발생한다.
기존의 자료형 보다 범위가 큰 자료형으로 자동 변환되며 자료형의 우선순위는 다음과 같다.
byte -> short,char -> int -> long -> float -> double
우선순위를 거스르게 되면 데이터 손실이 되어 컴파일 오류가 발생한다.
캐스팅
형 변환 연산자를 사용해 의도적으로 명시하며 타입을 변환하는 방법. 강제 타입 변환이라고도 한다.
위의 타입 프로모션과 다른 점은 코드에 타입 변환에 대한 가시성이 있다.
캐스팅 방식으로 변환시키려 한다면 변환시키고자 하는 데이터 앞에 괄호( )를 입력 후 이 괄호 안에 변환하고자 하는 타입을 지정해준다.
ex)
int i = (int)12.345;
float f = (float)12;
int[] arr; int arr[];
int[] arr = new int[5]; String[] arr = new String[5];
int[] arr; arr = new int[5]; // 5의 크기, 초기값은 0으로 채워진 배열이다. int[] arr = {1,2,3,4,5}; // 마찬가지로 자동으로 5의 크기를 가짐
int[] arr = new int[]{1,2,3,4,5}; int[] arr2 = {1,2,3,4,5}; String[] fireWeekend = {"금","토","일"};
int[][] arr = new int[4][3]; //3의 크기를 4개 가지는 2차원 배열 int[][] arr = { {1,2,3}, {2,3,4}, {3,4,5,}, {4,5,6} }; // arr[0] >> {1,2,3} // arr[1] >> {2,3,4} // arr[2] >> {3,4,5} // arr[3] >> {4,5,6}
이것은 위의 목차 2. 의 내용 중
primitive type의 변수는 기본 값이 있고, Reference type의 변수는 기본 값이 없기 때문에 null값이 있다고 언급한 부분과 일맥상통하다.
// 객체(Class) 배열 선언 Student[] StudentArr = new Student[5]; //Student Class의 인스턴스 최대 5개 할당할 수 있는 배열 //StudentArr[0] >> null //StudentArr[1] >> null //StudentArr[2] >> null
자바스크립트에서 타입스크립트로 넘어가는 시점에서 왜 var 키워드를 자바에서 추가했는지 자료조사를 해보니...
첫 번째로는 자바 개발진이 하위 호환성의 목적으로 추가한 것이라고 한다.
그리고 자바와 비슷한 C#의 경우 var 키워드가 유용하게 쓰이는 경우가 있는데
anonymous class와 linq라고 한다.
자바에 적용하려면 뒤에 스터디가 예정되어 있는 제네릭과 인터페이스의 개념이 필요한 것 같다.