럿고의 개발 노트

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

Java Note/[프로그래머스] 자바 중급(동영상 강의)

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

KimSeYun 2020. 1. 31. 15:51

[프로그래머스] 자바 중급

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으로 정의되어 있어 객체를 생성하지 않아도 사용이 가능함.

  • Java API12 Math Specification

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)); // 제곱근 호출
    }
}

출처

[프로그래머스] 자바 중급

Comments