Programming/JAVA

[JAVA] Math 클래스 / 영어 문장의 첫글자를 대문자로 바꾸는 예제 / 문자열 비교 toString() / equals() / hashCode()

Jayna. 2023. 12. 29. 16:38
728x90

 

>> Math 클래스

 - java.lang 이라는 패키지 안에 존재한다.

 - 모든 필드와 메소드가 다 static으로 되어있다.

 - 객체를 생성할 필요가 없으므로 생성자가 private이다.

 

// 파이 => Math클래스 내에 상수필드로 정의되어있음
System.out.println("파이 " + Math.PI);

// 메소드
// 메소드명(매개변수 타입)
// 1. 올림 => math.ceill(double) : 반환형 double
double num1 = 4.424242;
System.out.println("올림 : " + Math.ceil(num1));

// 2. 반올림 => Math.round(double) : 반환형 long
System.out.println("반올림 : " + Math.round(num1));

// 3. 버림 => Math.floor(double) : 반환형 double
System.out.println("버림 : " + Math.floor(num1));

// 4. 절대값 => Math.abs(int/double/long/float)
// : 반환형 int/double/long/float 그대로
int num2 = -13;
System.out.println("절대값 : " + Math.abs(num2));

// 5. 최솟값 => Math.min(int, int) : 반환형 int
System.out.println("최솟값 : " + Math.min(5, 10));

// 6. 최댓값 => Math.max(int, int) : 반환형 int
System.out.println("최댓값 : " + Math.max(5, 10));

// 7. 제곱근(루트) =// 7. 제곱근(루트) => Math.sqrt(double) : 반환형 double
System.out.println("4의 제곱근 : " + Math.sqrt(4));

// 8. 제곱 => Math.pow(double, double): 반환형 double
System.out.println("2의 10제곱: " + Math.pow(2,10));

실행결과

 

728x90

 

>> 첫글자를 대문자로 바꾸는 예제

public void method() {

    System.out.print("영어를 입력하시오(띄어쓰기 포함) : ");
    Scanner sc = new Scanner(System.in);
    String str = sc.nextLine();


    String[] arr = str.split(" ");

    for(String s : arr) {

        String s1 = s.substring(0,1);
        String sFirst = s1.toUpperCase();

        String s2 = s.substring(1);
        String sAll =sFirst.concat(s2);

        System.out.print(sAll + " ");
    }	
}	


public void method1() {

    System.out.print("영어를 입력하시오(띄어쓰기 포함) : ");
    Scanner sc = new Scanner(System.in);
    String str = sc.nextLine();


    String[] arr = str.split(" ");
    for(String s : arr) {
        System.out.print(s.toUpperCase().charAt(0) 
                       + s.substring(1,s.length()) + " ");
    }

}

실행결과

728x90

 

>> 문자열 비교 toString() / equals() / hashCode()

// 1. 생성자를 통해서 문자열 담기
public void method1() {

    String str1 = new String("hello");
    String str2 = new String("hello");

    // toString() 메소드
    System.out.println(str1/*.toString()*/);
    System.out.println(str2);
    // 1. String 클래스의 toString() 메소드의 경우
    // 실제 담겨있는 문자열을 반환하게끔 오버라이딩이 되어 있음

    // equals() 메소드
    System.out.println(str1.equals(str2));
    // true => 문자열의 내용을 비교해봤는데 동일하다
    // 2. String 클래스의 equals() 메소드의 경우
    // 주소값 비교가 아닌 문자열 비교를 하도록 오버라이딩 

    // hashCode() 메소드
    // 16진수 주소값 -> 10진수의 형태로
    System.out.println(str1.hashCode());
    System.out.println(str2.hashCode());
    // 3. String 클래스의 hashCode()
    // 주소값을 변환해주는 것이 아닌 실제 담긴 문자열을 기반으로
    // 해시코드 값을 만들어서 반환

    // 진짜 주소값을 알고 싶다면?
    // System.identityHashCode(참조형변수명) ;
    System.out.println(System.identityHashCode(str1));
    System.out.println(System.identityHashCode(str2));
    // 실제 주소값의 해시코드를 출력
    // str1 과 str2의 주소값이 다르다!

    // == 주소값 동등비교
    System.out.println(str1 == str2);   // false
}

// 2. 문자열을 리터럴로 생성
public void method2() {

    String str1 = "hello";
    String str2 = "hello";

    //toString 메소드
    System.out.println(str1);
    System.out.println(str2);

    //equals 메소드
    System.out.println(str1.equals(str2));   //true

    // hashCode 메소드
    System.out.println(str1.hashCode());
    System.out.println(str2.hashCode());

    // System.identityHashCode()
    System.out.println(System.identityHashCode(str1));
    System.out.println(System.identityHashCode(str2));
    // ? 두 개의 찐주소값이 똑같다?

    System.out.println(str1 == str2);   // true

}

// String 클래스 String Pool

public void method3() {

    String str = "hello";
    // 리터럴 대입 시 String Poll 영역에 올라감
    // String Pool의 특징 : 동일한 애용의 문자열이 존재 불가하다
    System.out.println(System.identityHashCode(str));

    str = "goodbye";
    System.out.println(System.identityHashCode(str));

    // 연결이 끊긴 문자열들은 가비지 콜렌터가 알아서 정리해줌
    // 불변이라고 해서 아예 수정이 안되는 것이 아니라
    // 매번 새로운 주소값을 참조한다 라는 뜻

    str += "abc";
    System.out.println(System.identityHashCode(str));
    str += "abc";
    System.out.println(System.identityHashCode(str));

    String a = "a";
    String b = "a";

    System.out.println("결과 : " + a == b); // false
    System.out.println("결과 : " + (a == b)); // 결과 : true
}

public void method4() {
    // StringBuffer
    // 문자열은 안에 내용이 변경될 때마다 새로운 공간을 할당하고 새로 집어넣는다.
    // 이를 막기 위해 임시공간(buffer)을 하나 준비하여
    // 임시공간에 차곡차곡 담아두었다가 한번에 처리해주는 클래스가
    // StringBuffer / StringBuilder 이다.


    StringBuffer sb = new StringBuffer();

    sb.append("Hello");
    System.out.println("Hello".hashCode());
    System.out.println(sb.hashCode());

    sb.append(" world!");
    System.out.println("Hello World!".hashCode());
    System.out.println(sb.hashCode());

    String str = sb.toString();
    System.out.println("결과 : " + sb);
    // StringBuffer는 동시제어 기능(Thread Safe)기능을 가진다.
    // 하지만, 간단한 프로그램 구현이나, 동시제어를 다른 프로그램이 제공하는 경우
    // 굳이 버퍼까지..? 동시제어를 구현할 필요는 없다 -- TooMuch
    // 이 기능만 쏙 뺀 클래스가 필요했는데 그게 StringBuilder.
}

public void method5() {
    // StringBuilder

    StringBuilder sb = new StringBuilder();

    sb.append("Hello");
    System.out.println("Hello".hashCode());
    System.out.println(sb.hashCode());

    sb.append(" World!");
    System.out.println("Hello World!".hashCode());
    System.out.println(sb.hashCode());

    System.out.println("결과 : " + sb);
}
728x90