[Java] 데이터 타입, 변수, 배열
Java Package
최근 백기선님의 자바 스터디를 알게되어서, 한번 자바에 대한 개념을 스터디를 통해서 잡고 가면 좋을 듯해서 글에 대해서 정리해보겠습니다. 아래는 2주차 내용입니다.
공부할 내용
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
프리미티브 타입 종류와 값의 범위 그리고 기본 값
프리미티브 타입은 기본 타입을 의미합니다.
자바의 기본 타입은 8종류입니다.
타입 종류 | 메모리 크기 | 값 범위 | 기본 값 |
---|---|---|---|
byte | 1byte | -128 ~ 127 | 0 |
short | 1byte | -32,768 ~ 32,767 | 0 |
int | 2byte | -2,147,483,648 ~ 2,147,483,647 | 0 |
long | 4byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0L |
float | 8byte | (3.4 X 10^-38) ~ (3.4 X 10^38) | 0.0F |
double | 4byte | (1.7 X 10^-308) ~ (1.7 X 10^308) | 0.0 |
char | 8byte | 0 ~ 65,535 | '\u0000' |
boolean | 2byte | true/false | false |
프리미티브 타입과 레퍼런스 타입
Primitive type
- 기본 타입
- byte, short, signed/unsigned int, signed/unsigned long, float, double, boolean, char
- not object
- 값을 저장합니다
Reference type
- 참조 타입
- class, interface, enum, array, String type
- 주소를 저장합니다.
리터럴
- 데이터를 의미합니다.
- 변수의 값이 변하지 않습니다.
다음과 같이 선언할 수 있습니다.
boolean result = true;
char alphabet = 'A';
byte b = 10;
short s = 100;
int i = 1000;
변수 선언 및 초기화하는 방법
일반적으로 초기화하는 방법으로 2가지 방법이 있습니다.
1. 변수 선언 후 이후에 초기화
int num;
System.out.println(num); // error
num = 1;
System.out.println(num); // output : 1
2. 변수 선언과 동시에 초기화
int num = 2;
System.out.println(num); // output : 2
변수의 스코프와 라이프타임
프로그램에서 사용되는 변수들은 사용 가능한 범위를 가집니다. 그 범위를 변수의 스코프라고 합니다. 변수가 선언된 블럭이 그 변수의 사용 범위입니다.
public class VarScopeExam {
int globalValue = 10;
public void localScope(int value){
int localValue = 20;
System.out.println(globalValue); // 전체 범위
System.out.println(localValue); // localScope 범위
System.out.println(value); // localScope 범위
}
}
타입 변환, 캐스팅 그리고 타입 프로모션
타입 변환은 하나의 타입을 다른 타입으로 바꾸는 것을 의미합니다.
Primitive type
-
Widening type cast : 더 넓은 타입으로 형을 변환합니다.
- ex. int to long, byte to short...
int value = 1;
long value2 = value;
-
Narrow type case : 더 좁은 타입으로의 형을 변환합니다.
- 값이 손실될 수 있습니다.
- ex. long to int, short to byte...
long value = 10;
int value2 = value;
Reference type
- Inheritance 관계에서만 가능
-
Upcast : subclass -> superclass
- 모든 subclass는 superclass의 컨텐츠를 가지고 있으므로, superclass 로의 casting이 가능합니다.
-
Downcase : superclass -> subclass
- 모든 superclass는 subclass의 컨텐츠를 가지고 있지 않을 수 도 있습니다. 그래서 오류가 발생할 수 있습니다.
1차 및 2차 배열 선언하기
배열 길이를 초과하게 되면, ArrayIndexOutOfBounds 예외가 발생합니다.
1차 배열
타입[] 배열이름 = new 타입[배열길이];
의 형태를 가지고 있습니다.
int[] number = new int[3];
number[0] = 1;
number[1] = 2;
number[2] = 3;
// number = { 1, 2, 3};
2차 배열
타입[][] 배열이름 = new 타입[열 길이][행 길이];
의 형태를 가지고 있습니다.- 2차원 배열은 배열 요소로 1차원 배열을 가지는 배열입니다.
int [][] arr = new int[2][3];
for(int i=0; i<2; i++){
for(int j=0; j<3; j++){
arr[i][j] = 10 * i + j;
}
}
// arr
// { 0, 1, 2 }
// { 10, 11, 12 }
타입 추론, var
타입 추론은 변수 타입을 명시하지 않고 컴파일러가 데이터 타입이 무엇인지 추론한다는 것을 의미합니다.
var
- 지역 변수에서만 사용 가능합니다.
- 선언과 동시에 반드시 초기화를 해야합니다.
- null 초기화하면 작동하지 않습니다.
- 람다 표현식에는 var을 사용할 수 없습니다.
- 타입이 없어서 배열에 초기값을 넘겨도 작동하지 않습니다.
예제코드는 다음과 같습니다.
var url = new URL("http://www.naver.com");
var list = new ArrayList<String>();
출처
- https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
- https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html
- https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html
- https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html
- https://docs.oracle.com/javase/tutorial/java/generics/methods.html
- https://www.baeldung.com/java-type-erasure
- https://www.baeldung.com/java-10-local-variable-type-inference