java.lang 패키지/오토박싱, String buffer, Math

Jake·2022년 10월 5일
0
post-thumbnail

GDSC Java 스터디

java.lang 패키지/오토박싱

java.lang 패키지에는 기본적으로 java 사용을 위해 다양한 패키지가 존재합니다.

wrapper class - 기본형 데이터 타입의 객체화를 가능하게 도와주는 클래스

object class - 모든 클래스의 최상위 클래스

그외 String, String buffer, StringBuilder, System, Math 클래스 등이 있습니다.

Wrapper 클래스란?
기본 자료형을 참조형 자료형 처럼 사용하기 위한 클래스입니다. 이름에서도 알 수 있듯이 wrapper 클래스는 무언가를 감싸주는 클래스입니다. 그 무언가는 기본 자료형이 될 수 있습니다.

즉, 기본 자료형의 값을 감싸 객체 형태로 만든 것이 바로 wrapper 클래스입니다.

wrapper 클래스의 경우 string 과 같이 불변성을 가지고 있습니다. 따라서 wrapper 클래스 안에 객체의 값은 변경이 불가능합니다.

wrapper 클래스의 종류는 아래와 같습니다.

wrapper 클래스는 기본 자료형을 감싼 것이기 때문에 종류 또한 기본 자료형과 동일함

byte->Byte

short->Short

int->Integer

long->Long

double->Double

char->Character

float->Float

boolean->Boolean

wrapper 클래스를 사용하는 이유는 뭘까요 ?

wrapper 클래스를 사용하는 이유는 참조형 자료형을 사용하는 이유와 같습니다.

기본 자료형의 값을 단순히 값으로만 사용하지 않고 그 값에 대한 메서드를 사용 혹은 null값을 이용하기 위해 사용됩니다.

하지만 우리가 wrapper 클래스를 흔히 사용하는 이유는 밑의 두가지 이유일 것 입니다.

  1. 제네릭(아래에서 간단히 설명)
  2. 기본 자료형의 값을 문자열로 변환 혹은 반대 경우

박싱과 언박싱에 대해서도 알아보겠습니다.

기본자료형 -> wrapper 클래스 == boxing
wrapper 클래스 -> 기본자료형 == unboxing
오토 박싱 - 기본 타입 데이터를 객체 타입의 데이터로 자동 형변환 시켜주는 기능
오토 언박싱 - 객체 타입의 데이터를 기본형 타입 데이터로 자동 형변환

Wrapper class에 대해 아래 예제를 통해 알아보겠습니다.

public class WrapperExam {
    public static void main(String[] args) {
        int i = 5; // int는 기본형 타입, 객체가 아님
        Integer i2 = new Integer(5); // integer는 int로 바꿔주는 wrapper클래스중 하나임

        Integer i3 = 5; // 원래 int기본형 타입지만 자동으로 integer타입으로 형변환이 되었음, 오토박싱
                        // new Integer(5); 와 같은 역할임, 자동으로 감싸주므로 오토박싱

//        int i4 = i3.intValue(); // 오토 언박싱, integer라는 객체타입을 int로 바꿔줌, 객체라는 껍질을 없애는 느낌 ?

        int i5 = i3; // 이렇게 바로 꺼내서 사용 가능, 오토 언박싱
                    // 오토 언박싱 - 오토박싱과 반대로 객체 타입의 데이터를 기본형 타입 데이터로 자동 형변환
    }       // 기본 타입을 객체 타입으로 사용 원할때 오토 박싱, 객체 타입을 기본 타입으로 하용하고 싶을때 오토 언박싱
}

제네릭이란 ?
클래스 내부에서 사용할 데이터의 타입을 외부에서 지정하는 기법.

즉, 클래스를 정의할 때 매개변수의 데이터 타입을 확정하지 않고, 인스턴스를 생성할 때 데이터 타입을 외부에서 지정하는 기능입니다.

String buffer

스트링 버퍼는 문자열을 추가하거나 변경 할 때 주로 사용하는 자료형 입니다.

append


append를 사용하여 StringBuffer 객체를 생성, 문자열을 추가하는 것을 살펴보겠습니다.

StringBuffer sb = new StringBuffer();
        sb.append("hello");
        sb.append(" ");
        sb.append("World");

        String str = sb.toString();
        System.out.println(str);
// hello World

위 예제를 String 자료형만 가지고 아래와 같이 동일한 결과를 얻을 수 있습니다

String sb = "";
sb += "hello";
sb += " ";
sb += "World";
System.out.println(sb);
// hello World

하지만 내부적으로 객체가 생성되고 메모리가 사용되는 과정은 다릅니다.

첫번 째 예제의 경우 StringBuffer 객체는 한번만 생성된다. 두번 째 예제는 String 자료형에 +
연산이 있을 때마다 새로운 StringBuffer 객체가 생성된다(문자열 간 + 연산이 있는 경우 자바는 자동으로 새로운 String 객체를 만들어 낸다). 두번 째 예제에서는 총 4개의 String 자료형 객체가 만들어지게 된다.

(이와 같이 + 연산자를 통해 객체를 여러번 만들어 낸다면 심각한 성능저하를 일으킬 수 있으므로 반드시 피하도록 하자)

아래의 예제를 통해 간단히 살펴보겠습니다.

public class StringExam2 {
    public static void main(String[] args) {
        String str1 = "";
        for(int i=0; i<100; i++) { /** 100번 객체 생성*/
            str1 += "*";
        }
        System.out.println(str1);

        StringBuffer sb = new StringBuffer();
        for(int i=0; i<100; i++) { /**객체 1번 생성*/
            sb.append("*");
        }
        System.out.println(sb);
    }
}

String 자료형은 한번 값이 생성되면 그 값을 변경할 수가 없습니다. 이렇게 값을 변경할 수 없는 것을 immutable 하다고 합니다. trim, toUpperCase 등의 메소드를 보면 문자열이 변경되는 것 처럼 생각 될 수도 있지만 해당 메소드 수행 시 또 다른 String 객체를 생성하여 리턴할 뿐입니다. 하지만 StringBuffer는 이와 반대로 값을 변경할 수 있습니다(mutable 하다). 즉 한번 생성된 값을 언제든지 수정할 수 있습니다.

insert


insert 메소드를 사용하여 원하는 위치에 문자열을 삽입할 수 있습니다.

다만 위에서 설명하였다 시피 이 경우 새로운 객체를 생성하지 않는다는 점이 특징입니다.

StringBuffer sb = new StringBuffer();
sb.append("hello world");
sb.insert(0, "abcNext");
System.out.println(sb.toString());
// abcNext hello world

즉 0번째 인덱스 위치에 abcNext 라는 문자열을 삽입하는 것입니다.

subString


subString 메소드는 String 자료형의 substring 메소드와 동일하게 사용이 됩니다.

StringBuffer sb = new StringBuffer();
sb.append("hello world");
System.out.println(sb.substring(0,3));
// hel

Math

math의 여러 메소드를 사용하여 계산을 할 수 있습니다. 아래의 예제를 통해 살펴보겠습니다.



public class MathExam {
    public static void main(String[] args) {
        int value1 = Math.max(5, 30); /** 최댓값*/
        System.out.println(value1);
        int value2 = Math.min(5, 30); /** 최소값*/
        System.out.println(value2);
        System.out.println(Math.abs(-10)); /** 절대값*/
        System.out.println((int)(Math.random()*10)); /** 랜덤숫자*/
        System.out.println(Math.sqrt(25)); /** 제곱근, 루트*/
    }
}
// 30
// 5
// 10
// 1-10 랜덤숫자
// 5.0

0개의 댓글

관련 채용 정보