본문 바로가기
JAVA

Primitive vs Reference

by 봄석 2019. 9. 1.

Primitive vs Reference

자바의 자료형은 Primitive Type(기본형) 과  Reference Type(참조형)으로 나뉩니다.

Java Data Type 
ㄴ Primitive Type
    ㄴ Boolean Type(boolean)
    ㄴ Numeric Type
        ㄴ Integral Type
            ㄴ Integer Type(short, int, long)
            ㄴ Floating Point Type(float, double)
        ㄴ Character Type(char)
ㄴ Reference Type
    ㄴ Class Type
    ㄴ Interface Type
    ㄴ Array Type
    ㄴ Enum Type
    ㄴ etc.

 

Primitive Type(기본형)

비객체 타입으로 , Null을 가질 수 없는 형태

Type        Bits      Range of Values
----------------------------------------------------------------------------------------
byte         8bits    -2^7 ~ 2^7-1 (-128 ~ 127)
short       16bits    -2^15 ~ 2^15-1 (-32768 ~ 32767)
int         32bits    -2^31 ~ 2^31-1 (-2147483648 ~ 2147483647)
long        64bits    -2^63 ~ 2^63-1 (-9223372036854775808 ~ 9223372036854775807)
float       32bits    0x0.000002P-126f ~ 0x1.fffffeP+127f
double      64bits    0x0.0000000000001P-1022 ~ 0x1.fffffffffffffP+1023  
char        16bits    \u0000 ~ \uffff (0 ~ 2^15-1) * 자바에서 unsgined로 동작하는 자료형
boolean      1bit     true, false

Reference Type(참조형)

참조형은 기본적으로 java.lang.Object 를 상속받습니다.

또한, 선언한 자료형이 기본형이 아닌경우 참조형이라 보면 됩니다.

참조형에는  Class,Interface,Arrays이 있습니다.

 

1. Class Type

클래스형은 기본형과 다르게 객체를 참조하는 형태입니다.

class MyObject{
    private int index;
    MyObject(int index) {
        this.index = index;
    }
    public int getIndex() {
        return index;
    }
    public void setIndex(int index) {
        this.index = index;
    }
}

위와같은 MyObject클래스가 있을 때 ,

public class ClassType {
    public static void main(String[] args) {
        MyObject a = new MyObject(2);
        MyObject b = new MyObject(4);
        System.out.println(a.getIndex()); // "a" result is 2.
        a = b;
        System.out.println(a.getIndex()); // "a" result is 4.
        b.setIndex(6);
        System.out.println(a.getIndex()); // "a" result is 6.
    }
}

b 객체의 멤버 변수 값을 바꿨지만 a 객체도 같은 객체를 참조하기 때문에 동일한 값을 출력하는 것을 볼 수 있습니다.

a와 b의 연결고리를 끊고 싶다면 어느 하나의 변수에 null이나 new MyObject()를 통해 객체의 주소를 지워버리거나 새로운 객체를 가리키게 하면 됩니다.

 

1 -1 String Class

클래스형에서도 String 클래스는 조금 특별합니다.

이 클래스는 참조형에 속하지만 기본적인 사용은 기본형처럼 사용합니다. 그리고 불변하는immutable 객체입니다.

String 클래스에는 값을 변경해주는 메소드들이 존재하지만 해당 메소드를 통해 데이터를 바꾼다 해도 새로운 String 클래스 객체를 만들어내는 것입니다.

일반적으로 기본형 비교는 == 연산자를 사용하지만 String 객체간의 비교는 .equals() 메소드를 사용해야 합니다.

 

1 -2 Wrapper Class

기본형은 앞쪽에서 서술한대로 비객체이기 때문에 null을 넣을 수 없다고 했습니다.

하지만 방법은 존재하는법이죠. 기본형에 null을 넣고 싶다면 래퍼 클래스Wrapper Class를 활용하면 됩니다. 래퍼 클래스는 기본형을 클래스로 감싼 형태입니다. 다음처럼 사용합니다.

기본형   대응 래퍼 클래스
byte     Byte
short    Short
int      Integer
long     Long
float    Float
double   Double
char     Char
boolean  Boolean

2. Interface Type

일반적으로 인터페이스라고 한다면 추상 클래스abstract class와 많이 비교 되곤 합니다.

하지만 이 포스트는 순수한 자료형태에 대해서 다뤄보도록 합니다.

아래처럼 인터페이스를 만듭니다.

interface MyInterface<T> {
    void add(T value);
}

인터페이스를 만들게 되면 새로운 참조 자료형Reference Data Type을 만드는 것과 같습니다.

참고로 기존에 있는 자료형의 이름도 만들 수 있습니다(ex:Long).

그리고 인터페이스도 자료형이기 때문에 자료형으로써 자신을 구현한 객체의 주소를 가질 수 있습니다.

하지만 인터페이스에 정의된 메소드만 사용할 수 있겠죠.

 

3. Array Type

배열형은 기본형으로도 만들 수 있고 참조형으로도 만들 수 있습니다. 

public class ArrayType {
    public static void main(String[] args) {
        int [] i = new int[2];
        Long [] l = new Long[2];
        Object[][] o = null;
    }
}

자료형에 대해 []를 선언함으로 배열을 지정할 수 있습니다.

참고로 배열형 변수 또한 배열의 주소를 가지고 있는 것이기 때문에 클래스형의 특징과 일치합니다.

같은 객체의 주소를 바라보게 만들면 동일한 배열을 가리키게 됩니다.

그리고 위 코드의 마지막 라인처럼 [][]등으로 중첩 괄호를 사용하게 된다면 다중 배열로 사용할 수 있습니다.

 

4. Enum Type

보통 열거형이라고 합니다. String 클래스와 마찬가지로 불변의 객체이기도 합니다. 상수의 집합을 만들거나 특정 객체의 상태를 모아서 열거형으로 만들면 코드의 가독성이 좋아질 수 있습니다.

 

 

 

 

Primitive Type-> ReferenceType변환 

primitive Type에서 Reference Type간에 변환할때

Boxing 과 Unboxing이라고 합니다

 

Boxing

 Primitive 자료형 -> Wrapper 클래스
Unboxing   Wrapper 클래스 -> Primitive 자료형
// to int i from Integer ii 
int i = ii.intValue(); 

// to Integer ii from int i 
Integer ii = new Integer( i );

 

valueOf()와 parseInt()의 차이

 Integer.valueOf(String)

 Integer 클래스를 리턴하기 때문에 산술 연산을 할 수 없다.

 Integer.parseInt(String)

 int 형을 리턴하기 때문에 산술 연산을 할 수 있다.

 

'JAVA' 카테고리의 다른 글

Java - JVM  (0) 2019.09.02
Java - 메모리관리 ( 스택& 힙) [펌]  (0) 2019.09.01
Java Stream 결과 만들기  (0) 2019.09.01
Java Stream 가공하기  (0) 2019.09.01
Java Stream 생성하기  (0) 2019.09.01

댓글