프리미티브 타입(primitive type)은 메모리 공간에 직접 데이터를 담는 타입의 데이터 타입이다.
primitive type | 타입 | 메모리 | 기본값 | 범위 |
---|---|---|---|---|
정수형 | 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 | 0L | -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 308)의 근사값 | |
문자형 | char | 2 byte(유니코드) | '\u0000' | 0 ~ 65.535 |
논리형 | boolean | 1 byte | false | ture, false |
자바의 데이터 타입은 크게 프리미티브(primitive)타입과 레퍼런스(refernce) 나눠 진다. 이 둘의 가장 큰 차이로는 메모리를 참조 or 메모리공간에 직접 대입이다.
각각의 타입으로 변수를 선언시 그에 해당하는 메모리를 받게되는데 이 때 프리미티브 타입은 할당받은 메모리에 직접 변수를 담고 레퍼런스 타입은 다른 곳을 참조하는 주소값을 담는다.
(참조 이미지 링크:https://kingpodo.tistory.com/54)
리터럴이란 프로그램에서 직접적으로 표현되는 상수 값을 말한다. 실제로 저장되는 값 그 자체로 메모리에 저장되어 있는 변하지 않는 값이다. 간단하게 코드내에서 직접 쓴 값이라고 생각하면 편하다.
리터럴의 종류로는 정수, 실수, 문자, 문자열, 논리형 등이 있다.
int int_v1 = 0b10; // ->2진수
int int_v2 = 010; // ->8진수
int int_v3 = 10; // ->10진수
int int_v4 = 0x10; // ->16진수
long long_v1 = 10L; // ->long타입 리터럴
//실수 타입 리터럴은 double타입으로 컴파일 되므로
//float타입일 경우 f or F를 명시
float float_v1 = 1.1234F;
double double_v1 = 1.234;
double double_v2 = 1.234d;
double double_v3 = 1234E-3d
char char_v1 = 'C';
char char_v2 = '유';
boolean boolean_v1 = true;
boolean boolean_v2 = 12 > 34;
String string_v1 = 'hello world!';
//모든 우항을 리터럴 이라고 부른다.
int num;
변수 선언
int num = 1;
변수 초기화
변수를 선언 하고 처음으로 값을 저장하는 것을 변수 초기화 라고 한다. 경우에 따라 변수 선언 후 바로 초기화를 할수도, 안 할수도 있지만 가능하다면 선언과 동시에 초기화를 하는 것이 바람직하다 멤버 변수는 초기화 하지 않아도 변수의 타입에 맞는 기본값으로 초기화가 가능하지만 지역 변수는 선언 후 사용하기 전에 반드시 초기화가 이루어져야 한다
class Init{
int num;
int sum = num; //인스턴스 변수
void method(){
int x; //지역 변수
int y = x; // 에러(x 초기화 후 y에 초기화 가능)
}
}
//컴파일러는 초기화 되지 않은 지역 변수에 기본값을 할당하지 않기 때문에 컴파일 타임 오류가 발생한다.
변수의 스코프(영역)이란?
변수에 접근하거나 접근할 수 있는 유효 범위/영역
일반적인 규칙은 변수가 선언된 블록내에서만 액세스 할 수 있다
{ var num = 10 ... }
public class Varcope{
int num = 10;
public static void main(String[] args){
int num = 20;
System.out.println(num);
}
}
위 코드를 실행하면 num의 값은 20으로 출력된다.
int num = 20;
main 블록 안에 이 문장이 없다면?
num의 값은 10으로 출력이 된다.
즉 호출된 순간 블록 내의 변수를 찾고 없다면 그 밖의 블록에서 변수를 참조하는 규칙이다.
변수의 라이프 타임(Life Time)이란?
변수가 메모리에서 살아있는 시간
지역변수 해당되는 블록 시작지점에서 종료지점까지 유효하다.
매개변수 해당되는 메소드 시작지점에서 메소드 종료지점까지 유효하다.
int sum(int num){//매개변수
int num2;//지역변수
}
인스턴스 변수 클래스 안, 메소드/블럭 밖에서 선언된 변수이며 클래스의 인스턴스가 생성되고 참조될때까지 유효하다.
public class Life{
int var; //인스턴스 변수
{
int localVariable; //지역변수
}
int helloLife(int time){ //매개변수
int time; //지역변수
}
}
public class Lifes{
public static void main(String[] args){
Life now = new Life();//인스턴스 생성 now.time 생성됨
now = null; //Life class 참조 해제
//GC...now.time소멸
}
}
클래스 변수 데이터 타입 앞에 static을 붙여 정적 데이터로 JVM이 클래스를 참조하여 프로그램이 실행된 후부터 종료 될때까지 유효하다.
public calss Life{
static int classV = 10;
public static void main(String[] args){
System.out.println(classV); //결과값 : 10
}
}
자바를 포함한 여러 프로그래밍 언어에는 데이터 타입을 변환해주는 캐스트 연산자가 존재한다.
캐스트 연산자를 이용한 타입 변환에는 두 가지로 설명 할 수 있다.
타입 캐스팅은 저장 공간이 큰 데이터를 작은 데이터로 형 변환시 사용되는 기법이다.
자동 형 변환이 불가능하여 개발자가 명시적으로 선언을 해줘야 형 변환이 이루어진다.
public class Type{
public static void main(String[] args){
int casting = 10;
byte ref = casting; // 에러 발생
byte ref = (byte)casting //명시적 형 변환 (casting) 실행가능
}
}
타입 프로모션은 저장 공간이 작은 데이터를 저장 공간이 큰 데이터로 형 변환하는 것을 뜻한다.
작은 데이터가 큰 데이터로 변환 되는 과정은 자동으로 변환되어 저장이 가능하기 때문에 개발자가 따로 명령을 선언할 필요가 없다.
public class Type{
public static void main(String[] args){
int promo = 10;
long ref = promo; //실행 가능
}
}
자동 형 변환이 되는 데이터 크기의 순서는 이렇다.
byte(1) < short(2) < int(4) < long(8) < float(4) < double(8) (byte)
여기서 왜 8바이트인 long이 4바이트인 float으로 자동 형 변환이 가능한 것일까?
float은 부동 소수점으로 인한 표현 크기가 더 크기 때문이다.
배열이란?
배열의 선언
int[] Arr = new int[10]; //선언과 동시에 메모리 크기 할당
int[] Arr = {1, 2, 3, 4, 5}; //선언과 동시에 값을 대입
int[] Arr;
선언과 동시에 메모리 크기를 할당할 수 있고 값을 선언하며 초기화도 가능하다.
선형 자료구조의 하나로 동일한 타입의 데이터를 연속적으로 저장하여 하나의 변수로 묶어서 관리하기 위한 자료구조
class Arr{
int[] integerArr;
int intergerArr[]; //크기 할당, 초기화 없이 참조 변수만 선언
int[] integerArr = new int[10]; //선언과 동시에 배열의 크기까지 할당
int[] integerArr = {1, 2, 3, 4, 5}; //선언과 동시에 크기 할당 및 초기화
}
calss Arr2{
int[][] integerArr2 = new int[5][5];
int[][] integerArr2 = {{1,2,3},{4,5,6},{7,8,9}};
}
2차원 배열은 행렬을 응용한 문제를 해결하거나 2차원내에서 어떤 문제들을 해결할 때 등 여러가지로 활용된다.
ex)
0 0 0 0 0 0 = {{0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,0},{0,0,0,0,0,1}}
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1
자바 10 버전부터 타입 추론 기능이 추가되었다.
소스코드에 타입을 명시하지 않아도 컴파일러가 컴파일 과정에서 데이터의 타입을 유추하는 기능이다. method 호출 및 선언과 variable 혹은 object 선언을 통해 실제 타입을 추론하는 형식이다.
var a = "hello" // String a = "hello"로 유출
var b = 10 // int a = 10으로 유출
참고 URL
https://gbsb.tistory.com/6
https://blog.naver.com/hsm622/222144931396
https://league-cat.tistory.com/411