[프로그래머스] 자바 중급 java.lang 패키지

정현우·2021년 3월 26일
2

Java Basic

목록 보기
2/8
post-thumbnail

java.lang 패키지

자바는 기본적으로 다양한 패키지를 지원 그중에서 가장 중요한 패키지, java.lang패키지의 클래스는 import를 하지 않고도 사용할 수 있다.

Wrapper클래스

  • 기본형타입을 객체로 변환시킬때 사용
  • Boolean, Byte, Short, Integer, Long, Float, Double 클래스, 모든 클래스의 최상위 클래스인 Object도 java.lang패키지.
  • 문자열과 관련된 String, StringBuffer, StringBuilder도 모두 java.lang패키지.
  • 화면에 값을 출력할때 사용했던 System클래스도 java.lang패키지
  • 수학과 관련된 Math클래스도 java.lang패키지.
  • Thread와 관련된 중요 클래스들이 java.lang패키지, 이외에도 다양한 클래스와 인터페이스가 java.lang패키지에 속해 있다. 참고!
public class WrapperExam {
    public static void main(String[] args) {
        int i = 5; 
        Integer i2 = new Integer(5);
        Integer i3 = 5;                      //오토박싱
        
        int i4 = i2;                         //오토언박싱
        long i2_long = i2.longValue();
        long i4_long = i4.longValue();       // 오류 발생!
    }
}    

원시형, 참조형

오토박싱(Auto Boxing)

  • Integer i3 = 5; 숫자 5는 원래 기본형이지만 자동으로 Integer형태로 변환된다.

오토 언박싱(Auto unboxing)

  • int i5 = i2; Integer객체타입의 값을 기본형 int로 자동으로 변환되어 값을 할당한다.
  • 오토박싱(Auto Boxing), 오토 언박싱(Auto unboxing) 은 JAVA 5부터 지원한다. 이 때 내부적으로 Wrapper클래스들이 사용된다.

String(스트링) 클래스

  • 스트링버퍼 : 아무 값도 가지고 있지 않은 StringBuffer객체를 생성
  • StringBuffer가 가지고 있는 메소드들은 대부분 자기 자신, this를 반환

메소드 체이닝

  • 자기 자신의 메소드를 호출하여 자기 자신의 값을 바꿔나가는 것을 메소드체이닝 이라고 한다.
  • StringBuffer클래스는 메소드 체인 방식으로 사용할 수 있도록 만들어져 있다.
String str2 = new StringBuffer().append("hello").append(" ").append("world").toString();
System.out.println(str2);
  • StringBuffer는 append메소드 외에도 길이를 구하거나, 자르거나 등의 다양한 메소드들을 가지고 있습니다.

String(스트링) 클래스의 대표적인 문제점

  • 불변 클래스임
  • String클래스를 사용할 때 가장 문제가 발생하는 경우는 다음과 같은 코드를 사용할 때 입니다.
String str3 = str1 + str2;
System.out.println(str3);
  • 문자열과 문자열을 더하게 되면 내부적으로는 다음과 같은 코드가 실행
String str4 = new StringBuffer().append(str1).append(str2).toString();

// 아래 코드로 직접 확인해보자!!
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);
    }
}
  • 문자열을 반복문 안에서 더하는 것은 성능상 문제가 생길 수 있으니 반드시 피하도록 합시다!
  • '+'을 쓸꺼면 그냥 StringBuffer Object 만들어서 append 메소드 사용!

Math

  • 클래스는 이름 그대로 수학계산을 위한 클래스!
  • max, min 알고리즘 풀때 지인짜 많이 쓰게 됨! 특히 dp..
  • Math클래스는 생성자가 private으로 되어 있기 때문에 new 연산자를 이용하여 객체를 생성할 수 없다.
  • 객체를 생성할 수는 없지만 모든 메소드와 속성이 static으로 정의되어 있기 때문에 객체를 생성하지 않고도 사용할 수 있다.
int value1 = Math.max(5, 20);    // value1 = 5    :  5, 20중 큰 값을 고릅니다.
int value2 = Math.min(5, -5);    // value2 = -5   :  5, -5중 작은 값을 고릅니다.
int value3 = Math.abs(-10);      // value3 = 10   :  -10의 절댓값을 구합니다
double value4 = Math.random();   // 0이상 1.0 미만의 랜덤한 실수값을 구합니다.
double value5 = Math.sqrt(25);   // value5 = 5.0  :  25의 제곱근을 구합니다.

// print 실습
System.out.println("2의 10승 = " + Math.pow(2, 10));
System.out.println("16의 1/2승 = : " + Math.pow(16, 0.5));
System.out.println("log200 = " + Math.log10(200));
profile
도메인 중심의 개발, 깊이의 가치를 이해하고 “문제 해결” 에 몰두하는 개발자가 되고싶습니다. 그러기 위해 항상 새로운 것에 도전하고 노력하는 개발자가 되고 싶습니다!

0개의 댓글