Java 파트11-3. java.lang 패키지

1. Wrapper(포장) 클래스


포장 객체

  • 기본 타입의 값을 내부에 두고 포장
  • 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없음
  • byte, char, short, int, long, float, double, boolean 기본 타입 값을 갖는 객체
  • 사용하는 이유
    • 자바는 객체 지향 언어이므로 객체를 대상으로 처리하는 경우가 많다. JDK의 어떤 클래스는 객체만을 다루기 때문에 기본 타입의 데이터는 사용할 수 없다. 이런 무제를 해결하기 위해 기본 타입의 값을 객체로 만들어 사용할 수 있도록 Wrapper 클래스를 제공한다.
    • 기본 타입은 NULL 대입이 안되는데, Wrapper 클래스는 NULL대입 가능
    • 매개변수로 객체를 요구, 기본형 값이 아닌 객체로 저장해야 할 때, 객체간의 비교 등등
  • 포장 클래스는 다음과 같은 메서드를 가진다.
    • Wrapper클래스.valueOf(기본타입의 값) : 기본 타입값을 포장 객체로 만들어 반환
    • 포장객체.기본타입Value() : 포장객체의 기본 타입을 반환
    • Wrapper클래스.parseWarpper클래스(“문자열”) : 문자열을 기본 타입의 값으로 반환
    • Wrapper클래스.toString(기본타입값) : 기본 타입 값을 문자열로 반환
Integer i = Integer.valueOf(10) // 포장 객체
int ii = i.intValue(); // ii = 10 언박싱
int i = Integer.parseInt("123"); // 문자열 "123"을 기본 타입 값 123으로 반환
String i = Character.toString('a') // 문자 a를 문자열 "a"로 반환

주의할 점이 Int는 Wrapper클래스명이 Integer, char은 Character 이다. 메서드에서는 Int를 사용하는데 클래스명만 Integer이니 주의하자.

그림1


Boxing과 Unboxing

  • 박싱 : 기본 타입의 값을 포장 객체로 만드는 과정

그림2

생성자의 매개값으로 기본값을 주게 되면 기본타입을 박싱한 Wrapper 객체가 만들어지고, 문자열을 주게 되면 문자열을 해당 기본 타입으로 변환한 후에 박싱한 후에 Wrapper 객체를 만들게 된다.
생성자를 이용하지 않고 각 포장 클래스마다 가진 정적 valueOf() 메소드를 활용하여 Wrapper 객체를 만들 수 있다.

Integer obj = Integer.valueOf(1000);
Integer obj = Integer.valueOf("1000");


  • 언박싱 : 포장 객체에서 기본 타입의 값을 얻어내는 과정
    • 기본 타입 이름 + Value() 메소드를 호출하여 언박싱

그림3

package sec02.exam08;

public class BoxingUnboxing {

	public static void main(String[] args) {
		// 박싱
		Integer obj1 = new Integer(100);
		Integer obj2 = new Integer("200");
		Integer obj3 = Integer.valueOf("1000");
		
		// 언박싱
		int value1 = obj1.intValue();
		int value2 = obj2.intValue();
		int value3 = obj3.intValue();
		
		
		System.out.println(value1);
		System.out.println(value2);
		System.out.println(value3);
	}

}


자동 박싱과 언박싱

  • 포장 클래스 타입에 기본값이 대입될 경우 자동 박싱 발생
// 원래 클래스타입에 기본값을 대입한다는 것은 자바 문법에 맞지 않는다.
// 해석 : 100이라는 기본값을 Integer라는 객체로 포장해서 그 객체를 obj에 대입
Integer obj = 100; // 자동 박싱
  • 기본 타입에 포장 객체가 대입되는 경우 및 연산에서 자동 언박싱 발생
Integer obj = new Integer(200);
int value1 = obj; // 자동 언박싱
int value2 = obj + 100; // 자동 언박싱


문자열을 기본 타입 값으로 변환

  • 포장 클래스로 문자열을 기본 타입 값으로 변환
  • ‘parse + 기본 타입 이름’ 정적 메소드 이용

그림4


포장 값 비교

  • 포장 객체 내부 값을 비교하기 위해 == 및 != 연산자를 사용하는 것은 좋지 않음
    • 포장 객체 자체는 기본타입의 값이 아닌 객체이므로 위의 연산은 객체의 번지를 비교하는 것이기 때문이다.
Integer obj1 = 300;
Integer obj2 = 300;
System.out.prinln(obj1==obj2); // false
  • 박싱된 값이 아래 표에 나와 있는 범위의 값이 아닌 경우 언박싱한 값을 얻어 비교해야 한다.
  • 범위 내에 있다면 자바는 범위 내의 값들을 박싱할 때 이전에 박싱된 객체가 있다고 한다면 재사용한다. 즉, 범위 내의 값들을 객체를 공유한다.
Integer obj1 = 10;
Integer obj2 = 10;
System.out.prinln(obj1==obj2); // true

하지만 범위를 항상 고려하면서 비교하기는 불편하기 때문에 equals()를 사용하는 것이 좋다.

Integer obj1 = 10;
Integer obj2 = 10;
System.out.prinln(obj1.equals(obj2)); // true


2. Math 클래스


수학 계산에 사용

package sec02.exam09;

public class MathExam {

	public static void main(String[] args) {
		// 절댓값
		int v1 = Math.abs(-2);
		double v2 = Math.abs(-3.14);
		
		// 올림
		double v3 = Math.ceil(5.3);
		double v4 = Math.ceil(-5.3);
		
		// 버림
		double v5 = Math.floor(5.3);
		double v6 = Math.floor(-5.3);
		
		// 최대값
		int v7 = Math.max(5, 9);
		double v8 = Math.max(5.3, 9.3);
		
		// 최소값
		int v9 = Math.min(5, 9);
		double v10 = Math.min(5.3, 9.3);
		
		
		// 무작위수
		// random 메소드는 0.0을 포함하고 1.0을 포함하지 않는 사이의 실수값 리턴
		double v11 = Math.random();
		
		// 가까운 정수의 실수값을 리턴
		double v12 = Math.rint(5.3);
		double v13 = Math.rint(5.7);
		
		// 반올림
		// round 메소드는 실수에서 반올림을 해서 정수로 만든 후 long타입으로 리턴
		long v14 = Math.round(5.3);
		long v15 = Math.round(5.7);
		
		// round 메소드를 이용하여 소수점 몇째자리에서 반올림하기
		double value = 12.3456;
		double tmp1 = value * 100;
		double tmp2 = Math.round(tmp1);
		double v16 = tmp2/100.0;
		
		System.out.println(v1);
		System.out.println(v2);
		System.out.println(v3);
		System.out.println(v4);
		System.out.println(v5);
		System.out.println(v6);
		System.out.println(v7);
		System.out.println(v8);
		System.out.println(v9);
		System.out.println(v10);
		System.out.println(v11);
		System.out.println(v12);
		System.out.println(v13);
		System.out.println(v14);
		System.out.println(v15);
		System.out.println(v16);
		

	}

}


Math.random 메소드

0.0이상 1.0 미만 범위에 속하는 하나의 double값을 리턴

그림5


3. 정리하기


  • Object 클래스 : 자바 최상위 부모 클래스, Object 클래스의 메소드는 모든 자바 객체에서 사용 가능
  • System 클래스 : 운영체제의 일부 기능을 이용할 수 있음. 정적 필드와 정적 메소드로 구성
  • Class 클래스 : 클래스와 인터페이스의 메타 데이터가 Class 클래스로 관리됨.
  • String 클래스 : String 클래스의 다양한 생성자를 이용하여 직접 String 객체 생성 가능
  • Wrapper 클래스 : 기본 타입의 값을 갖는 객체를 포장 객체라 함. 기본 타입의 값을 포장 객체로 만드는 것을 박싱, 반대의 과정을 언박싱이라고 함.
  • Math 클래스 : 수학 계산에 사용할 수 있는 메소드를 제공하여, Math 클래스가 제공하는 메소드는 모두 정적 메소드이므로 Math 클래스로 바로 사용 가능

본 포스팅은 ‘혼자 공부하는 자바’를 읽고 공부한 내용을 바탕으로 작성하였습니다.


© 2021. By Backtony