안녕하세요. 그린주입니다 ๑'ٮ'๑
목표
자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 것
프리미티브 타입
프리미티브 타입과 레퍼런스 타입
리터럴
변수 선언 및 초기화하는 방법
변수의 스코프와 라이프타임
타입 변환, 캐스팅 그리고 타입 프로모션
프리미티브 타입(Primitive type)
1. 프리미티브 타입 종류
총 8가지의 기본형 타입으로 수치 타입의 정수 타입(5), 부동소수점 타입(1)과 불리언 타입(2)이 있습니다.
기본 값이 있기 때문에 null이 존재하지 않습니다. null를 넣고 싶다면 Wrapper Class를 활용합니다.
실제 값은 Stack 메모리에 저장됩니다.
1) 정수 타입
정수 숫자를 표현하는 타입입니다.
정수 타입에는 "byte", "short", "int", "long", "char"가 있습니다.
"byte", "short", "int", "long" 4개의 타입은 숫자(정수형)를 담는 타입으로 크기의 차이가 있습니다.
"char"은 문자(문자형)를 담는 타입입니다.
"char"는 문자 타입인데 왜 정수 타입에 속하는지 궁금하지 않으신가요???
그 이유는 바로 문자가 담아지는 것이 아니라 문자를 대표하는 문자코드 값으로 담아지기 때문입니다.
예를 들어 "A"는 65, "B"는 66이라고 할 때, "char"타입의 변수 값의 65는 문자 "A"를 의미합니다.
정수 타입의 크기는 아래와 같습니다.
2) 부동 소수점 타입
소수 점을 표현하는 타입입니다.
부동 소수점 타입에는 "float", "double"이 있습니다.
"float", "double"은 소수(실수형)를 담는 타입입니다.
부동 소수점 타입의 크기는 아래와 같습니다.
3) 불리언 타입
참과 거짓을 표현하는 타입입니다.
불리언 타입은 "boolean"이 있습니다.
"true", "false" 값(논리형)을 담는 타입입니다.
불리언 타입의 크기는 실제로 1bit면 충분하지만 데이터를 다루는 최소 단위가 1byte(8 bits)이므로 메모리 크기는 1byte입니다.
2. 값의 범위와 기본 값
컴파일 시점에 값의 범위에서 벗어나는 값을 담는다면 컴파일 에러가 발생합니다.
1) 정수 타입
부호를 표현한다면 첫 번째 비트는 부호를 나타나게 되어 나머지 n-1의 비트를 이용하여 수를 표현하게 됩니다.
또한 양수에 0을 포함하여 계산하기 때문에 -1을 해주어 부호 있는 정수형의 표현 범위는 -2ⁿ ~ 2ⁿ -1가 됩니다.
"char"형은 unsigned 형식이기 때문에 맨 앞 비트를 음수 양수 형식으로 사용하지 않습니다.
2) 부동 소수점 타입
값을 부호, 지수, 가수로 나누어 저장됩니다.
실수형은 정수형과 저장 방식이 다르기에 같은 크기라도 훨씬 큰 범위를 표현할 수 있지만 원래 저장하려던 값과 실제 저장된 값이 오차가 발생할 수 있습니다. 그래서 오차 없는 자리 수인 정밀도(precision)가 굉장히 중요합니다. 정밀도는 가수 부분의 데이터 크기에 연관되어있습니다. 정밀도는 높을수록 오차의 범위가 줄어듭니다.
"float"의 가수 부분은 23비트인데 정규화를 통해 24까지 표현이 가능합니다. 224는 107보다는 크고 108보다는 작기에 float의 정밀도는 7자리가 됩니다. 이는 10진수로 7자리의 수를 오차 없이 저장할 수 있다는 의미입니다.
"double"의 경우에는 가수 부분이 52비트이고 위와 같이 정밀도를 계산하면 정밀도는 15자리가 됩니다. 이는 사용할 변수의 값의 범위가 7자리가 넘는다면 정밀도를 고려해 "float"가 아닌 "double"타입을 사용해야 한다는 의미입니다.
3) 불리언 타입
프리미티브 타입(Primitive type)과 레퍼런스 타입(Reference type)
자료형은 크게 "기본형"과 "참조형"으로 나누어져 있습니다.
각각의 타입으로 변수를 선언할 때 "기본형"은 메모리 영역의 스택 영역에 실제 값들이 직접 저장되고, "참조형"은 실제 인스턴스는 힙 영역에 생성하고, 그 영역의 주소 값은 스택 영역에서 저장합니다.
1. 기본형
정수 타입, 부동소수점 타입, 불리언 타입으로 실제 데이터 값을 저장합니다.
2. 참조형
객체의 주소를 저장합니다. 기본적으로 "java.lang.Object"를 상속받을 경우 참조형이 됩니다.
즉, 기본형을 제외하고는 참 조형이라 생각해도 될 것 같습니다.
리터럴
"리터럴"은 데이터 그 자체를 의미합니다.
이러한 값들은 "상수"라 불러야 하지만 프로그래밍에서 상수는 "값을 한 번 저장하면 변경할 수 없는 저장공간"으로 정의했기 때문에 이와 구분하기 위해 "리터럴"이라는 용어를 사용합니다. 즉, 리터럴은 기존에 알고 있던 상수의 다른 이름이라고 할 수 있습니다.
[변수 타입] [변수명] = [리터럴];
// 예시
int a = 123;
또한 리터럴은 값의 종류에 따라 아래와 같이 구분됩니다.
1. 정수 리터럴(byte, short, int, long, char)
- 소수점이 없는 리터럴은 10진수로 간주합니다.
- 0으로 시작하는 리터럴은 8진수로 간주합니다.
- 0x 또는 0X로 시작하고 0-9 숫자나 A, B, C, D, E, F 또는 a, b, c, d, e, f로 구성된 리터럴은 16진수로 간주합니다.
2. 실수 리터럴(float, double)
- 소수점이 있는 리터럴은 10진수 실수로 간주합니다.
- 대문자 E 또는 소문자 e가 있는 리터럴은 10진수 지수와 가수로 간주합니다.
3. 문자 리터럴(char)
- 작은따옴표(')로 묶은 텍스트는 하나의 문자 리터럴로 간주합니다.
4. 문자열 리터럴(String)
- 큰따옴표(")로 묶은 텍스트는 문자열 리터럴로 간주합니다.
5. 논리 리터럴(boolean)
- true와 false는 논리 리터럴로 간주합니다.
변수 선언 및 초기화하는 방법
1. 변수 선언
변수를 선언한다는 것은 메모리에 데이터를 저장할 공간을 지정해 주는 것입니다.
변수를 선언하는 방식은 아래와 같습니다. 변수가 선언되면 변수 타입에 해당하는 크기만큼 메모리에 용량이 할당됩니다.
[변수 타입] [변수명];
// 예시
int a;
[변수 타입]
변수에 저장될 값이 어떤 타입인지 지정
[변수 명]
변수를 선언하고 메모리에 저장되면 이 저장공간은 [변수명]을 통해 사용
1) 변수 명명 규칙
- 대소문자가 구분되며 길이에 제한은 없습니다.
- 숫자로 시작할 수 없습니다.
- 특수문자는 '_'와 '$'만 허용한다.
- 공백을 사용할 수 없습니다.
- 예약어를 사용할 수 없습니다. 예) if, for 등등
- 한글 변수명을 사용할 수 있지만 오류를 예방하기 위해 사용하지 않는 것을 추천한다.
2) 암묵적인 약속
- 클래스 명의 첫 글자는 대문자로 써야 한다.
- 여러 단어로 이루어진 경우 첫 번째 이후 단어의 첫 글자는 대문자로 써야 한다.
- 고정된 변숫값 상수의 이름은 모두 대문자로 써야 한다. 여러 단어일 경우 '_'로 구분한다.
2. 변수 초기화
변수를 사용하기 전 처음으로 값을 저장하는 것으로 명시적 초기화, 생성자 초기화, 초기화 블록을 활용하는 방법이 있습니다.
1) 명시적 초기화
변수 선언과 동시에 초기화합니다.
[변수 타입] [변수명] = [초기화할 값];
// 예시
int a = 0;
2) 생성자 초기화
인스턴스 생성 시에 생성자 함수 안에서 명시적 초기화가 이루어집니다.
// 기본생성자
TestClass test1 = new TestClass();
test.setA = 1;
test.setB = 'a';
test.setC = "테스트";
// 매개변수가 있는 생성자
TestClass test2 = new TestClass(1, 'a', "테스트");
3) 초기화 블록 활용
class TestClass{
static{
[클래스 초기화]
}
{
[인스턴스 초기화]
}
}
[클래스 초기화]
클래스 변수의 복잡한 초기화에 사용합니다. 블록 내에서는 로직도 추가할 수 있기 때문에 명시적 초기화만으로 부족할 때 사용합니다.
[인스턴스 초기화]
인스턴스 변수의 복잡한 초기화에 사용합니다. 모든 생성자가 공통으로 수행해야 하는 로직이 있을 때 사용합니다.
변수의 스코프와 라이프타임
변수의 스코프
스코프(scope)는 영역이라는 뜻으로, 변수에 접근하거나 접근할 수 있는 유효 범위/영역을 말합니다.
변수의 라이프타임
변수가 메모리에 살아있는 기간을 말합니다.
타입 변환, 캐스팅 그리고 타입 프로모션
타입 변환
- 선언된 하나의 타입을 다른 타입으로 변환하는 것을 말합니다. ( boolean 제외 )
- 다른 타입끼리 연산할 경우, 피연산자들을 모두 같은 타입으로 변환 후 연산이 진행됩니다.
- 메모리에서 할당받은 크기가 작은 타입에서 큰 타입으로의 타입 변환은 자동으로 이루어집니다.
- 메모리에서 할당받은 크기가 큰 타입에서 작은 타입으로의 타입 변환은 데이터 손실이 발생해 컴파일 에러가 발생할 수 있습니다. 데이터 손실을 감수하고 변환하려면 강제 타입 변환을 해야 합니다.
종류
자동 타입 변환 ( 묵시적 타입 변환 )
강제 타입 변환 ( 명시적 타입 변환 )
자동 타입 변환
대인 연산이나 산술 연산 등을 수행할 때 컴파일러가 자동으로 수행하는 타입 변환입니다.
메모리 크리가 작은 타입에서 큰 타입으로 변환
마무리
긴 글 봐주셔서 감사합니다!
오늘도 행복한 하루 보내세요 ✿'◡'✿
참고
자바의 구동 원리와 JVM(Java Virtual Machine)
[JAVA] JVM이란? 개념 및 구조 (JDK, JRE, JIT, 가비지 콜렉터...)
'🌜 Programming > JAVA' 카테고리의 다른 글
연산자 (0) | 2022.07.20 |
---|---|
JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2022.02.18 |
LocalDate 이번 달 시작일(1일) 및 마지막일 구하기 ( Java ) (0) | 2021.10.27 |