java.lang 패키지의 클래스
- Wrapper 클래스 : 기본형 데이터 타입을 객체화를 가능하게 도와주는 클래스들(Boolean, Byte, Short, Integer, Long, Float, Double 클래스)
- Object 클래스 : equals(객체가 가진 값을 비교할 때 사용), toString(객체가 가진 값을 문자열로 변환), hashCode(객체의 해시코드 값 반환)
- String 클래스 : 문자열과 관련
- Math 클래스 : 수학과 관련
- System 클래스 : 화면에 값을 출력할 때 사용
1) Wrapper 클래스
int a = 5;
Integer a2 = new Integer(5);
Integer a3 = 5;
// 객체로 된 타입을 기본형 타입으로 사용하기
int a4 = a3.intValue();
int a5 = a3;
a는 기본형 타입이다. (객체가 아니다 = 참조형이 아니다)
a2 실제 int를 객체로 바꿔주는 Wrapper 클래스 중 하나인 Integer이다.
a3은 5가 기본형이지만 자동으로 Integer로 형변환된 것이다.
→ 위와 같이 기본 타입 데이터를 객체 타입의 데이터로 자동 형변환 시켜주는 기능인 오토박싱이라고 한다.
→ 위와 같이 오토박싱과 반대로 객체 타입의 데이터를 기본형 타입 데이터로 자동 형변환하는 것을 오토언박싱이라고 한다.
2) Object 클래스
// name, num 필드를 정의했다고 하자.
Car c1 = new Car();
c1.name = "김철수";
c1.num = 1234;
Car c2 = new Car();
c2.name = "김철수";
c2.num = 1234;
c1.equals(c2))는 false(데이터가 동일하지 않음)이 나오며 해시코드 또한 다른 값을 가진다.
여기서 toString()을 오버라이딩해준다면 c1과 c2는 true(데이터가 동일함)가 나오며
해시코드 또한 같은 값을 가지게 된다.
3) String 클래스 - 불변 클래스(불변 = 수정이 불가능함 = 새로운 String 객체를 만듬)
-> + 연산자를 이용한다면 수정되는 것이 아닌가? 아니다. 새롭게 객체가 만들어져 값이 들어가는 것이다.
StringBuffer 클래스는 멀티 스레드 환경에서 사용할 수 있도록 동기화가 적용되어 있어 스레드에 안전하고
문자열을 이어붙이는 경우 추가 메모리 생성 없이 기존 문자열이 확장되는 클래스이다.
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = sb.append("hello");
if(sb == sb2){
System.out.println("sb == sb2");
}
sb와 sb2는 동일하다.
// ex) String s = str1+str2;
// 문자열과 문자열을 더하면 내부적으로는 아래와 같이 실행
String str = new StringBuffer().append("hi").append(" ").append("bye").toString();
System.out.println(str);
StringBuffer 클래스는 자기 자신의 메소드를 호출하여 자기 자신의 값을 바꿔나가는
메소드체이닝을 사용할 수 있다.
// 1번
String s = "";
for(int i=0;i<100;i++) {
s +="*";
}
System.out.println(s);
// 2번
StringBuffer sb = new StringBuffer();
for(int i=0;i<100;i++) {
sb.append("*");
}
String s2 = sb.toString();
System.out.println(s2);
// 실행 시간 측정 코드
//long startTime = System.nanoTime();
// 작업 코드
//long endTime = System.nanoTime();
//System.out.println(String.format("코드 실행 시간: %20dns", endTime - startTime));
1번은 실제로 100개의 String 객체가 내부에 만들어지는 것과 같아 좋지 않은 코드가 된다.
2번은 1번과 다르게 StringBuffer 클래스의 append 메소드를 이용해서 문자열을 바로 추가할 수 있게 된다.
실제로 1번보다 2번이 실행 시간이 단축됨을 확인할 수 있다.
4) Math 클래스
생성자가 private으로 되어 있기 때문에 new 연산자를 이용하여 객체를 생성할 수 없다.
객체를 생성할 수 는 없지만 모든 메소드와 속성이 static으로 정의되어 있어
객체를 생성하지 않고 사용할 수 있다.
ex) Math.max(), Math.min(), Math.abs(), Math.random(), Math.sqrt() 등
'강의 정리하기 > JAVA' 카테고리의 다른 글
Generic (0) | 2023.03.09 |
---|---|
기본 API 클래스(2) - 컬렉션 (0) | 2023.03.09 |
Exception 예외처리(2) (0) | 2023.03.07 |
Exception 예외 처리(1) (0) | 2023.03.07 |
중첩 클래스와 익명 클래스 (0) | 2023.03.07 |