java lang/ Object/ StringBuffer/ equals

cornpip·2023년 5월 8일
2

자바

목록 보기
19/19
post-thumbnail

23.5.2 ~ 23.5.19 사전 캠프 기간의 TIL 기록이다.
TIL: Today I Learned

java.lang package

Object

Object class는 모든 클래스의 최고 조상이다.
기본적으로 Object.equals() 는 인스턴스의 주소값으로 비교한다.
Strings.equals() 같은 경우는 String class에서 오버라이딩해서 사용하는 것으로 주소값이 아닌 인스턴스의 멤버변수를 비교한다.
비교연산자(==)는 주소값을 비교한다.

public class Main {
    public static void main(String[] args) {
        String a = new String("hello");
        String b = new String("hello");
        System.out.println(a.equals(b));
        System.out.println(a == b);

        Value a2 = new Value(10);
        Value b2 = new Value(10);
        System.out.println(a2.equals(b2));
    }
}

class Value{
    int value;

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

결과
true
false
false

String

String은 immutable 클래스다.
String + String은 새로운 String 인스턴스가 생성되는 것으로 문자열을 다루는 작업이 많이 필요하면 StringBuffer 클래스를 활용한다.

public class Main {
    public static void main(String[] args) {
        String a = new String("h");
        String b = new String("h");
        System.out.println(a == b);

        String a2 = "h";
        String b2 = "h";
        System.out.println(a2 == b2);
    }
}

new String은 새로운 인스턴스를 생성하고 리터럴 지정은 이미 존재하는 것을 재사용한다.

public class Main {
    public static void main(String[] args) {
        long a = 100L;
        String b = "100L";

        String a2 = String.valueOf(a);
        long b2 = Long.parseLong(b);
    }
}

String.valueOf(): 기본형 -> 문자열
{Wrapper}.parse{Wrapper}(): 문자열 -> 기본형

StringBuffer

length를 지정안하면 bufferSize=16
문자열로 생성하면 bufferSize=문자열.length()+16

equals() 메서드가 오버라이딩 되어있지 않아 비교연산자(==)로 비교한 것과 같은 결과를 얻는다.

메서드는 append(), capcity(), charAt(), delete(), insert(), replace(), toString(), substring() 등이 있다.
String에 있는 기능 웬만큼 된다.

Stringbuffer는 멀티쓰레드에 안전하도록 동기화되어 있다.
동기화는 Stringbuffer성능을 떨어뜨리기에 동기화만 빼고 똑같은 StringBuilder 클래스가 있다.
멀티쓰레드를 사용하지 않는다면 StringBuilder가 성능에 좋으나 StringBuffer도 충분히 성능이 좋기 때문에 굳이 신경 쓰지 말자.

Math

round(), ceil(), floor() 전부 소수점 첫째자리에서 반올림한다.
반올림하려는 지점까지 10^n 곱하고 반올림 후 곱한만큼 나눠준다.

public class Main {
    public static void main(String[] args) {
        float a = 123.51262f;
        a *= Math.pow(10, 2);
        a = Math.round(a);
        a /= Math.pow(10, 2);
        System.out.println(a);
    }
}

결과
123.51

int, long, float, double 잘 확인하자.
ceil(), floor()는 double을 반환하고 round()는 long을 반환한다.

Wrapper

Wrapper class는 모두 equals()가 오버라이딩되어 있어서 주소가 아닌 값을 비교한다. ( 최근 자바에서 확인하면 비교연산자(==)도 값을 비교한다. )
toString()도 오버라이딩되어 있어서 객체가 가지고 있는 값을 문자열로 변환하여 반환한다.

{Wrapper}.parse{Wrapper}("문자열"): 문자열 -> 기본형
{Wrapper}.valueOf("문자열"): 문자열 -> 래퍼 클래스

profile
https://cornpip.tistory.com 티스토리로 이전했습니다!

0개의 댓글