Variable이란?
자료를 저장하기 위한 메모리 공간으로 타입에 따라 크기가 달라짐
메모리 공간에 값을 할당 후 사용
Type이란?
데이터의 종류
- 기본형(primitive type) : 미리 정해진 크기의 Memory Size로 표현, 변수 자체에 값 저장
- 참조형(reference type) : 크기가 미리 정해질 수 없는 데이터의 표현, 변수에는 실제 값을 참조할 수 있는 주소만 저장
기본형(primitive type)의 크기
- 논리형 : boolean
- 정수형 : byte(8bit), short(16bit), int(32bit), long(64bit, 뒤에 l이나 L을 붙여 명시한다)
- 실수형 : float(32bit, 뒤에 f를 붙여 명시한다), double(64bit)
-
문자형 : char(16bit)
- byte(1byte) < short(2byte) < int(4byte) < long(8byte)
- float(4byte) < double(8byte)
-
⭐ float(4byte) > long(8byte)
- 정수 계산 시 overflow 주의
- 필요한 수의 크기를 고려해서 int 또는 long등 타입 선택
실수의 연산은 정확하지 않다.
- 유효 자리수를 이용한 반올림 처리
참조형(reference type)
- class, 배열
형변환(Type casting)이란?
변수의 타입을 다른 타입으로 변환하는 것
primitive는 primitive끼리, reference는 reference끼리 형 변환 가능
- boolean은 다른 기본 타입과 호환되지 않음
- 기본 타입과 참조형의 형 변환을 위해서 Wrapper 클래스 사용
형 변환 방법
- 형 변환 연산자(괄호) 사용
기본형의 형 변환 진행
- 묵시적 형 변환(Automatic Promotion, Implicit Type Casting)
작은 데이터 타입에서 큰 데이터 타입으로 변환, 데이터가 손실되지 않음 - 명시적 형 변환(Explicit Type Casting)
큰 데이터 타입에서 작은 데이터 타입으로 변환, 데이터가 손실됨
identifier = (target_type)value;<br> - 값의 크기, 타입의 크기가 아닌 타입의 표현 범위가 커지는 방향으로 할당할 경우는 묵시적 형변환 발생
- 명시적 형 변환은 값 손실이 발생할 수 있으므로 프로그래머 책임하에 형 변환 진행
- 묵시적 형 변환은 자료의 손실 걱정이 없으므로 JVM이 서비스 해줌
연산자란?
어떤 기능을 수행하는 기호
연산자 종류와 우선순위 및 결합 방향
byte b1 = 10;
byte b2 = 20;
// byte b3 = b1 + b2;
// Type mismatch: cannot convert from int to byte
byte b3 = (byte)(b1 + b2);
int i1 = 10;
long l1 = 20;
// int i2 = i1 + l1;
// Type mismatch: cannot convert from long to int
int i2 = i1 + (int)l1;
// float f1 = 10.0;
// Type mismatch: cannot convert from double to float
float f1 = 10.0f;
// float f2 = f1 + 20.0;
/* Multiple markers at this line
-Type mismatch: cannot convert from double to float
-f1 cannot be resolved to a variable */
double f2 = f1 + 20.0;
- 산술 이항 연산자는 연산 전에 피 연산자의 타입을 일치시킨다.
- 피연산자의 크기가 4byte(int) 미만이면 int로 변경한 후 연산 진행
- 두 개의 피연산자 중 큰 타입으로 형 변환 후 연산 진행
위치에 따른 변수의 종류
- 멤버 변수 : 클래스 멤버 변수(클래스 영역, static keyword), 인스턴스 멤버 변수(클래스 영역)
- 지역 변수 : 지역 변수(함수 내부), 파라미터 변수(함수 선언부)
지역 변수 & 파라미터 변수
- 선언 위치 : 클래스 영역의 {}이외의 모든 중괄호 안에 선언되는 변수들
- 메서드, 생성자, 초기화 블록
void call(String to){ // 파라미터 변수 String beep = "띠"; // 로컬 변수 for(int i=0; i<3; i++){ // 로컬 변수 System.out.println(beep); } }
- 메서드, 생성자, 초기화 블록
- 변수의 생성 : 선언된 라인이 실행될 때
- 생성 메모리 영역 : thread 별로 생성된 stack 영역
- 변수의 초기화 : 사용하기 전 명시적 초기화 필요
- 변수에의 접근 : 외부에서는 접근이 불가하므로 소속 불필요
- 내부에서는 이름에 바로 접근
- 소멸 시점 : 선언된 영역인 {}을 벗어날 때
멤버 변수
인스턴스 멤버 변수의 특징
- 선언 위치 : 클래스 {}영역에 선언
public class Person{ String name; int age; } - 변수의 생성 : 객체가 만들어질 때 객체 별로 생성됨
- 생성 메모리 영역 : heap
- 변수의 초기화 : 타입 별로 default 초기화
- 변수에의 접근 : 객체 생성 후(메모리에 올린 후) 객체 이름(소속)으로 접근
- 객체를 만들 때마다 객체 별로 생성 -> 객체마다 고유한 상태(변수 값) 유지
- 소멸 시점 : Garbage Collector에 의해 객체가 없어질 때 프로그래머가 명시적으로 소멸시킬 수 없음
클래스 멤버 변수의 특징(static 멤버)
- 선언 위치 : 클래스{}영역에 선언되며 static 키워드를 붙임
public class Person{ static String scientificName = "Homo Sapiens"; String name; } - 변수의 생성 : 클래스 영역에 클래스 로딩 시 메모리 등록
- 개별 객체의 생성과 무관
- 모든 객체가 공유하게 됨(공유 변수라고도 불림)
- 변수의 초기화 : 타입 별로 default 초기화
- 변수에의 접근 : 객체 생성과 무관하게 클래스 이름(소속)으로 접근
- 객체를 생성하고 객체 이름으로 접근도 가능하나 static에 부합한 표현은 아님
- 소멸 시점 : 프로그램 종료 시
- 정적 : 거의 바뀌지 않음