티스토리 뷰
프리미티브 타입 종류와 값의 범위 그리고 기본 값
- 총 8가지 기본형 타입.
- 기본값이 있기 때문에 Null이 존재하지 않는다. 만약 기본형 타입에 Null을 넣고 싶다면 래퍼 클래스를 활용.
- 실제 값을 저장하는 공간으로 스택 메모리에 저장.
- 만약 컴파일 시점에 담을 수 있는 크기를 벗어나면 에러를 발생시키는 컴파일 에러가 발생한다. 주로 문법상의 에러가 많다. 예를 들어 ;을 안붙였다는 이유로 빨간 줄이 쳐지는 경우.
프리미티브 타입과 레퍼런스 타입
- 기본형 타입을 제외한 타입들이 모두 참조형 타입.
- 빈 객체를 의미하는 Null이 존재.
- 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 힙 메모리에 저장.
- 문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생한다. 예를 들어 객체나 배열을 Null 값으로 받으면 NullPointException이 발생하므로 변수값을 넣어야 한다.
리터럴
프로그램에서 직접 표현한 값.
소스 코드의 고정된 값을 대표하는 용어.
종류
- 정수
- 실수
- 문자
- 논리
- 문자열
정수 리터럴
10진수, 8진수 16진수 2진수 리터럴이 존재한다.
int a = 15; ==> 10진수 리터럴
int b = 015; ==> 0으로 시작하면 8진수 리터럴
int c = 0x15; ==> 0x로 시작하면 16진수 리터럴
int d = 0b0101; ==> 0b로 시작하면 2진수
정수 리터럴은 int형으로 컴파일. long 타입 리터럴은 숫자 뒤에 L 또는 l을 붙여 표시한다.
실수 리터럴
소수점 형태나 지수 형태로 표현한 값.
실수 타입 리터럴은 double 타입으로 컴파일 된다.
숫자 뒤에 f(float)나 d(double)을 명시적으로 붙이기도 한다.(float은 꼭 f를 붙여줘야하고 double은 생략가능)
double f = 0.1234;
double g = 1234E-4;
※E는 10*(-4)
float h = 0.1234f;
double i = .1234D
문자 리터럴
단일 인용부호 (' ')로 문자를 표현.
char = 'H';
char b = "한";
char c = \uae00;(유니코드 값)
문자열 리터럴
문자열은 기본타입이 아니다.
(" ")로 문자열을 표현.
논리타입 리터럴, 외 리터럴
boolean a = true;
boolean b = 10>0;(true)
boolean c = 0;(0,1로 논리값 표현 불가)
int a = null;(프리미티브 타입에는 null 대입 불가)
String str = null(레퍼런스 타입에는 사용 가능).
변수의 스코프와 라이프타임
변수의 스코프
변수에 접근하거나 접근할 수 있는 유효 범위/영역.
{
...
.....
.....}
변수의 라이프타임
변수가 메모리에서 살아있는 기간
인스턴스 변수
클래스 내부에서 선언되었지만 메서드 및 블록 외부에서 선언 된 변수를 인스턴스 변수라고 한다.
- 스코프: 정적 메서드를 제외하고 클래스 전체
- 라이프타임: 클래스의 객체가 메모리에 남을 때까지
클래스 변수
클래스 내부, 모든 블록 외부에서 선언되고 static으로 선언된 변수를 클래스 변수라고 한다.
- 스코프: 클래스 전체
- 라이프타임: 프로그램이 종료 될때까지
지역 변수
인스턴스 또는 클래스 변수가 아닌 모든 변수를 지역 변수라고 한다.
- 스코프: 블록 내에서 선언.
- 라이프타임: 선언된 블록을 탈출하기 전까지
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;
}
public static void main(String args[]){
scope_and_lifetime ob = new scope_and_lifetime();
result = ob.add(10, 20);
System.out.println("Sum = " + result);
}
}
타입 변환, 캐스팅 그리고 타입 프로모션
타입 변환
하나의 타입을 다른 타입으로 바꾸는 것을 타입 변환이라고 한다.(type conversion)
자바에서는 boolean형을 제외한 나머지 기본 타입 간의 타입 변환을 자유롭게 수행할 수 있다.
자바에서 다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든 후에 수행됩니다.
메모리에 할당받은 바이트의 크기가 상대적으로 작은 타입에서 큰 타입으로의 타입 변환은 생략할 수 있다.
하지만 메모리에 할당받은 바이트의 크기가 큰 타입에서 작은 타입으로의 타입 변환은 데이터의 손실이 발생한다.
따라서 상대적으로 바이트의 크기가 작은 타입으로 변환을 할 경우 자바 컴파일러는 오류를 발생시킨다.
타입 변환의 종류
- 묵시적 타입 변환(자동 타입 변환)
- 명시적 타입 변환(강제 타입 변환)
묵시적 타입 변환(자동 타입 변환, 프로모션)
대입 연산이나 산술 연산에서 컴파일러가 자동으로 수행해주는 타입 변환을가리킵니다.자바에서는 데이터의 손실이 발생하지 않거나, 데이터의 손실이 최소화되는 방향으로 묵시적 타입 변환을 진행합니다.
또한, 자바에서는 데이터의 손실이 발생하는 대입 연산은 허용하지 않습니다.
byte형 → short/char형 → int형 → long형 → float형 → double형
double num1 = 10; // double > 10(int) 이므로 자동 형변환이 일어난다.
int num2 = 3.14; // int<float이므로 데이터의 손실이 일어나므로 컴파일 오류가 발생한다.
명시적 타입 변환(강제 타입 변환)
명시적 타입 변환이란 사용자가 타입 캐스트를 사용하여 강제적으로 수행하는 타입 변환을 의미.
int num=1;
double ans = (double)num // 캐스팅을 통해 int를 double로 형변환
타입 추론, var
타입 추론
타입 추론이란 코드 작성 당시 타입이 정해지지 않았지만, 컴파일러가 그 타입을 유추하는 것.
JAVA 10 이상으로 타입 추론을 지원하는 var 키워드가 추가되었다. 이 키워드는 local variable 이면서 선언과 동시에 초기화가 필수적으로 요구된다.
var name = "hihihi";
System.out.println(name.getclass().getName()); // java.lang.String으로 출력된다.
/**var과 다이아몬드 연산자를 같이 사용하게 되면 컴파일 에러가 발생 */
var name = new ArrayList<>(); // error
'[백기선live-study]' 카테고리의 다른 글
3주차 과제: 연산자 (0) | 2021.01.10 |
---|---|
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2021.01.08 |