[학습 주제]
자바 데이터 타입, 변수, 그리고 배열
[학습 목표]
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
[학습 내용]
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
프리미티브 타입 종류와 값의 범위, 그리고 기본 값
1. 기본형 타입(Primitive Type)
- 사전에 정의해놓은 8가지 데이터 타입
- 저장 공간에 실제 리터럴 형태의 값이 저장
Ex) int, char, short. long, float, double, boolean, byte
값의 종류 | Type | 크기(byte) | 범위 |
정수 | byte | 1 | 8bit ( -128 ~ 127 ) |
short | 2 | 16bit( -32768 ~ 32767 ) | |
int | 4 | 23bit ( -2147483648 ~ 2147483648 ) | |
long | 8 | 64bit | |
문자 | char | 2 | 16bit( 0~ 65535) |
실수 | float | 4 | 23bit |
double | 8 | 64bit | |
논리 | boolean | 1 | true, false |
프리미티브 타입과 레퍼런스 타입
1. 레퍼런스 타입(Reference Type)
- 실제 값이 아닌 해당 값을 참조하는 참조값(주소값)이 메모리상에 저장
Ex) 클래스 Type, 인터페이스 Type, 배열 Type, 열거 Type (Primitive Type 제외 모두)
리터럴
1. 리터럴(Literal) 정의
- 소스 코드 내에서 직접 입력된 값(데이터)
- 변수 초기화 시 '저장할 값'
cf) 상수(Constant) : 값을 한 번 저장하면 변경할 수 없는 '변수'
2. 리터럴 종류
(1) 정수 리터럴
1) 소수점이 없는 정수 리터럴 : 10진수
Ex) 0. 15. -245
2) 0으로 시작하는 리터럴 : 8진수
Ex) 02, -06, 042
3) 0x 또는 0X로 시작하고, 숫자 0~9, A~B(a~b)로 구성된 리터럴 : 16진수
Ex) 0x5, 0xA, 0XB5, 0XAC35
-> 정수 리터럴을 저장할 수 있는 타입은 5개(byte, char, short, int, long)
(2) 실수 리터럴
1) 소수점이 있는 리터럴 : 10진수 실수
Ex) 0.25, -3.141592
2) 대문자 E or 소문자 e가 있는 리터럴 : 10진수 지수와 가수
Ex) 5E8 = 5 * 10 ^ 8
-> 실수 리터럴을 저장할 수 있는 타입은 2개(float, double)
(3) 문자 리터럴
1) 작은 따옴표 ' ' 로 묶인 하나의 텍스트
Ex) 'A', '가'
2) 이스케이프 문자 : 역슬래쉬 \가 붙은 문자 리터럴
-> 문자 리터럴을 저장할 수 있는 타입은 1개(char)
이스케이프 문자 | 용도 | 유니코드 |
' \ t ' | 수평 탭 | 0x0009 |
' \ n ' | 줄 바꿈 | 0x000a |
' \ r ' | 리턴 | 0x000d |
' \ "' | " 큰 따움표 표시 | 0x0022 |
' \ '' | ' 작은 따옴표 표시 | 0x0027 |
' \ \ ' | \ 역슬레쉬 표시 | 0x005c |
' \ u16진수 ' | 16진수에 해당하는 유니코드 | 0x0000 ~ 0xffff |
(4) 문자열 리터럴
- 큰따옴표 " " 로 묶인 텍스트
- 큰따옴표 안에 텍스트가 없어도 문자열 리터럴 -> 내부에서 이스케이프 문자 사용 가능
Ex) "한국", "xoq dlehd \t", "줄바꾸기 \n"
-> 문자열 리터럴을 저장할 수 있는 타입은 1개(String)
(5) 논리 리터럴
- boolean 논리 기본 데이터 타입에 저장 가능
Ex) true, false
변수 선언 및 초기화 하는 방법
1. 변수 선언
- 변수 선언은 변수의 타입과 이름을 결정해 변수를 만들도록 명령하는 것으로, 변수의 이름을 작성하는 데에 몇 가지규칙이 있다.
(1) 변수 이름 규칙
- 첫 문자는 영문자 혹은 ' _ ' , ' & ' cf) 한글 사용 가능
- 글자 수 제한 X, 공백 문자 및 특수 문자 사용 불가
- 영문 대/소문자 구분
- Java에서 예약어로 사용되는 것을 이름으로 사용 불가
(2) 이름 작성 방법
- 클래스명 : Camel Case(대문자로 시작)(파스칼 케이스)
- 변수 : Camel Case(소문자로 시작)
- 상수 : Snake Case
(3) 변수 선언
- 예시로, 변수는 아래와 같이 선언할 수 있다.
public class Main {
public static void main(String[] args) {
int num;
String name;
Character char;
}
}
2. 변수 초기화
- Java에서 초기화(Initialization)는, '객체를 선언하고, 값을 [최초]로 할당하는 것이다.'
- 즉, int num; 이라고 작성한 것은 변수 선언
- num = 10; 이라고 작성한 것은 값을 '할당(allocation)'
- int num = 10; 이라고 작성한 것은 선언과 동시에 값을 최초로 할당한 초기화에 해당한다.
public class Main {
public static void main(String[] args) {
int num;
System.out.println(num);
}
}
위와 같이 작성하면 아래와 같이 변수 num 이 초기화되지 않았다는 에러 문구를 확인할 수 있다.
Variable 'num' might not have been initialized
- 그러나, 이때 '클래스 영역'에서 선언한 변수들은 실행 시 초기화를 하지 않아도 Compiler에서 자동으로 값을 할당해준다.
public class Main {
int num;
String name;
Character c;
public static void main(String[] args) {
Main m = new Main();
System.out.println(m.num);
System.out.println(m.name);
System.out.println(m.c);
}
}
위와 같이 Main 클래스에 대한 객체 m을 생성하여 사용한 멤버 변수 num, name, c는 초기화 하지 않고 선언만 하였음에도 0 , null, null과 같이 값이 자동으로 할당된다.
0
null
null
Process finished with exit code 0
-> 따라서 클래스 영역에서 변수를 선언하고 초기화를 하지 않을 때에는 에러가 발생하지 않지만
'메소드 영역'에서 선언할 경우에는 자동으로 값이 할당되지 않아 에러가 발생하게 된다.
변수의 스코프와 라이프타임
1. 변수의 스코프(Scope)
- 해당 변수를 사용할 수 있는 영역 범위
- 변수의 종류(클래스 변수, 인스턴스 변수, 지역변수, 매개변수)에 따라 변수의 Scope가 달라진다.
(1) 클래스 변수 & 인스턴스 변수 -> 클래스 영역
(2) 지역 변수 -> 클래스 영역 이외의 영역
- 이때, 지역 변수의 경우 { 지역변수 Scope } 와 같이 블록 안에서 변수를 선언하고, 블록 안에서만 사용 가능하다.
- 매개변수는 메소드의 괄호 ( 매개변수 ) 안에서 선언하고, 해당 메소드 내에서 사용 가능하다.
2. 변수의 라이프타임(Lifetime)
- 해당 변수가 메모리에 언제까지 살아있는지를 의미
(1) 클래스 변수
- 클래스 처음 호출 시 생성되어 -> Java 어플리케이션이 종료되는 시점에 함께 소멸된다.
(2) 인스턴스 변수
- 객체가 생성될 때 변수가 생성되고 -> 인스턴스 참조가 없을 때 가비지 컬렉터가 객체를 지우는데, 이때 인스턴스 변수도 같이 소멸된다.
(3) 지역변수
- 블록이 시작되는, 즉 ' { ' 가 시작되는 시점에 생성도어 -> ' } ' 로 끝나는 시점에 소멸된다.
(4) 매개변수
- 메서드 호출 시 생성되어 -> 메서드 종료 시점에 소멸된다.
타입 변환, 캐스팅 그리고 타입 프로모션
- Java에서는 타입(type)을 변환하는 경우가 있는데, 캐스팅과 프로모션 2가지 종류로 변환이 가능하다.
- 이때, boolean 타입은 다른 원시 타입(primitive type)으로 변환이 불가능하다.
1. 타입 캐스팅(Narrow Conversion, 큰 -> 작은 타입)
- 자신의 표현 범위를 모두 포함할 수 없는, 더 작은 표현 범위의 데이터 타입으로 변환
- 캐스팅은 프로모션과 달리 타입 변현을 직접 명시하여야 한다.(강제/명시적 형변환)
Ex) 8바이트를 모두 사용하고 있는 상황에서, long 타입에서 -> int 타입으로 변경을 할 때에는, 5 ~ 8 바이트에 해당하는 부분을 모두 버려야 한다.
public class Main {
public static void main(String[] args) {
long number = 1234;
int num = (int) number
}
}
2. 타입 프로모션(Wide Conversion, 원래 타입 -> 더 큰 타입)
- 자신의 표현 범위를 모두 표현 가능한 데이터 타입으로의 변환
- 프로모션은, Java에서 타입 변형을 명시하지 않아도, '자동'으로 타입 변경이 가능하다.
- 프로모션은 타입 변경 시 '데이터의 유실이 없기 때문' 이다.
public class Main {
public static void main(String[] args) {
int num = 0; // 4 byte
long number = num; // 8 byte
}
}
3. 변수 범위
byte(1byte) → short(2byte) → int(4byte) → long(8byte) → float(4byte) → double(8byte)
의 순서대로 범위가 커지며, 따라서 왼쪽에서 오른쪽으로는 자동 형변환, 즉 프로모션이 적용된다.
1차 및 2차 배열 선언하기
1. 1차원 배열
(1) 배열 선언
- 배열을 선언하는 방법은 아래 3가지가 있다.
public class Main {
public static void main(String[] args) {
int[] arr;
int []arr2;
int arr3[];
}
}
- 배열은 선언만 하게 되면 메모리 공간을 차지하지 않으며,
- 초기화를 통해 배열의 크기(사이즈)를 지정해주어야 메모리 공간을 차지하게 된다.
(2) 배열 초기화
- 선언한 배열은 크기를 지정해 주어 초기화할 수 있다.
- 이때, int 형 배열은 default로 배열의 각 원소 값이 0으로, String이나 Character 형 배열은 default로 배열의 각 원소 값이 null 로 초기화 되는 것을 확인할 수 있다.
(3) 배열 선언 및 초기화
- 배열 선언 및 초기화는 배열을 선언하는 동시에 크기를 지정하여 초기화하는 것이다.
- 이때, 크기를 지정하여 초기화하는 것이 아닌 실제 배열의 원소 값을 입력하여 초기화할 수 있다.
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
}
}
public class Main {
public static void main(String[] args) {
int[] arr; // 베열 생성
arr = new int[10]; // 배열 초기화
System.out.println("int 형 배열 생성 및 초기화 : " + arr);
for (int x: arr) System.out.print(x + " ");
System.out.println();System.out.println();
String[] arrStr; // 베열 생성
arrStr = new String[10]; // 배열 초기화
System.out.println("String 형 배열 생성 및 초기화 : " + arrStr);
for (String x: arrStr) System.out.print(x + " ");
System.out.println();System.out.println();
Character[] arrChar = new Character[10]; // 배열 생성 + 초기화
System.out.println("Character 형 배열 생성 및 초기화 : " + arrChar);
for (Character x: arrChar) System.out.print(x + " ");
}
}
int 형 배열 생성 및 초기화 : [I@75b84c92
0 0 0 0 0 0 0 0 0 0
String 형 배열 생성 및 초기화 : [Ljava.lang.String;@6bc7c054
null null null null null null null null null null
Character 형 배열 생성 및 초기화 : [Ljava.lang.Character;@232204a1
null null null null null null null null null null
2. 2차원 배열
(1) 배열 선언
- 2차원 배열은 가로와 세로의 범위가 있으며 가로는 열 크기, 세로는 행 크기에 해당한다.
(2) 배열 초기화
- 선언한 배열은 크기를 지정해 주어 초기화할 수 있다.
(3) 배열 선언 및 초기화
- 배열 선언 및 초기화는 배열을 선언하는 동시에 크기를 지정하여 초기화하는 것이다.
데이터타입[가로][세로] 배열명 = new 데이터타입[가로][세로];
타입 추론, var
1. var
- Java 10에서 도입된 var는 변수를 선언할 때 타입 지정을 생략할 수 있으며, 이때 컴파일러가 타입을 추론한다.
- 컴파일 타임에 추론하는 것이므로, Runtime에 추가적인 연산을 하지 않으며 성능에 영향을 미치지 않는다.
- Java에서 var는 지역 변수에서만 사용 가능하다.
- var을 사용할 때에는 변수의 타입 추론을 위해 초기화가 필요하며, 이때 null로는 초기화할 수 없다.
- 또한, 배열에 var을 사용할 수 없으며 Lambda에도 사용할 수 없다.
var f = () -> { }; // compile error
참고
- https://codechacha.com/ko/java-local-variable-type-inference/
'Programming > Java' 카테고리의 다른 글
[Java] 가비지 컬렉션(Garbage Collection) (0) | 2022.01.14 |
---|---|
[Java] 변수 종류 - 클래스 변수 / 인스턴스 변수 / 지역 변수 (1) | 2022.01.13 |
[Online Study 1주차] JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2022.01.11 |
[Java] 접근 제어자(public, protected, default, private) (0) | 2021.10.01 |
[Java] static (0) | 2021.10.01 |