목표
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 것
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 1차 및 2차 배열 선언하기
- 타입 추론, var
# 프리미티브 타입 종류와 값의 범위 그리고 기본 값
기본형(Primitive Type)이란?
총 8가지 기본형 타입(Primitive Type)을 미리 정의하여 제공한다
정수 타입에는 byte, char, short, int, long이 있고, 실수 타입에는 float, double이 있다.
그리고 논리 타입에는 boolean이 있다. 아래 표는 기본 데이터 타입의 크기와 저장되는 값의 범위를 보여준다.
기본값이 있기 때문에 Null이 존재하지 않는다. 만약 기본형 타입에 Null을 넣고 싶다면 래퍼 클래스를 활용한다
실제 값을 저장하는 공간으로 스택(Stack) 메모리에 저장된다.
만약 컴파일 시점에 담을 수 있는 크기를 벗어나면 에러를 발생시키는 컴파일 에러가 발생한다. 주로 문법상의 에러가 많다.

# 프리미티브 타입과 레퍼런스 타입

참조형(Reference Type)이란?
기본형 8가지를 제외한 나머지 타입
참조형 변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 참조형 변수의 타입이 된다.
따라서 새로운 클래스를 작성하는 것은 새로운 참조형 변수를 추가한다고 봐도 무방하다.
Scanner sc = new Scanner(System.in);
Scanner 클래스 타입의 참조형 변수 sc를 선언한 것이다. 참조형 변수는 null 또는 주소 값을 가지는데
연산자 new의 결과는 생성된 객체의 주소이다. 이 주소가 대입 연산자 = 에 의해서 참조형 변수 sc에 저장되는 것이다.

데이터 타입과 참조 타입은 데이터가 생성되고 저장되는 위치가 다르다. 기본 데이터 타입은 스택 영역에 생성이 되고
참조 데이터 타입은 힙 영역에 생성된다.
메모리 사용 영역
java.exe로 프로그램 실행하면 JVM(Java Virtual Machine)이 실행된다. JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)을
메서드 영역(Method Area), 스레드 영역(Thread Area), 힙 영역(Heap Area)과 같이 세부 영역으로 구분을 해서 사용한다.
이때 스레드 영역마다 하나의 JVM스택 영역이 존재하게 된다.

기본형(Primitive Type) 변수는 선언한다면 스레드마다 하나씩 생성되는 Stack영역에 변수만큼의 공간이 생성되고
참조형(Reference Type)변수는 선언하면 Stack영역에 변수의 이름이 생성되고 고정적으로 4byte의 크기를 갖는다
하지만 참조형은 new라는 명령어가 Heap영역에 새로운 저장공간을 생성해서 이 공간은 메모리 주소 값을 할당받고
그 공간의 주소 값을 불러와서 Stack영역의 공간에 저장한다.

# 리터럴
리터럴이란? 그 자체로 값을 의미하는 것
컴퓨터 과학 분야에서 소스 코드의 고정된 값을 대표하는 용어 고정된 값은 숫자, 문자, 함수 등 더 이상 나눌 수 없는 명확하게 데이터를 표현하는 값. 리터럴은 변수 초기와에 종종 사용된다.
객체 지향 언어들 중에는, 리터럴로 객체를 표현할 수 있다.
함수 리터럴 방식을 이용한 객체 리터럴에서는 이 객체의 메서드도 리터럴이 될 수 있다.

# 변수 선언 및 초기화하는 방법
변수란? 하나의 값을 저장할 수 있는 저장공간
저장공간 즉, 변수가 필요하다면 먼저 변수를 선언해야 한다. 변수를 선언하는 방법은 [변수 타입 변수 이름;]과 같다. 변수의 타입은 변수에 저장할 값이 어떤 것이냐에 따라 달라지며, 변수의 이름은 저장공간이 서로 구별될 수 있어야 하기 때문에 필요하다. 예를 들어 정수(integer)를 저장할 공간이 필요하다면 [int x;]와 같이 변수를 선언한다.
변수의 초기화
변수를 선언하고 처음으로 값을 저장하는 것을 '변수와 초기화'라고 한다.
멤버 변수는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 이루어지므로 초기화하지 않고
사용해도 되지만 지역 변수는 사용하기 전에 반드시 초기화를 해야 한다.
명시적 초기화(explicit initialization)
변수를 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다.
가장 기본적이고 간단한 초기화 방법이며, 여러 초기화 방법 중 가장 우선적으로 고려되어야 한다.
초기화가 간단하고 명료하긴 하지만 보다 복잡한 초기화 작업이 필요할 때는 '초기화 블럭(initialization block)' 또는 생성자를 사용해야 한다.
초기화블럭(initialization block)
초기화 블럭에는 ' 클래스 초기화 블럭'과 '인스턴스 초기화 블럭' 두가지 종류가 있다.
초기화 블럭을 작성하려면 인스턴스 초기화 블럭은 단순히 클래스 내에 블럭{}을 만들고 그 안에 코드를 작성하기만 하면 된다.
그리고 클래스 초기화 블럭은 인스턴스 초기화 블럭 앞에 단순히 static을 덧붙이기만 하면 된다.
초기화 블럭 내에는 메서드 내에서와 같이 조건문, 반복문, 예외처리 구문 등을 자유롭게 사용할 수 있으므로 초기화 작업이 복잡하여
명시적 초기화만으로는 부족한 경우 초기화 블럭을 사용한다.

클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한 번만 수행되며 인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때마다 수행된다. 그리고 생성자보다 인스턴스 초기화 블럭이 먼저 수행된다는 점이 중요하다.
인스턴스 변수의 초기화는 주로 생성자를 사용하기 때문에 인스턴스 초기화 블럭은 잘 사용되지 않는다. 대신 클래스의 모든 생성자에서 공통적으로 수행되어야 하는 코드가 있는 경우 생성자에 넣지 않고 인스턴스 초기화 블럭에 넣어두면 코드의 중복을 줄일 수 있어서 좋다.
예를 들면 클래스의 모든 생성자에 공통적으로 수행되어야 하는 문장들이 있을 때, 이 문장들을 각 생성자마다 써주기 보다 아래와 같이 인스턴스 블럭을 이용하면 코드가 보다 간결하고 유지 보수하기 쉬워진다.
멤버 변수의 초기화 시기와 순서
-클래스 변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화됨
-인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스 별로 초기화가 이루어진다
-클래스 변수의 초기화 순서 : 기본값 → 명시적 초기화 → 클래스 초기화 블럭
-인스턴스 변수의 초기화 순서 : 기본값 → 명시적 초기화 → 인스턴스 초기화 블럭 → 생성자
# 변수의 스코프와 라이프타임
스코프란?
변수의 사용 가능 범위, 변수에 접근하고 접근할 수 있는 영역

라이프타임이란?
해당 변수가 메모리에 언제까지 살아있는지를 의미, 생명주기
인스턴스 변수(Instance Variable) : 클래스 내에서 선언되지만 메서드 및 블록 외부에 선언되는 변수
-스코프 : 정적 메서드(static method)를 제외한 모든 클래스에
-라이프타임 : 클래스의 객체가 메모리에 남아있을 때까지
클래스 변수(Class Variable) : 클래스 안에 선언되고, 어떠한 메서드나 블럭안에 선언되지 않으며 static이 포함된 변수
-스코프 : 클래스 전체
-라이프타임 : 프로그램 종료 때까지
로컬 변수(Local Variable) : 인스턴스 변수나 ㅋ르래스 변수가 아닌 모든 변수
-스코프 : 변수가 선언된 블록 내부
-라이프타임 : 변수가 선언된 block 내부에 프로그램이 도는 동안
# 타입 변환, 캐스팅 그리고 타입 프로모션
타입 변환이란?
변수 또는 상수의 타입을 다른 타입으로 변환하는 것
연산을 수행하는 코드에서는 같은 타입끼리만 가능하기 때문에 연산을 수행하기 전에 같은 타입으로 만들어야 하는데
타입 변환하는 것을 형변환이라고 한다
타입 변환에는 자동(묵시적) 타입 변환과 강제(명시적) 타입 변환이 있다
프로모션, 캐스팅이란?
-타입 프로모션(자동/묵시적 형변환) : 작은 데이터 타입에서 큰 데이터 타입으로 형변환 / 변환 전후 값 동일
-캐스팅(명시적 형 변환) : 큰 데이터 타입에서 작은 데이터 타입으로 형변환 / 변환 전후 값 변경될 수 있음(수학의 소수점 버림의 느낌)
-강제/명시적 형변환 : 형변환을 하고 싶을 때 사용하는 것
# 1차 및 2차 배열 선언하기
1차 배열 선언
원하는 타입의 변수를 선언하고 변수 또는 타입에 배열을 의미하는 대괄호 [] 를 붙임
대괄호[] 는 타입 뒤에 붙여도 되고 변수 이름 뒤에 붙여도 됨 / 타입[] 변수 이름; 선호
| 선언방법 | 선언 예 |
| 타입[] 변수이름 | int[] score; String[] name; |
| 타입 변수이름[]; | int score[]; String name[]; |
2차 배열 선언
1차원 배열과 같다. 대괄호 []하나가 더 들어간다 / 타입[][] 변수 이름; 선호
| 선언방법 | 선언 예 |
| 타입[][] 변수이름; | int[][] score; |
| 타입 변수이름[][]; | int score[][]; |
| 타입[] 변수이름[]; | int[] score[]; |
# 타입 추론, var
타입 추론이란?
타입을 미리 선언하지 않고 리터럴 값으로 컴파일러가 이를 추론하게 하는 것
개발자가 종종 필요하지 않은 지역 변수 유형의 매니페스트 선언을 제거할 수 있도록 함으로써 정적 유형 안전성에 대한 java의 노력을 유지하면서
Java 코드 작성과 관련된 의식을 줄여줌으로써 개발자의 경험을 개선하고자 함
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
Var : 키워드가 아닌 타입의 이름
키워드가 아니기 때문에 아래와 같은 코드도 정상적으로 작동한다
변수, 메서드 또는 패키지 이름으로 var를 사용하는 코드는 영향을 받지 않는다
var키워드는 지역 변수 유형 추론을 허용한다. 즉, 컴파일러가 지역 변수의 유형을 추론한다
var var = "variable";
특징
var키워드는 지역 변수 타입 추론을 허용한다
형식 변수 선언 및 메서드의 반환 유형, 멤버 변수 또는 필드 선언, 생성자 형식 변수 또는 다른 종류의 변수 선언에는 사용할 수 없다
var키워드 적용 이후로도 Java는 여전히 정적 언어이며 지역 변수 타입 추론하기에 충분한 정보가 있어야 한다.
그렇지 않으면 컴파일에서 오류가 발생한다
Java 11에서는 람다 표현식에 var를 사용할 수 있다. 즉, var타입을 지정함으로 인해 어노테이션을 추가할 수 있다
'Back-end > Java_T.I.L' 카테고리의 다른 글
| 5. 클래스 (2) | 2022.01.02 |
|---|---|
| 4. 제어문_반복문(for, while, do-while) (0) | 2021.12.31 |
| 4. 제어문_선택문(if, else-if, switch) (0) | 2021.12.31 |
| 3. 연산자 (0) | 2021.12.30 |
| 1. JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2021.12.28 |
댓글