변수의 타입 값의 범위
프리미티브 타입
자바에서는 자료형은 크게 기본형(primitive type)과 참조형(reference type)으로 나눌 수 있으며 그중에서 기본형은 실제의 값을 저장하고 연산에 사용되며 8개의 타입이 존재합니다.
레퍼런스 타입
참조형은 실제로 값이 저장되어있는 주소를 저장 값으로 클래스, 인터페이스, 배열, enum등이 있습니다.
public static void main(String[] args) {
String str = new String("Hello");
}
str
이라는 변수명의 String 클래스가 있고 new 키워드를 통해 객체를 인스턴스화 하였습니다. 이때 str의 변수에는 힙 영역에 저장된 객체의 주소 값이 저장됩니다..
리터럴
리터럴은 변수나 상수에 저장되는 값 자체를 말합니다.
int num = 100;
final int CAT_COUNT = 5;
위에서 100이나 5가 리터럴입니다.
리터럴은 타입에따라 ㅌㅌㅌㅌㅌㅌ 한다.
정수형 리터럴
정수형의 경우 long타입에는 접미사 l,L을 붙이고 접미사가 없으면 int형이며 10진수 외에도 2, 8, 16진수로 표현한 리터럴을 저장할 수 있습니다.
int num = 10;
int binaryNum=0b10; //접두사 0b는 2진수로 값은 2
int octNum=010; //접두사 0은 8진수로 값은 8
int hexNum= 0x10; //접두사 0x는 16진수로 값은 16
JDK1.7부터는 정수형 리터럴에 중간에 구분자로 '_'을 넣어 숫자를 편하게 읽을 수 있습니다.
int index = 100_000_000; //100000000
실수형 리터럴
실수형의 경우 double타입에는 d,D를 붙이고 float타입에는 접미사 f,F를 붙이며 기본형인 double은 접미사를 생략 가능합니다.
double d = 1.4;
float pi = 3.14f;
논리형 리터럴
true, false로 표현합니다.
boolean flag = true;
문자형 리터럴
작은따옴표('')로 문자를 표현하며 빈 공백이 들어올 수 없습니다.
char c = 'A';
문자열 리터럴
큰따옴표로 문자열을 표현합니다.
String str = "Hello";
변수 선언과 초기화
선언
//변수타입 변수명;
int num; //num이라는 이름의 int형 변수를 선언
num이라는 이름의 int형 변수를 선언하겠다는 의미입니다.
초기화
변수를 선언하고 초기화를 하지 않으면 기존에 메모리에 저장되어 있던 쓰레기 값이 들어있어서 반드시 초기화해야 합니다.
변수에 값을 저장할 때는 대입연산자'='를 사용합니다.
int num; //선언
num = 10; //변수 num을 10으로 초기화
int num2 = 10; // 선언과 초기화를 한 번에 할 수 있습니다.
변수의 스코프와 라이프타임
변수는 일반적으로 중괄호{} 범위에서 사용 가능합니다.
인스턴스 변수
클래스 내에 선언되어 있고 메소드나 블럭 안에서 선언되지 않은 변수입니다.
static 메소드를 제외한 클래스 전체에서 사용 가능하며 인스턴스가 생성될 때 생성되어 인스턴스가 메모리에서 해제될 때 까지 사용 가능합니다.
클래스 변수
인스턴스 변수에 static이 붙어있는 변수로 클래스가 메모리에 올라갈 때 생성되어 프로그램이 종료될 때까지 사용 가능한 변수입니다.
지역 변수
메소드 내에 선언되어 메소드 내에서만 사용 가능한 변수로 메소드가 실행될 때 메모리를 할당받아 메소드가 종료되면 사용할 수 없게 됩니다.
public class Cal {
int num; //인스턴스 변수
static int num2; //클래스 변수
public int getDoubleNum(int a) { //지역변수
num = a;
return num * 2;
}
}
타입변환
타입을 변환해주는 것을 타입 변환이라고 하며 자바에서는 boolean을 제외한 나머지 기본형에서 자유로운 타입 변환을 할 수 있습니다. 이때 주의해야 할 점은 메모리에서 할당받은 바이트의 크기가 큰 타입에서 작은 타입으로의 변환은 데이터 손실이 발생합니다.
캐스팅
명시적 형변환
이라고도 하며 크기가 큰 자료형을 작은 자료형으로 변환할떄 자료형을 명시하여 형변환을 하는 것을 말하며 이 과정에서 데이터의 손실이 발생할 수 있습니다.
int c = 1000;
byte d = (byte) c;
System.out.println(d); //-24
프로모션
묵시적 형변환
이라고도 하며 크기가 작은 자료형을 큰 자료형으로 변환할 때 컴파일러가 자동적으로 형변환을 해줍니다.
int a = 10;
long b = a;
System.out.println(b); //10
byte -> short -> int -> long -> float - > double
char ↗
타입추론
타입이 정해지지 않은 변수의 타입을 컴파일러가 유추하는 것으로 제너릭과 람다에 대한 타입 추론을 말합니다.
var
자바 10부터는 타입 추론을 지원하는 var
키워드가 추가되었습니다. var는 로컬 변수 이면서 선언과 동시에 초기화가 필수로 요구되는 키워드입니다.
var num = 3;
var str="hello";
var apple; // cannot use 'var' on variable without initializer
var num1 = 2, num2 = 3; // 'var' is not allowed in a compound declaration
var[] arr = new int[5]; // var' is not allowed as an element type of an array
var use = { 6 }; // array initializer needs an explicit target-type
1차, 2차 배열 선언하기
배열
같은 타입의 데이터를 연속된 공간에 저장하기 위한 자료구조입니다. 배열의 인덱스는 배열의 요소마다 붙는 번호로 0부터 시작합니다.
1차 배열 선언
타입[] 변수명; //배열 선언
타입 변수명[];
변수명 = new 타입[길이]; // 배열 생성
int[] arr = {};
int[] arr2 = new int[3];
int[] arr3 = new int[3]{1,2,3};
2차 배열 선언
2차원 배열의 선언은 1차원과 동일하며 대괄호[]가 하나 더 추가되면 됩니다.
타입[][] 변수명; //배열 선언
타입 변수명[][];
변수명 = new 타입[길이][길이]; // 배열 생성
int[][] arr = {};
int[][] arr2 = new int[3][3];
int[][] arr3 = new int[3][3]{{1,2,3},{4,5,6},{7,8,9}};
참고 문서
Java의 정석 - 남궁 성
http://www.tcpschool.com/java/intro