자바 데이터 타입, 변수
목표
- 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
학습할 내용
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 프리미티브 타입과 레퍼런스 타입
- 리터럴
- 변수 선언 및 초기화하는 방법
- 변수의 스코프와 라이프타임
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 타입 추론, var
프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 기본형 타입(Primitive Type)
- 총 8가지의 기본형 타입을 미리 정의하여 제공
- 기본값이 있기 때문에 null이 존재하지 않는다.
- 실제 값을 저장하는 공간으로 스택 메모리에 저장
-
종류
타입 할당되는 메모리 크기 기본값 데이터의 표현 범위 boolean 1 byte false true, false byte 1 byte 0 -128 ~ 127 short 2 byte 0 -32,768 ~ 32,767 int 4 byte 0 -2,147,483,648 ~ 2,147,483,647 long 8 byte 0 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 float 4 byte 0.0f (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값 double 8 byte 0.0 (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값 char 2 byte \u0000 0 ~ 65,535
프리미티브 타입과 레퍼런스 타입
- 참조형 타입 (Reference Type)
- 기본형 타입을 제외한 타입들은 모두 참조형 타입
- null이 존재한다.
- 값이 저장되어 있는 곳의 주소값이 저장하는 공간으로 Heap 메모리에 저장된다.
- 문법상으로는 에러가 없지만 실행시켰을 때 런타임 에러가 발생할 수 있다.
-
종류
타입 기본값 할당되는 메모리 크기 배열(Array) Null 4 byte(객체의 주소값) 열거(Enumeration) Null 4 byte(객체의 주소값) 클래스(Class) Null 4 byte(객체의 주소값) 인터페이스(Interface) Null 4 byte(객체의 주소값)
- Primitive Type 과 Reference Type 출처: https://gbsb.tistory.com/6
리터럴(literal)
- literal은 데이터 그 자체로 변수에 넣는 변하지 않는 데이터를 의미한다.
- ex)
int num = 1; // num은 변수고, 1이 리터럴이다.
- 정수 리터럴
- 모든 임의의 정수 값은 정수 리터럴이다.
- 모든 정수형 데이터가 기본적으로 int이기 때문에 long리터럴이면 숫자 뒤에 L 또는 l을 붙인다.
- byte, short 변수에 숫자를 저장할 때에는 숫자 범위가 해당 테이터의 자료형에 포함되면 에러가 발생하지 않는다.
- 진수를 사용할 수 있다.
- 부동 소수점
- 소수점 이하를 가진 10진 값
- double형은 부동 소수점의 기본형, 숫자 뒤에 d 또는 D를 추가할 수 있다.
- boolean
- 논리적인 값: 참(true) / 거짓(false)를 갖는다.
- 문자(character)
- 자바에서는 모든 몬자들은 Unicode를 사용한다.
- 문자열(String)
변수 선언 및 초기화하는 방법
- 변수 선언
int a; Student student;
- 저장공간을 확보하겠다는 의미
- primitive type에 경우 초기값이 저장되고 reference type은 null값이 저장된다.
- 초기화
a = 10; student = new Stuent();
- 저장공간에 원하는 값을 의미한다.
변수의 스코프와 라이프타임
- 스코프
- 해당 변수를 사용할 수 있는 영역 범위
- 스코프에 따라 instance, class, local 변수로 나눈다.
- instance variables
- 클래스 안에서 선언되고, 어떠한 method나 block안에 선언되지 않은 변수
- scope: static method를 제외한 클래스 전체
- lifetime: 클래스를 인스턴스화한 객체가 메모리에 사라질 때 까지
- class variables
- 클래스 안에서 선언되고, 어떠한 메서드나 블럭안에서 선언되지 않았으며, static 키워드가 포함되어 선언된 변수
- scope: 클래스 전체
- lifetime: 프로그램 종료시 까지
- local variables
- 인스턴스 변수, 클래스 변수가 아닌 모든 변수
- scope: 변수가 선언된 block 내부
- lifetime: control이 변수가 선언된 block 내부에 있는 동안
public class VariableEx { int num1, num2; // instance variables static int result; // class variables public int add(int a, int b) { // local variables return a + b; } }
- 라이프 타입
- 해당 변수가 메모리에 언제까지 살아있는지를 의미
타입 변환, 캐스팅 그리고 타입 프로모션
- type casting
- 더 큰 자료형을 크기가 더 작은 자료형에 대입
- 강제 형 변환을 해야하며(type), 데이터 크기가 작아지기 때문에 데이터 손실이나 변형이 올 수 있다.
- ex) long -> int
long a = 10L; int b = (int)a;
- type promotion
- 타입 캐스팅과는 밴대로 작은 자료형에서 큰 자료형으로 대입
- 자동으로 변환 가능하며 데이터 크기가 커지기 때문에 손실이나 변형이 발생하지 않는다.
- ex) int -> long
int a = 10; long b = a;
- reference type에서의 type casting과 type promotion
- reference에서는 상속관계 가능하다.
- type casting: 부모 인스턴스를 자식 인스턴스의 대입
- 부모 클래스로 생성한 객체를 자식 객체에 강제 형변환하는 경우 오류 발생한다.
Person p = new Person(); Student s = (Student)p; // java.lang.ClassCastException 오류 발생
- 부모 클래스지만, 자식 클래스로 변환하여 생성한 객체는 자식 객체로 강제 형변환이 가능하다.
Person p = new Student(); Student s = (Student)p;
- 부모 클래스로 생성한 객체를 자식 객체에 강제 형변환하는 경우 오류 발생한다.
- type promotion: 자식 인스턴스를 부모 인스턴스의 대입
Student s = new Student(); Person p = s;
타입 추론, var
- 타입추론이란 데이터 타입을 소스코드에 명시하지 않고, 컴파일 단계에서 컴파일러가 타입을 유추하는 것
- 5 버전 이후 Generic, 8 q버전 이후 lamda 에서 타입추론이 되며, 10 버전부터는 var라는 local variable type-inference가 추가되었다.
var str = "hello"; // String str = "hello"; var b = 10; // int b = 10;