국비/Java

[13-2] Java - API java.lang패키지, String /Math 클래스와 주요 메소드

제발 취업하게 해주세요 2022. 4. 25. 22:45
자바 API란?
- 자바에서 개발에 필요한 주요 기능을 미리 컴파일하여 묶어놓은 패키지
java.lang.*; 패키지
- 보이지는 않지만 항상 import되어있음! (import문 없이 사용 가능)
- 자바 프로그래밍을 하면서 필수적인 클래스를 모아둔 패키지

 

Math클래스
* 특징
 - java.lang이라는패키지 안에 존재한다
 - 모든 필드와 메소드가 static으로 되어있다.
 - 객체를 생성할 필요가 없기 때문에 생성자가 private이다
 - 모든게 static이기 때문에 객체 생성할 필요 x
  => 싱글톤패턴
      (프로그램 실행과 동시에 메모리 영역에 올려놓고 재사용 하는 개념)
      (객체 하나만으로 어디에서든지 가져다 쓸 수 있는 개념 == 공유)
0. 파이 => Math 클래스 내에 상수필드로 정의되어 있음

- Math.PI

 1. 올림 => Math.ceil(double) : double

double num1 = 4.24242;
System.out.println("올림 : " + Math.ceil(num1));  // 5.0

 2. 반올림 => Math.round(double) : long

System.out.println("반올림  : " + Math.round(num1)); //4

 3. 버림 => Math.floor(double) : double

System.out.println("버림 : " + Math.floor(num1)); //4.0

 4. 절대값 => Math.abs(int/double/long/float) >> 오버로딩 적용
// int/double/long/float 그대로

int num2 = -13;
System.out.println("절대값 : " + Math.abs(num2)); //13

 5. 최소값 => Math.min(int, int) : 반환형 int

System.out.println("최소값 : " + Math.min(5,  10)); //5

 6. 최대값 => Math.max(int, int) : int

System.out.println("최대값 : " + Math.max(5, 10)); //10

 7. 제곱근(루트) => Math.sqrt(double) : double

System.out.println("4의 제곱근 : " + Math.sqrt(4)); //2.0

 8. 제곱 => Math.pow(double, double) : double

System.out.println("2의 5제곱 : " + Math.pow(2, 5)); //32.0

 

String 클래스 ☆☆☆☆☆☆☆☆
* 특징
 - 불변클래스(변하지 않는 클래스)
 - 수정하는 순간 기존의 값이 담겨져 있는 공간에서 수정되지 않음

* String 클래스의 객체 생성 방법
1. new 키워드로 생성자 호출 >> XXXXXXXXXXXX 이방법 쓰지마!!
2. 대입연산자를 통해서 직접 값을 넣어서 생성 >> String은 이 방법만 가능!!!

((대입연산자 사용시 주의))
String a = "a";
String b = "a";
System.out.println("결과 : " + a == b); // false
System.out.println("결과 : " + (a == b)); // true 대입연산자 우선순위 주의!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

1. 생성자를 통해서 문자열 담기 >> 이 방법은 잊어버려
public void method1() {
		String str = new String ("hello"); //hello
		String str2 = new String ("hello"); //hello
	
		// toString
		System.out.println(str.toString());
		System.out.println(str2);
		// 1. String 클래스의 toStriong()의 경우
		// 실제 담겨있는 문자열을 반환하게끔 오버라이딩 되어있음
		
		// equals()
		System.out.println(str.equals(str2)); // true
		// true => 문자열을 비교했는데 동일하다.
		// 2. String클래스의 equals()의 경우 
		// 주소값 비교가 아닌 문자열 비교를 하도록 오버라이딩 되어 있음 
		
		// hashCode()
		// 16진수의 주소값 => 10진수 형태
		System.out.println(str.hashCode()); //99162322
		System.out.println(str2.hashCode()); //99162322
		// String 클래스의 hashCode()
		// 주소값을 변환해주는 것이 아닌 실제 담긴 문자열을 기반으로 해시코드 값을 만들어서 반환
		// 같은 Hello가 들어있어서 해시코드가 똑같이 나옴
		
		// 진짜 주소값을 알고싶다면??
		// System.identityHashCode(참조형변수명);
		System.out.println(System.identityHashCode(str)); //1829164700
		System.out.println(System.identityHashCode(str2)); //2018699554
		// 실제 주소값의 해시코드 출력
		// str1과 str2의 주소값이 다르다!
		
		// ==
		System.out.println(str == str2); // false 찐 주소값 비교
		}
2. 문자열을 리터럴로 생성
	public void method2() {
		String str1 = "hello";
		String str2 = "hello";
		
		//toString()
		System.out.println(str1); // hello
		System.out.println(str2); // hello
		
		// equals()
		System.out.println(str1.equals(str2)); //true
		
		// hashCode()
		System.out.println(str1.hashCode()); //9962322
		System.out.println(str2.hashCode()); //9962322
		
		// System.identityHashCode()
		System.out.println(System.identityHashCode(str1)); //1829164700
		System.out.println(System.identityHashCode(str2)); //1829164700
		// 두 개의 찐주소가 같다??
		
		System.out.println(str1 == str2); // true
	}
StringPool
 - 특징 : 동일한 내용의 문자열이 존재할 수 없다
 - 매번 새로운 주소값 참조

String str = "hello";
// 리터럴 대입시 string pool 영역에 올라감

System.out.println(System.identityHashCode(str)); //1829164700

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

// 연결이 끊긴 문자열들은 가비지콜렉터가 알아서 정리해줌
// 불변이라고 해서 아예 수정이 안되는 것이 아니라
// 매번 새로운 주소값을 참조한다는 뜻
StringBuffer / StringBuilder
 * StringBuffer
- 문자열 안의 내용이 변경될 때마다 새로운 공간을 할당하여 새로 집어넣는다
- 이를 막기 위해 임시공간(buffer)을 하나 준비하여 차곡차곡 담아두었다가 한번에 처리해주는 클래스
- 동시제어기능(Thread Safe)을 가진다
 => 충돌 가능성이 있어 동시제어 기능이 필요한 경우에만 사용
- 간단한 프로그램 구현이나 동시제어를 다른 프로그램이 제공하는 경우 굳이 버퍼를 쓸 필요가 없다.

StringBuffer sb = new StringBuffer();

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

sb.append("World!");
System.out.println("Hello World!".hashCode()); // -969099747
System.out.println(sb.hashCode()); // 1829164700

System.out.println("결과 : " + sb); // HelloWorld!
 * StringBuilder
 - StringBuffer에서 동시제어기능만 뺀 클래스
 - 기본적으로 Builder 사용
 - 결과는 StringBuffer와 같음

StringBuilder sb = new StringBuilder();

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

sb.append("World!");
System.out.println("Hello World!".hashCode()); // -969099747
System.out.println(sb.hashCode()); // 2018699554

System.out.println("결과 : " + sb); // HelloWorld!

 

문자열과 관련된 메소드
String str1 = "Hell World!";
// 메소드명(매개변수) : 반환형
1. 문자열.charAt(int index) : char

char ch = str1.charAt(4);
System.out.println("ch : " + ch);

2. 문자열.concat(String str) : String
 => 문자열과 전달받은 또 다른 문자열을 하나로 합쳐서 반환
 => 문자열 + str

String str2 = str1.concat("!!!!!!!!!!!!!!!!11");
System.out.println("str2 : " + str2);

3. 문자열.length() : int
  => 문자열 길이를 반환(공백 포함, 메소드)

/* int [] arr = new int[1];
int a = arr.length; // 필드*/

System.out.println("str1의 길이 : " + str1.length());

 4. 문자열.substring(int beginindex) : String ☆☆자주쓰임☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
  => 문자열의 beginindex위치에서 문자열 끝까지의 문자열을 추출해서 리턴, 문자열을 자르는 것
       문자열.substring(int beginindex, int endindex)
  => 문자열 beginindex위치에서 endindex까지의 문자열을 추출해서 리턴

// 0 1 2 3 4 5 6 7 8 9 10
//   H e l l   W o r l d !
System.out.println(str1.substring(6)); // orld!
System.out.println(str1.substring(0, 6)); // Hell W

5. 문자열.replace(char old, char new) : 반환형 String
문자열에서 old문자를 new문자로 변환한 문자열을 리턴(치환)

String str3 = str1.replace('l', 'x');
System.out.println("str3 : " + str3); // Hexx Worxd!

 6. 문자열.trim() : String
 => 문자열의 앞 뒤 공백을 제거한 문자열을 리턴

String str4 = "   J       A         V          A         ";
System.out.println("trim : " + str4.trim()); // 앞뒤공백만 날림 "J       A         V          A"

 7. 문자열.toUpperCase() : String
 모든 문자를 대문자로 변경 후 문자열 리턴
 문자열.toLowerCase() : String
 모든 문자를 소문자로 변경 후 문자열 리턴

System.out.println("toUpperCase : " + str1.toUpperCase());
System.out.println("toLowerCase : " + str1.toLowerCase());

8. 문자열.toCharArray() : char[ ]
문자열의 각 문자들을 char[ ] 배열에 옮겨담은 후 해당 배열을 리턴

char[ ] chArr = str1.toCharArray();
for(int i = 0; i < chArr.length; i++) {
System.out.print(chArr[i] + " ");
}

// char[] => String
char[] arr = {'a', 'p'};
System.out.println(" ");
System.out.println(String.valueOf(arr)); // char형 배열을 String으로