자바의 데이터 타입
자바의 데이터 타입은 크게 기본 타입(Primitive type)과 참조 타입(Reference type)으로 구성된다.
- 기본 타입 (Primitive type)
- 정수
- byte (1 byte)
- char (2 byte)
- short (2 byte)
- int (4 byte)
- long (8 byte)
- 실수
- float (4 byte)
- double (8 byte)
- 논리
- boolean (1 byte)
- 정수
- 참조 타입 (Reference type)
- 배열 타입
- 열거 타입
- 클래스
- 인터페이스
데이터 타입에 대해 제대로 이해하고 있어야 메모리에 어떻게 적재되는냐도 생각 할 수있다.
기본타입 (Primitive type)
Java의 기본 타입은 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입을 말한다.
메모리에 0과 1을 저장하는 최소 기억 단위인 비트(Bit)가 있다. 8개의 비트는 바이트(btye)를 의미한다.
기본 타입은 각 타입별 메모리 크기가 정해져있다. 타입별 메모리 크기를 기억하고 있어야 대략적인 범위를 고려할 수 있다.
고려하지 않는다면 overflow 를 맞닿게 될 것이며, overflow란 저장되는 값이 타입의 메모리 크기보다 over 했을때 나타나는 현상이다.
참조 타입 (Reference type)
Java의 참조 타입은 객체의 주소를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입을 의미 한다.
기본 타입은 변수의 실제값을 저장하지만, 참조 타입은 메모리의 주소를 값을 저장한다. 즉, 메모리 주소 값을 참조한다는 의미이다. 메모리는 Heap 영역을 의미하며, Heap 영역에 값이 저장된다.
리터럴 (Literal)
변수의 초기값은 코드에서 직접 입력하는 경우가 많은데, 소스 코드 내에서 직접 입력된 값을 리터럴(Literal) 이라고 부른다.
리터럴의 값은 종류에 따라 정수 리터럴, 실수 리터럴, 문자 리터럴, 논리 리터럴로 구분되며, 정해진 표기법대로 작성해야 된다. 사실 리터럴은 상수(Constant)와 같은 의미지만 상수는 “값을 한 번 저장하면 변경할 수 없는 변수”이기 때문에 구분되어 리터럴이란 용어로 사용한다. (Kotlin 에서는 val와 var를 구분으로 보면된다.)
- 정수 리터럴 (byte, char, short, int, long)
- 소수점이 없는 정수 리터럴은 10진수로 간주한다.
- 0으로 시작되는 리터럴은 8진수로 간주한다.
- 0x(0X)로 시작하고 A,B,C,D,E,F로 구성된 리터럴은 16진수로 간주한다.
- 실수 리터럴 (float, double)
- 소수점이 있는 리터럴은 10진수로 간주한다.
- E(e) 가 있는 리터럴은 10진수 지수와 가수로 간주한다.
- 싱글 쿼테이션(’)로 묶은 텍스트는 하나의 문자로 간주한다.
- 역슬래쉬 (\)가 붙은 문자 리터럴은 이스케이프(escape) 문자라고 한다.문자 리터럴 (char)
- 문자열 리터럴 (String)
- 더블 쿼테이션(”) 으로 묶은 텍스트는 문자열 리터럴로 간주한다.
- 논리 리터럴 (boolean)
- true, false로 구성.
변수의 Scope(범위), LifeTime (수명)
변수의 Scope(범위)란 해당 변수를 사용 가능한 범위를 의미한다.
변수의 LifeTime(수명)은 메모리에서 변수가 언제 삭제되느냐를 의미한다.
인스턴스 변수, 클래스 변수, 지역 변수에 따라 scope와 LifeTime은 달라진다. 위 자료를 기준으로 재 정리를 하면,
public class scope_and_lifetime {
int num1, num2; //Instance Variables
static int result; //Class Variable
int add(int a, int b){ //Local Variables
num1 = a;
num2 = b;
return a+b;
}
}
- 인스턴스 변수
- Scope
- static method를 제외한 모든 클래스
- LifeTime
- 클래스의 객체가 메모리에 남아있을때 까지
- Scope
- 클래스 변수
- Scope
- class 안에서 선언되고, 메서드나 블록안에서 선언되지 않으며, static 키워드로 선언된 변수는 선언된 클래스 전체에서 범위를 가진다.
- LifeTime
- 프로그램 종료 까지
- Scope
- 지역 변수
- Scope
- 선언된 블록 내의 범위
- LifeTime
- 선언된 블록 내부를 프로그램이 실행되는 동안
- Scope
타입 변환, Casting 그리고 Type Promotion
타입 변환이란 데이터 탕비을 다른 데이터 타입으로 변환하는 것을 말한다.
Java에서는 자동 타입 변환(Promotion), 강제 타입 변환 (캐스팅, Casting) 으로 자동(묵시적) 타입 변환과 강제(명시적) 타입 변환을 진행한다.
- 자동 타입 변환 (Type Promotion)
- 작은 크기 타입을 큰 크기의 타입에 저장 할때 발생한다.
- byte(1) < short(2) < int(4) < long(8) < float(4) < double(8) float가 long보다 큰 타입인 이유는 표현할 수 있는 값의 범위가 float가 더 크다.
byte bVal = 10; int iVal = bVal; // Type Promotion
- 강제 타입 변환 (캐스팅, Casting)
- 큰 크기의 타입을 작은 크기의 타입으로 자동 타입 변환을 할 수 없다. 캐스팅 연산자 () 를 사용하여 타입을 쪼갠다. 개인적으로 생각하기로는 java에서 기능적으로 책임질 수 없으니 개발자가 메모리 릭에 대한 부분을 책임을 가지는거 같다.
int iVal = 103029770; byte bVal = iVal; // Casing // 00001010 (2진수) = 10 (10진수)
타입 추론, var
타입 추론이란 개발자가 변수의 타입을 명시적으로 선언하지 않아도 컴파일러가 알아서 변수의 타입이 저장된 리터럴의 값으로 추론하는 것이다. Kotlin 및 자바스크립트, 스위프트 에서 사용한다. 무지하게 편하다. (Java는 10 부터 타입 추론이 가능하다. LTS 버전이 11이니 jdk11에서 익숙해졌을 거라고 생각한다.)
- var는 초기화 값이 있는 지역변수(Local Vairable)로만 선언이 가능하다.
- 즉, 선언시 초기화 값이 있어야한다.
- var는 키워드(KeyWord)가 아니다.
- var는 어떠한 타입도 아니고, 클래스가 사용할 수 있는 예약어가 아니라는 의미이다.
- var는 컴파일시 알아서 타입이 선언되는 구조이기 때문이다.
- var는 런타임 오버헤드가 없다.
- var는 타입 추론에서 타입을 결정한다. 그래서 var로 선언된 변수는 타입이 중간에 변경되지 않는다.
사실 java에서 (코틀린 말고) var를 활용하기는 쉽지 않다. 타입 추론이라고 하지만 사실 타입을 명확히 입력하는게 java에서는 나을거 같다.
하지만, 람다 익스프레션에서는 아래와 같이 사용할 수 있다.
Consumer<String> consumer = (@NonNull var s) -> funName(s);
이렇게 이번편 정리는 끝.
'Delvelopment > Java' 카테고리의 다른 글
[Java] System.identityHashCode()와 hashCode() 차이 (0) | 2022.01.21 |
---|---|
JUnit이란? JUnit5 (Assertion, 어노테이션) (0) | 2022.01.14 |
[JAVA] 산술, 비트, 관계, 논리, 3항, 화살표 연산자, java14 switch 문 (0) | 2022.01.06 |
[JAVA] JVM의 구성요소 및 동작원리 (0) | 2021.12.26 |
[Java] String, StringBuilder, StringBuffer 차이, 사용하기. 알고쓰자! (1) | 2021.06.25 |
댓글