자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 내용은 다음과 같습니다.
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
Reference: Java in a Nutshell
Java는 8가지의 primitive type이 있습니다.
Type | Contains | Default | Size | Range |
---|---|---|---|---|
boolean | true or false | false | 1 bit | NA |
char | Unicode character | \u0000 | 16 bits | \u0000 to \uFFFF |
byte | Signed integer | 0 | 8 bits | –128 to 127 |
short | Signed integer | 0 | 16 bits | –32768 to 32767 |
int | Signed integer | 0 | 32 bits | –2147483648 to 2147483647 |
long | Signed integer | 0 | 64 bits | –9223372036854775808 to 9223372036854775807 |
float | IEEE 754 floating point | 0.0 | 32 bits | 1.4E–45 to 3.4028235E+38 |
double | IEEE 754 floating point | 0.0 | 64 bits | 4.9E–324 to 1.7976931348623157E+308 |
true와 false 값을 나타내는 타입입니다.
Java에서 boolean은 javascript와는 다르게 integer 타입이나 object 타입으로 호환되지 않습니다.
// Wrong Case
public class JavaTest {
public static void main(String[] args) {
Object o = new Object();
int i = 01;
if(o){
System.out.println("test");
while(i) {
System.out.println("test2");
}
}
}
}
// Correct Case
public class JavaTest {
public static void main(String[] args) {
Object o = new Object();
int i = 1;
if(o != null){
System.out.println("test");
while (i != 0){
System.out.println("test2");
}
}
}
}
Char 값은 Integer 값으로 바뀔 수 있습니다. 16 bit의 Integer Type 값이라고 생각하시면 됩니다. 차이는 Unsigned Type이라는 점입니다.
Character Class는 다양한 Static methods가 있습니다.
Char type의 변수는 유니코드를 염두에 두고 설계 되었지만 유니코드가 계속 발전함에 따라 16bit로는 부족한 문자가 등장하면서 표현할 수 없는 경우가 있습니다. 이런 경우에는 int값을 코드 포인트로 잡고 인코딩해야합니다,
Java의 Integer Type은 byte, short, int, 그리고 long이 있습니다. 이 네가지 타입은 비트 수만 다릅니다.
숫자가 L로 끝난다면 long type을 말합니다 (64-bit Values)
Integer 값은 Binary, Hexadecimal, octal로 다양하게 표현 될 수 있습니다.
Java에서 Integer 연산은 Type의 range를 벗어나도 overflow나 underflow가 발생하지 않습니다 대신 구체적으로 타입을 감싼다면 overflow나 underflow가 발생할 수 있습니다.
public class JavaTest {
public static void main(String[] args) {
byte b1 = 127;
byte b2 = 2;
// Expected Output 129
System.out.println(b1 + b2);
// Expected Output 127
System.out.println((byte)(b1 + b2));
}
}
Integer의 경우에도 string을 integer로 변환하는 유용한 static methods가 있습니다.
Byte.parseByte()
Integer.parseInt()
Java에서 Real numbers를 표현하는 타입은 float과 double type입니다.
float은 32bit고 double은 64bit입니다. 두 가지의 타입은 모두 IEEE 754-1985 표준을 따릅니다.
Floating point는 exponential과 scientific으로 표현할 수 있습니다. (e와 E)
Floating Type은 infinity와 NaN(Not a Number)이라는 특별한 값이 있습니다.
Reference Types은 무엇인가?
대표적인 References Types은 Classes와 array를 말합니다.
object는 reference type의 instance 입니다.
Primitive Types과 Reference Types은 많이 다릅니다.
8가지의 Primitive Types은 Java Language에 의해 정의됩니다. 프로그래머에 의해 새롭게 정의될 수 없습니다. 하지만 Reference Types은 사용자가 정의할 수 있습니다.
Primitive Types은 single vlaues만 가질 수 있는 반면 Reference Types은 더 많은 primitve type이나 objects들의 타입을 가질 수 있습니다.
Primitive Types은 1byte 부터 8byte의 메모리를 갖습니다 이러한 Primitive Value는 변수나 메소드에 전달될 때 이 값을 가진 Bytes들을 복사합니다. 하지만 Object의 경우엔 훨씬 더 많은 메모리를 필요로 합니다. Object에 저장된 메모리는 힙에 dynamically하게 할당 될 수 있고 사용되지 않을 때 자동적으로 Garbage Collector에게 회수됩니다.
C와는 다르게 Java에는 Pointer가 없어서 referecne를 직접적으로 조작하는건 불가능합니다.
자바의 리터럴은 Java Source 코드에서 상수형태로 표현되며 Integer, floating-point numbers, single characters, string, true, false, null을 포함하는 모든 값을 말합니다.
리터럴을 표현하는 syntax로는 numeric, character and string으로 표현될 수 있습니다.
Declaration(선언)이란
char a; // 변수 선언 예시
Initialization(초기화)란?
변수를 초기화 한다는 건 변수를 선언한 후 그 변수에 처음으로 어떠한 값을 저장하는 걸 말합니다.
인스턴스를 생성 할 땐 변수를 초기화 하지 않아도 기본 값이 세팅되지만 지역변수의 경우엔 초기화를 항상 해줘여합니다.
초기화 하는 방법
변수를 초기화 하는 방법은 다양합니다.
명시적 초기화 방법
int a = 10; // 명시적 초기화 방법
생성자 초기화 방법
초기화 블럭 방법
public class ValableScopeExam{
int globalScope = 10;
public void scopeTest(int value){
int localScope = 10;
System.out.println(globalScope);
System.out.println(localScpe);
System.out.println(value);
}
}
public class VariableScopeExam {
int globalScope = 10;
static int staticVal = 7;
public void scopeTest(int value){
int localScope = 20;
System.out.println(globalScope);
System.out.println(localScope);
System.out.println(value);
}
public static void main(String[] args) {
System.out.println(globalScope); //오류
System.out.println(localScope); //오류
System.out.println(value); //오류
System.out.println(staticVal); //사용가능
}
}
타입 변환(Type Casting)이란 무엇인가?
형변환이란 변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 말합니다. 프로그램에서 값의 대입이나 연산을 수행할 때는 같은 타입끼리만 가능한데 그래서 연산을 수행하기 전에 같은 타입으로 만들어야 하고, 변수나 상수를 다른 타입으로 변환하는 것을 '형변환(casting)' 이라고 합니다.
큰 데이터의 타입에서 작은 데이터의 타입으로 바꿀 때 Type Casting이라고 합니다.
이떄는 명시적으로 보여줘야 합니다.
__타입 프로모션(Type Promotion)이란 무엇인가?
타입의 사이즈 크기가 더 작은 타입을 더 큰 타입에 대입할 때, 자동으로 작은 타입이 큰 타입으로 변환되는 현상힙니다.
이때는 자동으로 형변환 됩니다.
// 크기 할당과 초기화 없이 배열 참조변수만 선언하는 경우 입니다.
int arr[];
int [] arr;
// 선언과 동시에 배열 크기를 선언하는 경우입니다.
int[] arr = new int[5];
// 기존 배열의 참조 변수에 초기화 하는 경우입니다.
int[] arr;
arr = new int[5];
// 선언과 동시에 배열의 크기 지정 및 초기화 하는 경우입니다.
int[] arr = new int[]{1,2,3,4,5};
// 2차원 배열 선언입니다.
int[][] arr = new int[4][3];
int[][] arr = { {1,2,3}, {2,3,4}, {3,4,5}};
// 컴파일러가 타입을 유추할 수 있는 정보가 있습니다.
var message = "문자열 입니다.";
// 컴파일러가 타입을 유추할 수 있는 정보가 없습니다. 그래서 사용할 수 없습니다.
var messages = new ArrayList<>();