보근은 참고 있다
2주차 과제: 자바 데이터 타입, 변수 그리고 배열 본문
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
프리미티브 타입 종류와 값의 범위 그리고 기본 값
메모리 크기 | 값의 범위 | 기본 값 | |
boolean | 1byte | true or false | false |
byte | 1byte | -128 ~ 127 ( -2^7 ~ 2^7 - 1) | 0 |
short | 2byte | -32,768 ~ 32787 ( -2^15 ~ 2^15 - 1) | 0 |
int | 4byte | -2,147,483,648 ~ 2,147,483,647 ( -2^31 ~ 2^31 - 1) | 0 |
long | 8byte | –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 ( -2^63 ~ 2^63 - 1) |
0L |
float | 4byte | 1.4E–45 ~ 3.4028235E+38 | 0.0f |
double | 8byte | 4.9E–324 ~ 1.7976931348623157E+308 | 0.0d |
char | 2byte | \u0000 ~ \uFFFF (유니코드) | \u0000 |
프리미티브 타입과 레퍼런스 타입
프리미티브 타입(Primitive type)은 원시형 또는 기본형 데이터 타입이라고도 부릅니다.
- 프리미티브 타입이란, 논리형, 정수, 실수, 문자 리터럴을 직접적으로 갖는 데이터 타입입니다.
- 프리미티브 타입은 단 한 가지의 값만 나타낼 수 있습니다.
- 자바에는 8가지 프리미티브 타입이 있습니다.
- 프리미티브 타입은 자바 언어에 의해 정의되며, 사용자는 새로운 프리미티브 타입을 정의할 수 없습니다.
- 프리미티브 타입은 자바 언어에 의해 정의된 대로 1~8바이트의 크기를 가집니다.
- 프리미티브 타입은 JVM의 메모리 영역 중에서 스택 영역에 저장됩니다.
레퍼런스 타입(Reference type)은 참조형 데이터 타입이라고도 부릅니다.
- 레퍼런스 타입이란, 클래스, 인터페이스, 배열 등과 같이 다른 프리미티브 타입이나 다른 레퍼런스 타입을 참조하는 데이터 타입입니다.
- 레퍼런스 타입은 0개 이상의 복수의 값을 나타낼 수 있습니다.
- 레퍼런스 타입은 사용자가 정의할 수 있기 때문에 무한히 많은 종류가 있다고 할 수 있습니다.
- 레퍼런스 타입은 사용자가 정의한 대로 0바이트부터 훨씬 더 큰 숫자의 크기를 가집니다.
- 레퍼런스 타입은 JVM의 메모리 영역 중에서 힙 영역에 저장됩니다.
리터럴
리터럴(Literal)은 자바 소스 코드 내에 있는 값을 나타내는 데이터 그 자체이다. 리터럴에는 정수, 실수, 문자, 문자열, 논리형 상수, null 등이 포함된다.
ex) 1, 2.5, 'a', "abc", true, false 등등
변수 선언 및 초기화하는 방법
프리미티브 타입의 변수 선언 및 초기화는 (타입) (변수명) = (값); 의 형태이다.
int a = 5;
double b = 2.3d;
char c = 'c';
boolean d = true;
레퍼런스 타입의 변수 선언 및 초기화는 new 연산자와 생성자 함수를 이용한다.
Object e = new Object();
MyClass f = new MyClass("park", 26);
int[] g = new int[5];
변수의 스코프와 라이프타임
변수의 스코프와 라이프 타임은 변수의 종류에 따라 다르다. 변수의 종류는 지역 변수, 전역 변수, 인스턴스 변수, 파라미터가 있다.
- 지역 변수(Local variable) - 지역 변수는 메소드 블럭 내에 정의된 변수들을 말한다. 스코프는 정의된 메소드 블럭 내이고, 라이프 타임는 지역 변수가 초기화된 후부터 메소드 종료 시까지이다.
- 전역 변수(Global variable) - 클래스 변수라고도 한다. 전역 변수는 클래스 영역에서 정의된 변수 중, static으로 선언된 변수들이다. 전역 변수는 클래스 로더에 의해 로딩될 때 메모리에 올라간다. 스코프는 프로그램 내의 전역에서 사용이 가능하고, 라이프 타임은 프로그램 시작부터 종료 시까지이다.
- 인스턴스 변수(Instance variable) - 인스턴스 변수는 클래스 내에 정의된 변수 중 전역 변수가 아닌 변수이다. 스코프는 해당 클래스의 내이고, 라이프 타임은 객체 생성 시부터 소멸 시까지이다.
- 파라미터(parameter) - 메소드 정의 시에 파라미터로 요구하는 변수들이다. 스코프는 메소드가 호출되고 메소드 블럭이 실행될 때부터 메소드가 종료될 때까지이고, 라이프 타임은 메소드 블럭 실행 시부터 종료 시까지이다.
타입 변환, 캐스팅 그리고 타입 프로모션
먼저 타입 변환에는 두 종류가 있다. 자동 타입 변환(묵시적)과 강제 타입 변환(명시적)이다.
- 자동 타입 변환 (Type Promotion)
자동 타입 변환은 대입 연산이나 산술 연산에서 컴파일러가 자동으로 수행해주는 타입 변환을 말합니다. 자바는 데이터의 손실이 발생하지 않는다면 boolean 타입을 제외한 나머지 프리미티브 타입의 타입 변환을 자유롭게 수행할 수 있습니다.
double d = 10; // 대입 연산 : double 타입에 int 데이터를 대입해도 10.0d로 자동 타입 변환이 이뤄진다.
double d = 3.14f + 7.04d; // 산술 연산 : float 데이터와 double 데이터의 합의 결과로 double 데이터로 자동 타입 변환이 이뤄진다.
자동 타입 변환은 데이터의 손실이 발생한다면 이뤄지지 않는다. 즉, 표현할 수 있는 값의 범위가 더 큰 쪽이 작은 쪽으로 변환할 수 없다. 위의 표는 표현할 수 있는 값의 범위가 작은 순서로 타입 변환이 가능한 방향을 가르키고 있다.
char 타입의 경우 모든 문자가 유니코드 인코딩의 숫자에 해당하기 때문에 정수나 실수형으로 타입 변환이 가능한 것이다.
- 강제 타입 변환 (Casting)
강제 타입 변환은 사용자가 타입 캐스트 연산자 (type) 를 이용하여 강제적으로 수행하는 타입 변환을 말합니다. 강제 타입 변환은 (변환할 타입) 변환할 데이터 의 꼴로 나타냅니다.
double d1 = 1/2 // 0.0
double d2 = (double) 1/2 // 0.5
자바에서 산술 연산을 하고 얻는 결과값은 항상 피연산자와 같습니다. 예시 d1은 int형 데이터들끼리 나눴으므로 1/2의 결과인 0.5가 아닌 0으로 반환이 되고, 자동 타입 변환에 의해 double 타입인 0.0으로 저장이 되는 것입니다. d2 예시처럼 int형 데이터의 산술 연산을 double타입으로 강제 타입 변환하여 0.5라는 결과가 저장이 되는 것입니다.
강제 타입 변환을 이용하면 좁은 변환도 가능합니다. 하지만, 변환 하려는 타입의 값의 범위를 고려하지 않으면 예상과 다른 결과를 얻을 수도 있습니다.
int i1 = (int) 15L; // 15
int i2 = (int) 2147483648L; // -2147483648
위의 예시 i1에서는 long 타입을 int로 변환하였지만, long 타입의 데이터가 int의 값의 범위에 포함되기 때문에 정확한 결과가 나왔습니다. 밑의 예시 i2는 컴파일 에러가 나지는 않지만, 예상과는 전혀 다른 값이 나왔습니다.
1차 및 2차 배열 선언하기
배열이란, 프로그래밍 언어에서 제공하는 자료구조입니다. 인덱스-값의 구조로 구성되어 있으며, 인덱스를 통해 값으로 랜덤 엑세스 할 수 있습니다. 선형 자료구조로 메모리 상에서도 시작 주소부터 인덱스 순서로 길게 이어져 있습니다.
1차원 배열의 선언 방법은 다음과 같습니다.
int[] array1 = new int[5]; // 사이즈가 5인 int배열을 생성.
Object[] array2 = { 1, 0.5f, "hello" }; // 사이즈가 3인 Object 배열을 뒤의 값들을 순서대로 넣어서 생성.
2차원 배열의 선언 방법은 다음과 같습니다.
int[][] array1 = new int[5][10]; // 사이즈가 10인 1차원 배열을 5개 갖는 배열을 생성. 도합 50개의 데이터.
int[][] array2 = { new int[] {1,2,3}, new int[] {4,5,6}, new int[] {7,8,9} }; // 3 * 3으로 도합 9개의 데이터.
타입 추론, var
타입 추론은 코드 작성 시에 정해지지 않은 타입을 컴파일러가 추론하여 타입을 정하는 것입니다. 자바에서 주로 타입 추론이 쓰이는 곳은 제네릭, 람다, var 등이 있습니다.
자바도 자바 10부터 지역 변수 타입 추론을 지원하기 시작했습니다. 그 예약어가 var입니다. 사용법은 변수의 타입을 var로 명시해주는 것이 끝입니다.
var의 예를 몇 가지 들어보면,
public class Test {
public static void main(String[] args) {
var list = new LinkedList<Integer>(); // 컴파일러가 list의 타입을 LinkedList로 추론.
list.add(1);
list.add(2);
list.add(3);
for (var v : list) { // forEach 구문에서 타입 지정 안해줘도 됨.
System.out.println(v);
}
var anonymous = (new Object() { // 익명 클래스에 접근할 변수로 사용 가능.
public void hello() {
System.out.println("hello");
}
});
anonymous.hello();
}
}
위와 같이 편리하다는 장점과 기존의 자바 문법에선 익명 클래스를 정의하고 메모리에 올려져 있음에도 사용할 방법이 없었는데, var을 이용해서 사용이 가능해졌다는 장점이 있습니다.
하지만, 무분별한 var의 사용은 코드를 보기 어렵게 만든다는 단점이 있습니다.
참고 : kephilab.tistory.com/27, itmining.tistory.com/20, www.tcpschool.com/java/java_datatype_typeConversion, dev.to/composite/java-10-var-3o67
'Language > 자바 정리 할래' 카테고리의 다른 글
6주차 과제: 상속 (0) | 2020.12.21 |
---|---|
5주차 과제: 클래스 (0) | 2020.12.19 |
4주차 과제: 제어문 (0) | 2020.12.12 |
3주차 과제: 연산자 (0) | 2020.11.24 |
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2020.11.10 |