[JAVA] 자료형(primitive, reference)

토닉·2021년 8월 5일
0

Java

목록 보기
2/13
post-thumbnail

자료형

데이터가 갖는 형으로 데이터의 실질적인 구조, 개념

크게 기본 자료형, 참조 자료형으로 나뉩니다.

기본 자료형(Primitive Type)

  • 비객체 타입으로, Null을 가질 수 없는 형태
  • 정수, 실수, 문자, 논리 리터럴등의 실제 데이터 값을 저장하는 타입

참조 자료형(Reference Type)

  • 참조 자료형은 기본적으로 java.lang.Object를 상속받습니다.
  • 객체(Object)의 번지를 참조(주소를 저장)하는 타입으로 메모리 번지 값을 통해 객체를 참조하는 타입
  • 문자열, 배열, 열거, 클래스, 인터페이스 등

두 자료형의 차이점

  • 참조 자료형은 Null 값을 포함할 수 있다.
  • 제너릭 타입에서 사용 가능 여부
  • 기본 자료형이 접근 속도 면에서 빠르다(참조 자료형은 언박싱 과정을 거쳐야하기 때문)
  • 참조 자료형이 사용하는 메모리양이 압도적으로 높다.

Wrapper Class

기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(wrapper class)

박싱: 기본 타입의 값을 객체로 만드는 과정
언박싱: 객체에서 기본 타입의 값을 얻는 과정

구현 코드

public class WrapperEx {
	public static void main(String args[]) {
    	Integer number = new Integer(17); // 박싱
        int n = number.intValue(); // 언박싱
        System.out.println(n);
    }
}
// 자동 박싱과 자동 언박싱
public class WrapperEx {
	public static void main(String args[]) {
    	Integer number = 17; // 자동 박싱
        int n = number; // 자동 언박싱
        System.out.println(n);
    }
}
public class WrapperEx {
    public static void main(String[] args)  {
        String str = "10";
        String str2 = "10.5";
        String str3 = "true";
        
        byte b = Byte.parseByte(str);
        int i = Integer.parseInt(str);
        short s = Short.parseShort(str);
        long l = Long.parseLong(str);
        float f = Float.parseFloat(str2);
        double d = Double.parseDouble(str2);
        boolean bool = Boolean.parseBoolean(str3);
		
        System.out.println("문자열 byte값 변환 : "+b);
        System.out.println("문자열 int값 변환 : "+i);
        System.out.println("문자열 short값 변환 : "+s);
        System.out.println("문자열 long값 변환 : "+l);
        System.out.println("문자열 float값 변환 : "+f);
        System.out.println("문자열 double값 변환 : "+d);
        System.out.println("문자열 boolean값 변환 : "+bool);
    }
}

wrapper 객체는 내부의 값을 비교할 수 없습니다.

public class WrapperEx {
	public static void main(String[] args){
    	Integer number1 = 17;
        Integer number2 = 17;
        num1 = number1;
        num2 = number2;
        System.out.println(number1 == number2) // false
        System.out.println(num1 == num2) // True
        System.out.println(number1.equals(number2)) // True
        System.out.println(num1 == number2) // True
    }
}

이유는 wrapper의 객체를 비교할 때 내부의 값을 비교하는 것이 아니라 객체의 참조 주소를 비교하게 됩니다.

  • 객체 끼리 비교를 할 때는 equals()를 사용
  • 기본 참조형 값과 객체를 비교할 때는 ==, equals() 둘 다 사용 가능
    컴파일러가 자동으로 박싱, 언박싱을 해주기 때문

참고 자료
코딩 팩토리

profile
우아한테크코스 4기 교육생

0개의 댓글