♨학습내용
☞ 프리미티브 타입 종류와 값의 범위 그리고 기본 값
☞ 프리미티브 타입과 레퍼런스 타입
☞ 리터럴
☞ 변수 선언 및 초기화하는 방법
☞ 변수의 스코프와 라이프타임
☞ 타입 변환, 캐스팅 그리고 타입 프로모션
☞ 1차 및 2차 배열 선언하기
☞ 타입 추론, var
- 프리미티브 타입 종류와 값의 범위 그리고 기본 값
- Primitive Type이란?
- 간단하게 말하면, 여러 형태의 타입을 미리 정의하여 제공하는데, 이것을 Primitive Type(기본타입)이라고 한다.
- Primitive Type의 종류와 값의 범위
1. 논리형 (boolean)
- 참/거짓을 판별하는데 주로 사용하는 것이 논리형 변수이다.
- 어떤 조건을 주어서 그 조건이 참이면 true를 저장, 거짓이면 false를 저장한다.
- boolean Type의 기본값은 false다.
2. 문자형 (char)
- char는 한 글자의 문자를 저장한다.
- char형은 ASCII 코드에 의거하여 숫자로 저장된다.
- char Type의 기본값은 '\u0000'이다.
3. 정수형 (byte, short, int, long)
- int는 컴파일러는 기본적으로 정수 리터럴을 int 타입으로 간주한다.
- long 타입의 값에는 접미사 'L' 또는 'l'을 반드시 붙여야한다. 그렇지 않으면 int 타입으로 간주한다.
- 정수형의 기본값은 순서대로 (0, 0, 0, 0L)이다.
4. 실수형 (float, double)
- float의 Type 기본값은 0.0f / double Type의 기본값은 0.0이다.
- 프리미티브 타입과 레퍼런스 타입
- 자료형은 크게 Pritive Type과(기본형) Reference Type(참조형)으로 나뉜다.
- 기본형은 실제 값을 저장하는 반면, 참조형은 값이 저장되어 있는 주소를 값으로 가진다.
- 자바는 C언어와는 달리 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수이다.
- 프리미티브 타입
- 총 8가지 의 기본형 타입을 미리 정의하여 제공한다.
- 기본값이 있기 때문에 Null이 존재하지 않는다.
- 실제 값을 저장하는 공간으로 스택(Stack) 메모리에 저장된다.
- 만약 컴파일 시점에 담을 수 있는 크기를 벗어난다면 에러를 발생시키는 컴파일 에러가 발생한다.
- 레퍼런스 타입
- 기본형 타입을 제외한 타입들이 모두 참조형 타입이다. (개발자 마음대로!)
- 빈 객체를 의미하는 Null이 존재한다.
- 값이 저장되어 있는 곳의 주소값을 젖아하는 공간으로 힙(heap) 메모리에 저장된다.
- 문법상으로는 에러가 없을수도 있지만 실행시켰을 때 런타임 에러가 발생한다.
- 리터럴
- 우선, 상수를 먼저 알아보자. 상수란 변하지 않는 값이다.
- 상수는 숫자뿐만 아니라 문자, 클래스나 구조체 같이 기본형에 파생된 객체나 유도형 같은 데이터 등을 데이터로 넣을 수 있다.
- 참조변수를 상수로 지정할 때는 참조 변수의 메모리의 주소값이 변하지 않는다는 의미이지, 그 주소가 가르키는 데이터들까지 변하지 않는다는 것을 의미하는 것은 아니다.
- 리터럴은 데이터 그 자체를 의미한다. 즉, 변수에 넣는 변하지 않는 데이터를 의미한다.
final int a = 100;
여기서 a는 상수, 100은 리터럴이다. 즉, 리터럴은 boolean, char, double, long, int등을 말한다.
- 변수 선언 및 초기화하는 방법
- 변수를 선언한다는 것은, 저장 공간을 확보하겠다는 의미로 해석 가능하다.
int a;
int 타입의 값을 저장할 수 있는 4byte의 공간을 확보하여 그 공간의 이름은 a이다. 라고 볼 수 있다.
-변수를 초기화한다는 것은, 저장공간에 값을 저장하겠다는 의미로 해석 가능하다.
int a; //변수선언
a = 2; //변수 초기화
int b = 5; //변수 선언과 동시에 초기화
//위에 두개 다 같은 의미 (변수이름만 다름)
변수를 선언하고 나면 해당 공간에는 아무 의미가 없는 가비지 값들이 들어가있다.
그리고 그 상태에서 컴파일을 시도하면, 'java: variable a might not have been initialized'와 같은 컴파일 에러가 발생한다. 그러므로 변수 선언 후에는 초기화를 해야한다.
참고) 자바의 에러 메세지는 약 20여개밖에 안 된다고 교수님께서 말씀해주셨다. 그래서 싹 다 외우는게 좋다고 말씀하시던데... ㅋㄷㅋㄷ
- 변수의 스코프와 라이프타임
- 변수의 스코프: 변수에 접근할 수 있는 유효 범위와 영역을 의미한다.
- 변수의 라이프타임: 변수가 메모리에 살아있는 기간이다.
- Intance Variable (인스턴스 변수)
정의 : 클래스 내부와 모든 메소드 및 블록 외부에서 선언된 변수
라이프타임 : 객체가 메모리에 남아있을 때 까지.
예시) x와 y의 scope
public class Test {
// 여기서
int x,y; //인스턴스 변수
static int result;
void add(int a, int b) { //a와 b는 로컬변수
x = a;
y = b;
int sum = x + y; //sum
System.out.println("sum = " + sum);
}
// 여기까지
public static void main(String[] args) {
Test obj = new Test();
obj.add(10, 20);
}
}
- class Variables (클래스 변수)
정의 : 클래스 내부, 모든 블록 외부에서 선언되고 static으로 표시된 변수
scope : 클래스 전체
라이프타임 : 프로그램이 끝날 때 까지 또는, 클래스가 메모리에 로드 되는 동안.
예시) result(class variable)의 scope
public class Test {
// 여기서
int x,y; //인스턴스 변수
static int result;
void add(int a, int b) { //a와 b는 로컬변수
x = a;
y = b;
int sum = x + y; //sum
System.out.println("sum = " + sum);
}
public static void main(String[] args) {
Test obj = new Test();
obj.add(10, 20);
}
// 여기까지
}
- Local Variable (지역변수)
정의 : 인스턴스 및 클래스 변수가 아닌 모든 변수
scope : 선언된 블록 내에 있음
라이프타임 : 컨트롤이 선언된 블록을 떠날 때 까지.
예시) a, b (local variable)의 scope
public class Test {
int x,y; //인스턴스 변수
static int result;
// 여기서
void add(int a, int b) { //a와 b는 로컬변수
x = a;
y = b;
int sum = x + y; //sum
System.out.println("sum = " + sum);
}
// 여기까지
public static void main(String[] args) {
Test obj = new Test();
obj.add(10, 20);
}
}
- 타입 변환, 캐스팅 그리고 타입 프로모션
- 자바의 연산은 동일한 타입에서만 가능하다.
- 하지만 개발을 하다보면 다른 타입간의 연산이 필요한 경우가 생긴다. 이러한 경우에 타입 변환을 해줄 수 있다.
- 타입변환에는 2가지 방법이 있다.
1. 캐스팅 (강제 변환)
- 큰 메모리 데이터 타입을 → 작은 메모리 타입으로 변환
- (이때는 데이터의 손실이나 변형이 생길 수 있다.)
- 아래의 코드는 바이트의 범위 내에서 형변환을 시도한 것이다. (바이트의 범위 -128 ~ 127)
public static void main(String[]args){
int a = 5;
byte b = (byte)a;
System.out.println(b); // 5
}
- 아래의 코드는 바이트의 범위 외에서 형변환을 시도한 것이다.
public static void main(String[]args){
int a = 128;
byte b = (byte)a;
System.out.println(b); // -128
}
바이트의 범위는 127까지인데 128을 변환하려고 하니 오버플로우가 발생했다.
오버플로우는 범위를 넘어갔을 때 발생한다. 범위를 잘 고려해서 캐스팅 (강제 변환)을 해줘야한다.
2. 타입 프로모션 (자동 형변환)
- 작은 메모리 크기의 데이터 타입을 → 큰 메모리 타입으로 변환
- (이때는 데이터의 손실이나 변형이 생기지 않음으로 자동으로 형변환이 된다.
public static void main(String[]args){
byte a = 5;
int b = a;
System.out.println(b); // 5
}
- 1차 및 2차배열 선언하기
- 배열 : 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것.
- 배열을 선언하기 위해선 [] 기호를 사용한다.
- 공간의 크기가 정해져있기 때문에 new 연산자로 배열의 크기를 지정해줘야한다.
- 1차원 배열
public static void main(String[]args){
// 배열 선언
int[] arr1;
int arr2[];
// 크기가 10인 배열을 생성
arr1 = new int[10];
// 크기가 5인 배열을 선언과 동시에 생성
int[] arr3 = new int[5];
// 크기가 5인 배열을 선언과 생성, 초기화를 동시에 함
int[] arr4 = new int[5] {1, 2, 3, 4, 5};
// arr4의 경우 아래와 같이 new int 생략 가능
int[] arr5 = {1, 2, 3, 4, 5};
}
- 2차원 배열
public static void main(String[]args){
// 5행 4열의 2차원 배열 생성
int[][] arr = new int[5][4];
// 생성과 동시에 초기화
int[][] arr2 = new int[][]{ {1, 2, 3}, {4, 5, 6} };
// arr2의 경우 아래와 같이 new int는 생략 가능
int[][] arr3 = { {1, 2, 3}, {4, 5, 6} };
}
- 타입 추론, var
- 데이터 타입을 소스코드에 명시하지 않아도, 컴파일 단계에서 컴파일러가 타입을 유추해 정해주는 것을 뜻한다.
- 지역변수로만 사용 가능하고, 선언과 동시에 초기화 해야한다. (초기화 값이 있는 지역변수로만 선언 가능)
- 1.5버전부터 추가된 Generic이나 자바 8버전에서 추가된 lamda에서 타입추론이 사용된다.
- 자바 10에서는 이러한 타입추론을 사용하는 var이라는 Local Variable Type-Inference가 추가되었다.
var x; // (X)
var x = null; // (X)
private var x = "hello"; // (X)
var x = "hello"; // (O)
'Study > Java_study' 카테고리의 다른 글
Java_study_6 (상속) (0) | 2021.08.09 |
---|---|
Java_study_5 (클래스) (0) | 2021.08.04 |
Java_study_4 (제어문) (0) | 2021.08.01 |
Java_study_3 (연산자) (0) | 2021.07.26 |
Java_study_1 (JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가) (0) | 2021.07.18 |