[Java] java.lang패키지 유용한 클래스

ref- Java의 정석(남궁성) 도우출판

📌java.lang패키지

  • 가장 기본이 되는 클래스들을 포함 import문 없이 사용가능.

📌object 클래스란?

  • object 클래스는 모든 클래스의 최고 조상.
  • 부모가 없는 클래스는 자동적으로 object 클래 스를 상속받는다.
  • 모든 클래스는 object클래스에 정의돈 11개의 메서드를 상속받는다(to string () , equals(object obj), hashcod….)
  • 11개의 메서드를 정의하지 않아도 사용할수있다.

  • object 클래스에서 제공하는 메서드를 알아보자.

✅equals()

  • 매개변수로 객체의 참조변수를 받아서 비교해, 그 결과를 boolean값으로 알려주는 메소드 => 즉 객체의 주소비교 메서드
package lang;

public class Ex9_1 {
    public static void main(String[] args) {
        Value v1 = new Value(10);
        Value v2 = new Value(10);

        if (v1.equals(v2)) {
            System.out.println("v1과 v2는 같습니다.");
        } else {
            System.out.println("v1과 v2는 다릅니다");
        }

    }
}

    class Value {
        int value;

        Value(int value) {
            this.value = value;
        }

        //Object 의 equals()를 오버라이딩해서 주소가 아닌 value 값을 비교
        public boolean equals(Object obj) {
            //return this == obj ;//주소비교
            //참조변수의 형변환 전에는 반드시 instanceOf 로 확인
            if (!(obj instanceof Value)) return false;
                Value v = (Value) obj; //obj를 value를 형변환}
                return this.value == v.value;
        }
    }

/*출력
v1과 v2는 다릅니다
v1과 v2는 같습니다
*/

  • 객체의 주소값이 아닌, 인스턴스에 Value값을 비교 하고싶을떄는 equals() 메서드를 오버라이딩 하여 주소가 아닌 객체에 저장된 내용을 비굑하도록 변경하면된다.

  • String(비롯한 Date, File, Wrapper [Integer, Double]) 클래스에서는 Object의 equals를 그대로 사용하는 것이 아닌, 오버라이딩으로 주소가 아닌 ‘값’을 비교하게 한다.


✅toString()

  • 인스턴스에 대한 정보를 문자열String로 제공할 목적으로 정의한 메서드이다.
class Card {
    String kind;
    int number;
    
    Card() {
        this("SPADE", 1);
    }
    
    Card(String kind, int number) {
        this.kind = kind;
        this.number = number;
    }
}
 
public class CardToString {
    public static void main(String[] args) {
        Card c1 = new Card();
        Card c2 = new Card();
        
        // toString()메소드 오버라이드 x
        System.out.println(c1);
        System.out.println(c2);
        
        System.out.println(c1.toString());
        System.out.println(c2.toString());
    }
}

/*출력
object.Card@50f8360d
object.Card@2cb4c3ab
*/

📌String 클래스

  • String 클래스 = 데이터(char[]) + 메서드(문자열 관련)
  • 내용을 변경할 수 없는 불변(immutable) 클래스 이며 String 클래스는 앞에 final이 붙어 있으므로 다른 클래스의 조상이 될 수 없다.
  • 문자열의 결합이나 변경이 잦다면, 내용을 변경가능한 StringBuffer를 사용
String a = "a";
String b = "b"
    a = a + b;

image description


✅String 클래스 메서드

image description


✅문자열 비교

문자열을 만들 떄는 문자열 리터럴을 지정하는 방법과, new 키워드를 이용하여 만드는 방법이있다..

String str1 = "abc";  //문자열 리터럴 "abc"의 주소가 str1 에 저장됨
String str2 = "abc";  //문자열 리터럴 "abc"의 주소가 str2 에 저장됨
String str3 = new String("abc");
String str4 = new String("abc");

String 클래스이 생성자를 이용한 경우에는 new 연산자에 의해서 메모리 할당이 이루어지기 떄문에 항상 새로운 String 인스턴스가 생성된다.
그러나 문자열 리터럴은 이미 존재하는 것을 재사용하는것이다.


✅문자열 리터럴

  • 문자열 리터럴은 프로그램 실행시 자동으로 생성된다(constant pool(상수)에 저장)

✅기본형 값을 String 으로 변환

  • 기본형을 문자로 변경하는 방법
    1. 숫자에 빈 문자열”“을 더해주기
    2. valueOf() 사용.(속도가 더빠름)
      => 성능은 valueOf가 더 좋지만, 빈 문자열이 방법이 간단하기 쉽기떄문에 성능이 필요한 경우에만 valueOf를 사용 권장.
int i = 100;
String str1 = i + ""; // 숫자 100을 "100"으로 변환하는방법1
String str2 = String.valueOf(i); // 100을 "100"으로 변환하는 방법2

s —

📌StringBuffer 클래스

  • String과 똑같지만 그러나 buffer는 내용을 변경할 수있다.
  • StringBuffer 인스턴스를 생성할 떄는 생정자 StringBuffer(int length)를 사용해서 StringBuffer인스턴스에 저장된 문자열의 길이를 고려하여 충분히 여유있는 크기로 지정하는게 좋다.
  • StringBuffer인스턴스를 생성할떄, 버퍼의 크기를 지정해주지 않으면 디폴트 16개의 문자를 지정할수 있는 크기의 버퍼를 생성한다.

✅사용이유

  • 메모리의 낭비를 줄이기 막기위해서 이다.

세부사항

  • 배열을 처음 생성한다면 길이를 변경할수없다. 공간이 부족하면 새로운 배열을 생성해야한다. 1.새로운 배열을 생성, -> 2. 내용 복사, -> 3.참조변경  이러한 일들이 반복된다면 성능이 떨어짐

이러한 이유들로 StringBuffer를 사용한다. 간단하게 예시코드를 살펴보자


//StringBuffer의 생성자 

public StringBuffer(int length){
    value = new Char[length];
    shared =false;
}
public StringBuffer(){
    this(16); // 버퍼의 크기를 지정하지 않으면 버퍼의 키그니느 16이된다.
}
public StringBuffer(String str){
    this(Str.length() + 16);    // 지정한 문자열의 길이보다 16이 더크게 버퍼를 생성한다.
    append(Str);               
}


class Ex9_11 {
    public static void main(String[] args) {
        //StringBuffuer 클래스란-> 문자열을 저장하는 클래스
        StringBuffer sb  = new StringBuffer("abc");
        StringBuffer sb2 = new StringBuffer("abc");

        System.out.println("sb == sb2 ? " + (sb == sb2));
        System.out.println("sb.equals(sb2) ? " + sb.equals(sb2));

        // StringBuffer의 내용을 String으로 변환한다.
        String s  = sb.toString(); // String s = new String(sb);와 같다.
        String s2 = sb2.toString();

        System.out.println("s.equals(s2) ? " + s.equals(s2));
    }
}

/*출력
sb == sb2 ? false 
sb.equals(sb2) ? false 
s.equals(s2) ? true
*/
  • StringBuffer클래스는 equlas() 메서드를 오버라이딩 하고있지않다. StringBuffer를 String으로 변환하여 비교해야힌다. 때문에  toString()을 사용하여 비교하여야한다.

✅StringBuilder란?

  • StringBuffer는 멀티쓰레드에 안전하도록 동기화 되어있다. . 멀티 쓰레드로 작성된 프로그램이 아닌경우 StringBuffer의 동기화는 불필효가게 성능만 떨어트리게 된다. 그래서 StringBuffer에서 쓰레드의 동기화만 뺸 StringBuilder가 새로 추가되었다.

📌래퍼(wrapper)클래스

  • 기본형(primitive type)변수를 객체로 다룰 수 있게 한 클래스이다
    (기본형 타입을 객체로 다뤄야할 필요가 있을떄 쓰인다.)

✅autoboxing vs unboxing

image description

Integer intWrap = inter.valueOf(10); //jdk 1.5 버전 전에는 이렇게 Autoboxing을 해서 데이터를 포장했어야함
int number = intWrap.intValue();    //jdk 1.5 버전 전 unboxing 작업  

Interger intWrap = 10; // Auto Boxing 
int number = intWrap; //Unboxing

  • 해당 예제를 보면 Interg Wrapper 클래스에 intWrap 참조변수에는 10 이라는 기본형 값을 담을수없다.
  • 그래서 이러한 기본형 값을 래퍼 클래스이 객체로 변환해주어야 가능하다.
  • jdk1.5 버전 전에는 저렇게 변환할떄 inter.valueof // intWrap.intValue 기입을 해줘야만했다
  • jdk1.5 버전이후에 기본형 값을 래퍼 클래스의 객체로 자동 변환해주는것을 “autoboxing”이라고한다
  • 그반대로 참조타입을 인트타입으로 값을 꺼낼떄는 “unboxing” 이라고 부름.

📌 java.util.StringTokenizer 클래스란?

  • 긴 문자열을 지정된 구분자(delimiter)를 기준으로 토큰(token)이라는 여러 개의 문자열로 잘라내는데 사용댄다. 예) “100,200,300,400” 이란 문자열이 있을떄 “,”를 구분자로 잘라내면 “100”,”200”,”300”,”400” 이라는 4개의 문자열 토큰을 얻을수 있다.

  • StringTokenizer를 이용하는 방법 이외에도 아래와 같이 String split(String regex)이나 Scanner의 useDelimiter(String patter)을 사용할수 있지만 이 두 방법 은 ‘정규식 표현’ 을 사용해야 하므로 정규식 표현에 익숙지 않다면 stringTokenzie를 사용하는것이 간단하면서 명확한 결과를 얻을수있다.

  • StringTokenizer의 구분자로는 단 하나의 문자 밖에 사용하지 못하기 떄문에 , 보다 복잡한 형태의 구분자로 문자열을 나누어야 할떄는 어쩔수 없이 정규식으로 사용하는 메서드를 사용해야한다.

class StringTokenizerEx1 {
    public static void main(String[] args){
        String source = "100,200,300,400";
        StringTokenizer st = new StringTokenizer(source, ",") 


        while(st.hasMoreToken()){
            System.out.println(st.nextToken());
        }
    }// main
}


/*출력
100
200
300
400
*/

Categories:

Updated:

Leave a comment