자바의 타입 - 원시 타입 vs 참조 타입
- 자바에서 변수를 선언할 때 두 가지 타입으로 구분된다.
- 실제 값을 스택에 저장해서 사용하는 원시 타입.
- 실제 값을 힙에 저장한 후, 그 값의 참조 값을 사용하는 참조 타입.
- 원시 타입에는 boolean, char, byte, short, int, long, float, double 이 있다.
- 참조 타입은 원시 타입을 제외한 모든 타입이다.
- 원시 타입에서 ==, != 연산자는 값 그 자체를 비교한다.
- 참조 타입에서 ==, != 연산자는 참조 값의 주소를 비교한다.(값을 비교하기 위해서는 별도의 선언이 필요)
원시 타입(Primitive Type)
원시 타입이란?
- 실제 데이터 값이 저장되고, 그 값을 이용할 경우 사용.
- 지역 변수, 매개 변수 등 스택 영역에 저장되는 타입.
- 정수 자료형으로 byte, short, int, long 이 있다.
- 실수 자료형으로 float, double 이 있다.
- 문자 자료형으로 char 가 있다.
- 논리 자료형으로 boolean 이 있다.
정수 자료형
- 메모리적 측면에서 살펴보면, 1이라는 값을 저장하기 위해서는 int 자료형보다 short 자료형을 사용하는것이 효율적이다.
- 하지만, CPU는 정수연산 시 int 단위로 계산하도록 설계되어 있기 때문에 자바는 정수형 연산(덧셈, 뺄셈 등)을 진행할 때 모든 피연산자를 int형으로 변환하는 과정을 거친다.
- 즉, short형으로 선언된 1이라도 int형으로 변환하는 과정을 거친다.
- 반면, long형으로 선언된 정수는 int형으로 변환이 일어나지 않는다.(데이터의 손실이 발생할 수 있기 때문이다.)
- byte나 short등의 int 보다 크기가 작은 연산자들은 연산보다 데이터의 표현이 중심이 되는 경우 사용한다.
실수 자료형
- 실수 자료형을 선택하는 기준은 크기가 아니라, 정밀도로 판단하여야 한다.
- 실수를 표현하는데 사용이 되는 바이트의 수가 많으면 오차가 발생할 확률이 낮아진다.
- float은 6자리의 정밀도를 갖고, double은 15자리의 정밀도를 가진다.
문자 자료형
- 자바는 유니코드를 기준으로 문자를 표현한다.
- 유니코드는 2바이트로 표현하는 문자 체계로 세계 모든 언어를 표현할 수 있다.
- char형은 문자의 표현을 위한 자료형이다.
- 문자에 해당하는 값을 char형 변수에 넣어도, 해당 문자로 인식한다.
- 문자는 작은 따옴표로 표현해야 한다.
- 해당 국가의 폰트가 설치되어 있어야 정상적으로 문자가 출력된다.
public class test {
public static void main(String[] args){
char CharTest1='A';
char CharTest2=65;
System.out.println("문자 A 입력: "+CharTest1 );
System.out.println("숫자 65 입력: "+CharTest2 );
}
}
참조 타입(Reference Type)
참조 타입이란?
- 배열, 열거, 클래스, 인터페이스 등 데이터를 힙에 할당한 후 참조 값을 이용하여 데이터에 접근하는 타입.
- 변수에는 실제 값이 아닌, 참조 값을 가지고 있기 때문에 값을 비교하기 위해서는 == 연산자가 아니라, 별도의 연산이 필요하다.
- 힙에 데이터를 할당하기 때문에, 데이터에 더 이상 참조하지 않는 경우 가비지 컬렉터가 자동으로 데이터를 처리한다.
- 참조 변수 안에는 주소 값이 아니라, 참조 값이 들어가 있다.
- 객체가 생성되면, 힙에 데이터를 할당한다. 그리고 JVM은 해당 데이터의 주소에 맞는 참조 값을 매핑시킨다.
참조 변수에서 해당 참조 값을 저장한다.
- 참조 변수가 데이터에 접근할 때 JVM에서 참조 값에 맞는 주소 값을 이용하여 데이터를 처리한다.
참조 타입 비교(예시)
public class start {
public static void main(String[] args) {
String s1="test";
String s2="test";
String s3=new String("test");
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s1.equals(s3));
}
}
배열
- 자바에서는 배열도 참조 타입니다.
- new를 이용하여 객체를 생성한다.
- 배열 선언 방법
int[] arr = new int[4];
int[] arr = new int[]{1,2,3};
int[] arr = {1,2,3};
- 2차원 배열을 선언할 때에는 앞 원소는 필수 값이다.
int[][] arr = new int[필수][선택];
- 배열도 참조 타입이기 때문에 데이터의 참조값이 들어가 있다.
- int []arr; 만 선언하게 되면, null 값이 들어가게 된다.
- int[][] arr = new int[3][]; 에서 arr[0], arr[1], arr[2]에 역시 참조 값이 들어가게 된다.
상수
상수의 저장
- 상수도 변수처럼 메모리에 저장된다.
- 상수는 이름이 존재하지 않고, 메모리에 저장된 값을 변경할 수 없다.
- 상수도 자료형을 기반으로 저장된다.(정수인 경우 int, 실수인 경우 double)
- 상수가 기본 자료형이 표현 가능한 범위를 넘는 경우 컴파일 에러가 발생한다.
- 기본 자료형 범위를 넘는 경우 접미사를 붙여서 컴파일러에게 다른 형으로 변경해 달라고 요청해야 한다.
- 정수에서 int형으로 표현이 불가능한 경우 l 또는 L을 붙여 long형으로 변경을 요청해야 한다.
- 실수인 경우 기본 자료형이 double이다. double인 값을 float으로 저장할 경우 데이터 손실이 일어날 수 있기 때문에 컴파일러는 에러를 발생시킨다.
- 그러므로, float으로 변환시키겠다는 접미사 f 또는 F를 붙여 컴파일러에게 요청해야 한다.
형 변환
형 변환이 필요한 이유
- 정수 1과 실수 1.0은 같은 값이지만, 다른 형을 가지고 있다.
- int형 정수 1과 float형 실수 1.0은 비트로 표현하는 경우 다른 값을 가진다.
- int 형 정수 1 : 00000000 00000000 00000000 00000001
- float 형 실수 1.0 : 00111111 10000000 00000000 00000000
- 형 변환이란 값의 표현 방식을 변경하는 것이다.
자동 형 변환
- 별도의 형 변환을 요청하지 않아도 자동으로 형 변환이 발생하는 경우
- 데이터 손실이 발생하지 않는 경우 자동으로 형 변환이 가능하다.
- 연산에서 서로 다른 피연산자들이 있는 경우 자동으로 형 변환이 가능한 형으로 변환된다.
- 크가가 작은 float이 long보다 상위인 이유는 크기가 아니라 표현 범위를 기준으로 정의되었기 때문이다.
명시적 형 변환
- 자동 형 변환이 일어나지 않을 때 명시적 형 변환을 이용하면 형 변환이 가능하다.
- 형 변환 과정에서 데이터 손실이 발생할 수 있다.
- 형 변환 하려는 값 앞에 해당 형을 붙여준다.
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[JAVA] 오버라이딩(Overriding) 과 오버로딩(Overloading) // 다형성 (0) | 2021.01.20 |
---|---|
[JAVA] 상속(Inheritance) (0) | 2021.01.20 |
[JAVA] 객체의 생성, 생성자 (0) | 2021.01.20 |
[JAVA] 클래스 & 패키지 (0) | 2021.01.20 |
[JAVA] 자바의 시작 (0) | 2021.01.20 |
댓글