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 클래스를 흔히 사용하는 이유는 밑의 두가지 이유일 것 입니다.
박싱과 언박싱에 대해서도 알아보겠습니다.
기본자료형 -> 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; // 이렇게 바로 꺼내서 사용 가능, 오토 언박싱
// 오토 언박싱 - 오토박싱과 반대로 객체 타입의 데이터를 기본형 타입 데이터로 자동 형변환
} // 기본 타입을 객체 타입으로 사용 원할때 오토 박싱, 객체 타입을 기본 타입으로 하용하고 싶을때 오토 언박싱
}
제네릭이란 ?
클래스 내부에서 사용할 데이터의 타입을 외부에서 지정하는 기법.
즉, 클래스를 정의할 때 매개변수의 데이터 타입을 확정하지 않고, 인스턴스를 생성할 때 데이터 타입을 외부에서 지정하는 기능입니다.
스트링 버퍼는 문자열을 추가하거나 변경 할 때 주로 사용하는 자료형 입니다.
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 메소드를 사용하여 원하는 위치에 문자열을 삽입할 수 있습니다.
다만 위에서 설명하였다 시피 이 경우 새로운 객체를 생성하지 않는다는 점이 특징입니다.
StringBuffer sb = new StringBuffer();
sb.append("hello world");
sb.insert(0, "abcNext");
System.out.println(sb.toString());
// abcNext hello world
즉 0번째 인덱스 위치에 abcNext 라는 문자열을 삽입하는 것입니다.
subString 메소드는 String 자료형의 substring 메소드와 동일하게 사용이 됩니다.
StringBuffer sb = new StringBuffer();
sb.append("hello world");
System.out.println(sb.substring(0,3));
// hel
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