봉봉의 개인 블로그

2019-07-17 [카테고리 미분류](Java Data Type) 본문

카테고리 없음

2019-07-17 [카테고리 미분류](Java Data Type)

봉봉이네 2019. 7. 17. 17:55

Java Data Type / Primitive Type / Reference Type

 

Java Data Type

Java에는 기본형(Primitive Type)과 참조형(Reference Type)이 있다. 일반적으로는 아래와 같다.

Java Data Type
    - Primitive Type
        - Boolean Type (boolean)
        - Numeric 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

기본형은 다음과 같은 특징을 가진다.

  • 자바에서 기본 자료형은 반드시 사용하기 전에 선언되어야 한다.
  • OS에 따라 자료형의 길이가 변하지 않는다.
  • 비객체 타입이다. 따라서 null 값을 가질수 없다.

또한 자료형은 아래와 같은 것딜이 존재.

  • byte
  • short
  • int
  • long
  • float
  • double
  • char
  • boolean

 

Reference Type

참조형은 기본적으로 java.lang.Object를 상속 받으면 참조형이 된다. 또한 선언한 자료형이 기본형이 아닌 경우 참조형이 된다고 보면 된다. 참조형에는 클래스형, 인터페이스형, 배열형이 있다.

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;
    }
}
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라는 변수가 가지는 것은 실제 객체가 아닌 객체의 주소를 가진다고 생각하면 된다. a와 b는 같은 객체의 주소를 가지고 있기 때문에 어느 한쪽이 변하더라도 값이 동일한 것이다. a와 b의 연결고리를 끊고 싶다면 어느 하나의 변수에 null이나 new MyObject() 를 통해 객체의 주소를 지워버리거나 새로운 객체를 가리키게 하면 된다.

String Class

클래스형에서도 String 클래스는 조금 특별하다. 이 클래스는 참조형에 속하지만 기본적인 사용은 기본형처럼 사용한다. 그리고 불변하는 객체이다. String 클래스에는 값을 변경해주는 메소드들이 존재하지만 해당 메소드를 통해 데이터를 바꾼다 해도 새로운 String 클래스 객체를 만들어 내는 것이다.

 

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

Wrapper Class

기본형은 앞쪽에서 서술한대로 비객체이기 떄문에 null을 넣을 수 없다. 하지만 방법은 존재한다. 기본형에 null값을 넣고 싶다면 래퍼 클래스(wrapper class)를 활용하면 된다. 래퍼 클래스는 기본형을 클래스로 감싼 형태이다. 아래와 같이 사용된다.

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

참고로. void의 래퍼 클래스인 Void도 존재. 또한 래퍼 클래스들은 내부에 멤버 변수가 final 선언이 되어 있다.

 

Interface Type

일반적으로 인터페이스라고 한다면 추상 클래스와 많이 비교 되곤 한다. 하지만 이 포스트는 순수 자료형태에 대해서 다루겠다.

 

아래와 같이 인터페이스를 만든다.

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

인터페이스를 만들게 되면 새로운 참조 자료형을 만드는 것과 같다. 참고로 기존에 있는 자료형의 이름도 만들수 있다. 그리고 인터페이스도 자료형이기 떄문에 자료형으로써 자신을 구현한 객체의 주소를 가질 수 있다. 하지만 인터페이스에 정의된 메소드만 사용할 수 있다.

 

Array Type

배열형은 기본형으로도 만들 수 있고 참조형으로도 만들 수 있다. 다음의 코드를 보면

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

자료형에 대해 []를 선언함으로 배열을 지정할 수 있으며, 참고로 배열형 변수 또한 배열의 주소를 가지고 있는 것이기 때문에 클래스형의 특징과 일치한다. 같은 객체의 주소를 바라보게 만들면 동일한 배열을 가르키게 된다.

 

 

-출처

https://jdm.kr/blog/213

Comments