[JAVA] 변수 1 - Primitive Type vs Reference Type

김민기·2021년 2월 21일
0

Java

목록 보기
2/20
post-thumbnail

변수형

기본형 (Primitive type)

기본형 변수는 참조하지 않고 실제 값(리터럴)을 저장하며 컴파일 시점에서 할당 메모리의 크기를 검사합니다.

  • 자바의 기본형
boolean     1byte       true, false
byte        1byte       -128 ~ 127
short       2byte       -32_768 ~ 32767
int         4byte       -2147483648 ~ 2147483647
long        8byte       -9223372036854775808 ~ 9223372036854775807
float       4byte       1.4E-45 ~ 3.4028235E38 (근사값)
double      8byte       4.9E-324 ~ 1.7976931348623157E308 (근사값)
char        2byte       '\u0000' ~ '\uFFFF'

리터럴과 상수

리터럴

1, 0.1, 'c' 와 같은 변수에 저장될 수 있는 데이터 자체를 의미합니다. 리터럴 값들은 불변성을 지니며 값은 실제 할당 이 후 변하지 않습니다.

자바에서 각 변수형 별로 리터럴을 표기하는 법은 다음과 같습니다.

  • 정수형 (short ~ long)
    • 2진수 : 0b10
    • 8진수 : 02
    • 10진수 : 2
    • 16진수 : 0x2
  • 부동소수점
    • float : 2.0F
    • double : 2.0L
  • 문자형 및 문자열
    • char : '2'
    • String : "2"

상수

상수도 불변성을 지닌다는 관점에서 리터럴과 비슷한 점을 갖고 있습니다. 하지만 상수는 불변성을 지니는 변수라는 점에서 리터럴과 차이를 갖습니다.

한번 초기화된 상수는 이 후에 다시 초기화 할 수 없으며 자바에서는 final 키워드로 상수를 선언합니다.

참조형 (Reference type)

참조형은 기본형을 제외한 모든 타입을 칭하며 실제 데이터 값이 아닌 객체의 주소값(해시코드값)을 저장하는 변수를 말합니다.

  • Class Interface array Enumeration...

참조형 변수는 항상 4byte의 같은 크기를 가지며 힙(Heap) 메모리에 저장됩니다. 해당 객체의 해시코드값 혹은 null 값을 저장합니다.

  • 선언 시 기본 값은 null로 초기화
    • null을 참조하는 레퍼런스의 객체에 접근하려하면 런타임 에러(NullPointerException)가 발생
Person man = new Person();
/* 
new를 통해 객체를 생성하고 new의 반환값으로 생성된 객체의 해시코드를 받습니다.
그 후 그 주소를 man 참조변수에 저장하게 됩니다.
*/

참조 변수 연산

자바에서는 기본형 타입끼리만 산술 연산 및 논리연산이 가능하며 레퍼런스 타입은 산술연산 및 논리연산을 할 수 없습니다.

예외적으로 == 연산자를 통해 가르키고 있는 해시코드의 값을 비교할 수 있습니다. 이 때는 참조하고 있는 레퍼런스가 같다면 true 를 반환합니다.

equals, comparable

레퍼런스끼리 값 비교가 필요할 경우 Object.equals 메소드를 오버라이딩하여 원하는 값끼리 비교하게 할 수 있습니다.

  • ex) String.equals(String str2) ⇒ 참조 해시코드가 다르더라도 저장된 문자열 값이 같다면 true 반환

대소 비교가 필요하다면 Comparable 인터페이스를 구현하여 compareTo(object O) 메소드를 재정의하여 레퍼런스 간 비교를 할 수 있습니다.

배열

Java에서는 배열또한 참조형으로 사용하며 배열 객체가 저장되어 있는 해시코드를 참조하게 됩니다.

이 때 다중 배열은 해당 배열보다 한단계 낮은 배열의 해시코드를 참조합니다. 또한 직접적으로 배열의 차원 크기만큼 메모리를 할당하지 않기 때문에 다중배열은 물리적으로 정렬되어 있지 않습니다.

int[][] arr = new int[2][];
arr[0] = new int[4];
arr[1] = new int[234];
/*
c언어처럼 물리적으로 2차원 배열을 형성하는게 아닌 
참조를 갖는 배열을 만드는 것이므로 각각의 배열은 연속되어 있지 않으며
다른 크기를 가질 수 있음
*/
profile
민기1

1개의 댓글

comment-user-thumbnail
2021년 2월 22일

무야호

답글 달기