728x90
✍️ 학습 목표
- 프리미티브 타입 종류, 값의 범위 그리고 기본 값
- 프리미티브 타입 vs 레퍼런스 타입
- 리터럴이란?
- 변수 선언 및 초기화
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언
- 타입 추론, var
💡프리미티브 타입 종류, 값의 범위 그리고 기본 값
- Java에는 8가지의 기본형 타입(primitive type)을 미리 정의하여 제공한다.
- 크게 논리형, 정수형, 실수형, 문자형 4가지로 나누어지고 표현 가능한 범위에 따라 또 나누어진다.
- 문자형인 char는 Java에서 유니코드를 사용하기 때문에 2 byte이다.
- 기본 값이 존재해서 NULL이 존재하지 않는다.
💡프리미티브 타입 vs 레퍼런스 타입
데이터 타입은 크게 '기본형(Primitive Type)'과 '참조형(Reference Type)'으로 나뉜다.
✔️ 기본형(Primitive Type)
- 문자, 숫자와 같은 실제 데이터를 저장한다.
- 프리미티브 타입들은 스택 영역에 값들이 저장된다.
- 표현 범위를 벗어나면 컴파일 에러가 발생한다.
✔️ 참조형(Reference Type)
- Java.lang.object를 상속받으면 참조형이 된다. 기본형을 제외하고 모두 참조형이다.
- NULL 값이 존재한다. (빈 객체를 의미)
- 참조형의 실제 인스턴스는 힙 영역에 저장하고 그 힙 영역의 주소(4 byte)를 저장한다.
💡리터럴
리터럴이란? 데이터 그 자체, 변하지 않는 데이터를 말한다.
✔️ 참고하기
- 변수 a, b가 모두 10으로 초기화되면 각각 다른 10을 가리키는게 아니라 a, b 모두 10을 가리킨다.
- 3.14, "HEJOW" 이런 값들을 리터럴이라고 하는데 원래는 상수라고 불러야 하지만 프로그래밍에서 상수를 '값을 한 번 저장하면 변경할 수 없는 저장공간'으로 정의했기 때문에 리터럴이라는 용어를 사용한다.
- 즉, 리터럴은 기존에 알던 상수의 다른 이름이다.
💡변수 선언 및 초기화
✔️ 변수 선언
- 변수 선언이란? 어떤 타입의 메모리를 사용한다고 컴파일러에게 미리 알리는 것.
- 아래 그림과 같이 어떤 타입인지 지정하고 메모리 공간에 이름을 붙여준다.
- 변수란? 변하는 수 ❌, 데이터를 저장하는 공간 👌
- 네이밍 컨벤션은 대부분의 언어들과 비슷하다 😋
✔️ 변수 초기화
- 변수 초기화란? 변수에 처음으로 값을 저장하는 것.
- 변수의 타입에 맞춰서 대입 연산자 =을 사용해서 초기화한다.
- 초기화를 생략하는 경우도 있지만 지역변수만큼은 반드시 초기화해야 한다.
- Java는 '명시적 초기화', '생성자를 이용한 초기화', '초기화 블록을 이용한 초기화' 이렇게 3가지 초기화 방법을 제공한다.
💡변수의 스코프와 라이프타임
- 스코프란? 영역, 범위를 의미한다. 변수의 영역은 선언한 위치에 따라 다르다.
- 라이프타임은 프로그램이 실행되는 동안 값을 담고 있는 주기를 말한다. 이 또한 선언 위치에 따라 다르다.
public class Example {
int instanceValue; // 인스턴스 변수
static int classValue; // 클래스 변수
public void method() {
int localValue; // 지역 변수
}
}
- 클래스 내부에 선언되는 변수를 멤버 변수(전역 변수)라고 하는데 그중에 static 키워드가 붙은 것은 클래스 변수, 없는 것은 인스턴스 변수이다.
- 메서드 내에 선언된 변수는 지역 변수이다.
✔️ 클래스 변수
- 클래스 내 static 키워드로 선언된 변수.
- JVM이 실행되고 클래스가 메모리에 올라갈 때부터 프로그램이 종료될 때까지 유지된다.
- 동일한 클래스의 모든 객체들이 공유한다.
✔️ 인스턴스 변수
- 클래스 영역에서 선언된 변수.
- 클래스의 인스턴스를 생성할 때 만들어지고 메모리에 남아있을 때까지 유지된다.
- 각 인스턴스마다 독립적인 공간을 부여받는다.
✔️ 지역 변수
- 클래스 영역 이외의 영역에서 선언된 변수이다.
- 특정 스코프 안에서만 사용하기 때문에 해당 스코프를 벗어나면 소멸한다.
💡타입 변환, 캐스팅 그리고 타입 프로모션
- 타입 변환이란? 변수 또는 상수의 타입을 다른 타입으로 바꾸는 것이다.
- 변환할 타입을 대상 앞에 붙여주면 타입 변환된다. 이때 형변환 연산자는 결과만 리턴하므로 기존의 변수나 리터럴은 변화하지 않는다.
double value = 123.456;
int score = (int)value;
System.out.println(value == 123.456); //true
- 타입 변환 시 대상에 따라 데이터 손실이 발생할 수도 있다. 이때 캐스팅과 프로모션이 발생한다.
✔️ 캐스팅 (명시적 형변환)
- 작은 데이터 타입으로 변환되는 것을 말한다.
- 캐스팅 시 데이터 손실이 발생할 수 있다.
- 타입을 입력하지 않으면 컴파일 에러가 발생한다.
✔️ 프로모션 (묵시적 형변환)
- 큰 데이터 타입으로 변환되는 것을 말한다.
- 형변환을 생략할 수 있다. 사실 컴파일러가 자동으로 추가해서 자동 형변환이라고도 한다.
💡1차 및 2차 배열 선언
- 배열 선언 타입 뒤 혹은 변수 이름 뒤에 대괄호를 붙인다. 보통 Java는 타입 뒤에 붙인다.
int[] Array;
int Array2[];
int[][] Array3;
int Array4[][]
- 배열 생성 시 new 연산자를 사용해 배열의 타입과 길이를 지정한다.
int[] Array = new int[10];
int Array2[] = new int[5] {1,2,3,4,5};
int[][] Array3 = new int[2][2]{{1, 2}, {3, 4}};
int Array4[][] = new int[2][3]{{1, 2, 3}, {3, 4, 5}};
💡타입 추론, var
- Java Compiler가 타입을 추론하는 것을 타입 추론(Type Inference)이라 한다.
- 추론 알고리즘을 통해서 진행되는데 선언부를 살펴보고 인수 타입을 결정하고 가능하다면 반환 타입도 추론한다. 타입이 정해지기 때문에 var는 재할당을 허용하지 않는다.
- 무조건적으로 좋은 것이 아니기 때문에 개발자가 추적할 수 없는 경우 사용하지 않는 게 좋다.
'언어 공부 > Java' 카테고리의 다른 글
[Java] Java의 상속 (2) | 2022.08.25 |
---|---|
[Java] Java의 클래스 (0) | 2022.08.17 |
[Java] Java 제어문 (0) | 2022.08.16 |
[Java] Java의 연산자 (0) | 2022.08.15 |
[Java] JVM과 자바 코드 실행 (0) | 2022.08.08 |
댓글