럿고의 개발 노트
[프로그래머스] 자바 중급 > Part2. java.lang 패키지 본문
[프로그래머스] 자바 중급
Part2. java.lang 패키지
1. java.lang 패키지 / 오토박싱
자바는 기본적으로 다양한 패키지를 지원하는데, 그 중에 가장 중요한 패키지가 java.lang 패키지이다.
import를 사용하지 않고도 사용 가능합니다.
기본형타입을 객체로 변환시킬때 사용하는 Wrapper 클래스가 존재합니다.
- Boolean, Byte, Short, Integer, Long, Float, Double
모든 클래스의 최상위 클래스(Object), 문자열(String, StringBuffer, StringBulider), 값 출력(System), 수학(Math), 쓰레드(Thread)와 관련된 중요 클래스들이 존재
오토박싱(Auto Boxing) : 기본형을 자동으로 객체형(참조형)으로 변환
오토언박싱(Auto Unboxing) : 객체형(참조형)을 기본형으로 자동 변환
오토박싱, 오토언박싱은 Java5부터 지원하며 내부적으로 Wrapper 클래스들이 사용
public class WrapperExam {
/*
* java.lang 패키지 import를 하지 않아도 사용 가능 기본형타입을 객체로 변환시킬때 사용하는 Wrapper클래스가 있음 클래스가
* 존재하는게 아니라 각각의 클래스를 모아서 지칭하는 언어 Boolean, Byte, Short, Integer, Long, Float,
* Double 클래스 최상위 클래스인 Object도 java.lang 패키지 String, StringBuffer,
* StringBuilder, System, Math..... Thread와 관련된 중요 클래스
*/
public static void main(String[] args) {
int i = 5; // 기본형타입
Integer i2 = new Integer(5); // Wrapper클래스 / 참조형(객체형)
Integer i3 = 5; // 숫자5는 기본형이지만, 자동으로 객체형이 됨, 이 개념을 오토박싱이라고 함
// JAVA5부터 지원
// 오토박싱 - 기본타입데이터를 객체타입의 데이터로 자동 형변환 시켜주는 기능
int i4 = i3.intValue(); // int형에다가 Ineger형을 넣을때는 intValue같은 메서드를 사용했어야 함
int i5 = i3; // Java5부터는 바로 꺼내서 사용할수도 있음
// 오토언박싱 : 오토박싱과 반대로 객체 타입의 데이터를 기본형 타입 데이터로 자동 형변환
}
}
2. StringBuffer
아무것도 가지고 있지 않는 객체를 생성
StringBuffer가 가지고 있는 메소드들은 대부분 자기 자신(this)을 반환
자기 자신의 메소드를 호출하여 자기 자신의 값을 바꿔나가는 것을 메소드 체이닝이라고 하는데, StringBuffer는 메소드 체이닝 방식을 사용함.
다양한 메소드들이 존재
- append() : 문자열 끝에 추가
- charAt(int index) : index 위치의 문자를 반환
- delete(int start, int end) : start에서 end까지 문자열 중에 삭제한 문자열을 반환
- indexOf(String str) : str의 인덱스 위치 반환
- insert(int offset, String str) : offset 위치에 문자열 데이터 삽입
- reverse() : 문자열의 역순으로 된 문자열 반환
- replace(int start, int end, String str) : start에서 end의 문자열을 str 문자열로 대체하여 반환
- toString() : String으로 반환
- subString() : 일부 문자열을 반환
- Java API12 StringBuffer Specification
public class StringBufferExam {
public static void main(String[] args) {
/* String : 불변클래스
* StringBuffer : 자기 자신이 변하는 클래스
*/
StringBuffer sb = new StringBuffer();
sb.append("hello"); // 문자열 추가 메서드
sb.append(" ");
sb.append("world");
String str = sb.toString(); // toString의 return타입이 String이기때문에 가능
System.out.println(str);
StringBuffer sb2 = new StringBuffer();
StringBuffer sb3 = sb2.append("hello");
if(sb2 == sb3) { // sb2는 자기 자신을 return하기 때문에 같음
System.out.println("sb2 == sb3");
}
// 메소드 체이닝(Method Chaining) : 자기자신을 리턴하여 계속해서 자신의 메소드를 호출하는 방식
String str2 = new StringBuffer().append("hello").append(" ").append("world").toString();
System.out.println(str2);
}
}
3. 스트링 클래스의 문제점(String Class Problem)
불변클래스로 문자열을 연산하게 되면 자체적으로 StringBuffer를 생성하여 연산을 진행하며 String으로 변환 후 반환하는 작업을 한다.
즉, String 연산은 반복적으로 사용하게 되면 반복횟수만큼 StringBuffer가 생성되어 수행하는데, new 연산자가 많을 수록 프로그램 속도는 느려지기 때문에 성능상 피하는 것이 좋음
문자열 연산을 많이 하는 작업을 하게 된다면 StringBuffer를 처음부터 사용하는 것을 추천한다.
public class StringExam {
public static void main(String[] args) {
// String클래스 : 불변클래스, 문자열을 다룰때 사용하는 클래스
String str1 = "hello world";
String str2 = str1.substring(5);
System.out.println(str1); // str1은 substring을 사용했어도 변하지 않음
System.out.println(str2);
String str3 = str1 + str2;
System.out.println(str3);
// String + String을 실행했을때 내부적으로 일어나는 작업
String str4 = new StringBuffer().append(str1).append(str2).toString();
System.out.println(str4);
String str5="";
for (int i = 0; i < 100; i++) {
str5 += "*";
}
// new연산자가 많이 사용될수록 프로그램 속도가 느려짐
// 따라서 위에 사용했던 for문을 사용하는 것은 적절하지가 않음
System.out.println(str5);
StringBuffer sb = new StringBuffer();
// 위 for문과 달리 new연산자가 한번만 사용되기때문에 훨씬 빠름
for (int i = 0; i < 100; i++) {
sb.append("*");
}
String str6 = sb.toString();
System.out.println(str6);
// 따라서 String 연산을 반복문에서 사용하는 것을 최대한 피하는 것이 좋음
// 굳이 사용해야 한다면 StringBuffer를 이용
}
}
public class StringBufferPerformanceTest{
public static void main(String[] args){
// (1) String의 +연산을 이용해서 10,000개의 *를 이어붙입니다.
//시작시간을 기록합니다.(millisecond단위)
long startTime1 = System.currentTimeMillis();
String str="";
for(int i=0;i<10000;i++){
str=str+"*";
}
//종료시간을 기록합니다.(millisecond단위)
long endTime1 = System.currentTimeMillis();
// (2) StringBuffer를 이용해서 10,000개의 *를 이어붙입니다.
//시작시간을 기록합니다.(millisecond단위)
long startTime2 = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
for(int i=0;i<10000;i++){
sb.append("*");
}
//종료시간을 기록합니다.(millisecond단위)
long endTime2 = System.currentTimeMillis();
// 방법(1)과 방법(2)가 걸린 시간을 비교합니다.
long duration1 = endTime1-startTime1;
long duration2 = endTime2-startTime2;
System.out.println("String의 +연산을 이용한 경우 : "+ duration1);
System.out.println("StringBuffer의 append()을 이용한 경우 : "+ duration2);
}
}
4. Math
수학계산을 위한 클래스
삼각함수, 절대값, 랜더값 등을 구할 수 있음
생성자가 private으로 되어 있기 떄문에 new 연산자를 이용하여 객체를 생성할 수는 없지만, 메소드 속성이 static으로 정의되어 있어 객체를 생성하지 않아도 사용이 가능함.
public class MathExam {
public static void main(String[] args) {
// Math 클래스 : 수학 계산을 위한 클래스
// cos, sin, tan, abs, random....
// 생성자 자체가 private로 되어 있기 때문에 new 연산자를 이용하여 객체를 생성할 수 없음
// 그러나 메소드가 모두 static으로 정의되어 있기때문에 객체를 생성하지 않아도 사용 가능
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(Math.random()); // 랜덤값 호출(return double) - 0 ~ 1.0미만
System.out.println(Math.sqrt(25)); // 제곱근 호출
}
}
출처
'Java Note > [프로그래머스] 자바 중급(동영상 강의)' 카테고리의 다른 글
[프로그래머스] 자바 중급 > Part6. 어노테이션 (0) | 2020.02.04 |
---|---|
[프로그래머스] 자바 중급 > Part5. IO (0) | 2020.02.04 |
[프로그래머스] 자바 중급 > Part4. 날짜와 시간 (0) | 2020.02.04 |
[프로그래머스] 자바 중급 > Part3. java.util 패키지 (0) | 2020.01.31 |
[프로그래머스] 자바 중급 > Part1. Object 클래스 (0) | 2019.12.06 |