*API: Application Programming Interface(애플리케이션 프로그램 인터페이스)
=> 프로그램들이 서로 상호작용하는 것을 도와주는 매개체
<Math 클래스>
== java.lang.Math
: 모든 필드가 상수 필드이며, 모든 메소드가 static 메소드이기 때문에(== 싱글톤 패턴) 객체를 생성해서 불러올 필요가 없음
: 생성자도 private이기 때문에 생성 구문 자체를 사용하지 않음
static: 프로그램 시작과 동시에 메모리 영역에 올려두고 공유하며 재사용하는 개념
1. 파이: Math.PI
=> 상수 필드로 정의되어 있기 때문에 값을 넣거나 지정할 수 없음
2. 올림: Math.ceil(double)
3. 반올림: Math.round(double)
4. 버림: Math.floor(double)
5. 절대값: Math.abs(int/double/long/float)
6. 최소값: Math.min(int1, int2)
7. 최대값: Math.max(int1, int2)
8. 제곱근: Math.sqrt(double)
9. 제곱: Math.pow(double1, double2)
=> int1의 int2 제곱
10. 랜덤수: Math.random()
=> Math.random()의 기본값 0.0 ~ 0.999999...
<String 관련 - StringPool>
1. 생성자 통해서 String 변수에 문자열 담기
=> 매번 생성되는 내용물이 같더라도 서로 다른 공간에 각각 생성됨
String str1 = new String("hello"); // new로 새로운 문자열을 만들어 냈음
String str2 = new String("hello"); // == 두 개의 주소값 다름
System.out.ptinln(str1 /* .toString */); // hello
=> 원래는 주소값이 나와야 하지만
=> 실제 담긴 내용물을 출력할 수 있도록 String 클래스에 toString 메소드가 오버라이딩되어 있음
=> 문자열에 .toString()을 굳이 적지 않아도 자동으로 적혀 있다고 봄
System.out.ptinln(str1.hashCode()); // 99162322
System.out.ptinln(str2.hashCode()); // 99162322
=> 실제 담긴 내용물을 기반으로 십진수로 변경해서 리턴할 수 있도록 String 클래스에 hashCode메소드가 오버라이딩되어 있음
System.out.ptinln(System.identityHashCode(str1)); // 182964700
System.out.ptinln(System.identityHashCode(str2)); // 2018699554
=> 진짜 주소값에 대해 알고 싶을 때 쓰는 메소드!
=> 같은 문자열 hello가 들어가 있지만 주소값은 다름
System.out.ptinln(str1 == str2); // false
=> == 으로 비교할 때에는 주소값 비교임
System.out.ptinln(str1.equals(str2); // true
=> 원래 Object 클래스에서 제공하는 equals 메소드는 주소값이 일치하는지 비교하는 메소드이나
=> String 클래스의 equals는 내용물 동등 비교를 할 수 있게 하는 메소드로 오버라이딩 됨
2. 문자열을 리터럴로 생성
=> 매번 생성되는 내용물이 Heap 영역 안에 StringPool(상수풀)에 생성됨
=> StringPool 공간의 특징: 동일한 문자열이 존재 불가 (== 동일한 문자열은 같은 주소값을 가짐)
String str1 = "hello"; // 그냥 변수로 생성
String str2 = "hello"; // 같은 문자열인 셈
System.out.println(str1); // hello
System.out.println(str2); // hello
System.out.println(str1.hashCode()); // 99162322
System.out.println(str2.hashCode()); // 99162322
System.out.println(System.identityHashCode(str1)); // 1829164700
System.out.println(System.identityHashCode(str2)); // 1829164700
System.out.println(str1 == str2); // true
3. 불변클래스(변하지 않는 클래스)
=> String 객체는 한 번 생성되면 메모리 공간의 내용물이 변하지 않음
=> 기존의 상수풀의 연결이 끊긴 문자열들은 가비지 콜렉터가 알아서 정리해 줌
=> 내용물이 수정되는 게 아니라 매번 새로운 주소값을 참조함
String str = "hello";
System.out.println(System.identityHashCode(str)); // 1829164700
str = "goodbye";
System.out.println(System.identityHashCode(str)); // 2018699554
str += "abc"; //str = str + "abc";
System.out.println(System.identityHashCode(str)); // 1311053135
<String 관련 - StringMethod>
1. 문자열.charAt(int);
=> 문자열에서 전달받은 index 위치의 문자 하나만 뽑아서 리턴
2. 문자열.concat("string");
=> 문자열과 전달된 또 다른 문자열을 하나로 연이어서 리턴
3.문자열.length();
=> 문자열의 길이 반환
4-1.문자열.subString(int);
=> 문자열의 int번째 위치에서부터 끝까지의 문자열을 추출해서 리턴
4-2 문자열.subString(int1, int2);
=> 문자열의 int1번째 위치에서부터 int2 -1 위치까지 추출해서 리턴
5. 문자열.replace('char1', 'char2');
=> 문자열 중 char1을 char2로 반환한 문자열로 리턴
6. 문자열.trim();
=> 문자열의 앞, 뒤 공백을 모두 제거한 문자열을 리턴
=> 문자열 사이의 공백은 제거하지 못함
=> 문자열 사이의 공백도 제거하고 싶다면 trim메소드 사용 후 replace메소드로 문자열.replace(" ", ""); 사용하면 됨!
7-1. 문자열.toUpperCase();
=> 문자열을 다 대문자로 변경 후 문자열 리턴
7-2. 문자열.toLowerCase();
=> 문자열을 다 소문자로 변경 후 문자열 리턴
8. 문자열.toCharArray()
=> 문자열의 각 문자들을 char[] 배열로 옮겨 담은 후 그 배열을 리턴
String str1 = "hello world";
char[] arr = str1.toCharArray(); // {h, e, l, l, o, , w, o, r, l, d} 배열이 생긴 것과 같음
9. String.valueOf(char[] data)
=> 전달된 char[] 배열에 담긴 문자들을 하나의 문자열로 연이어서 리턴
char[] arr = {a, p, p, l, e};
System.out.println(String.valueOf(arr)); // apple
<String 관련 - StringTokenizer> 문자열을 분리시켜서 배열에 담는 방법
1. 구분자를 제시해서 해당 문자열을 분리시키기
=> (1) split 메소드
=> 문자열.split(String 구분자)
String str ="Java,Oracle,JDBC,HTML,Server,Spring";
String[] arr = str.split(",");
=> (2) 향상된 for문
=> for(값을받아줄수있는변수선언문 : 순차적으로접근할배열또는컬렉션명)
for(String s : arr) {
System.out.println(s);
}
2. java.util.StringTokenizer 클래스를 이용하기
=> 분리된 각각의 문자열을 "토큰"(단어) 단위로 취급하고 싶을 때
=> StringTokenizer stn = new StringTokenizer(분리시키고자하는문자열, 구분자);
StringTokenizer stn = new StringTokenizer(str, ",");
System.out.println(stn.countTokens()); // 6
System.out.println(stn.nextTokens()); // Java
System.out.println(stn.countTokens()); // 5
System.out.println(stn.nextTokens()); // Oracle
<Wrapper 래퍼 클래스>
: 기본 자료형을 객체 타입으로 포장해 주는 클래스
: 메소드를 호출해야 할 때, 메소드의 매개변수로 기본 자료형 값이 아닌 객체 타입만 요구될 때, 다형성을 적용하고자 할 때 쓰임
* 기본 자료형 <---> Wrapper 클래스
* boolean Boolean
* char Character
* byte Byte
* short Short
* int Integer
* long Long
* float Float
* double Double
<날짜 관련 클래스>
Date today = new Date(); // 현재 날짜 및 시간
Date date2 = new Date(2020 -1900, 6 -1, 19); // Fri Jun 19 00:00:00 KST 2020
Date date3 = new Date();
date3 = setYear(2021 - 1900);
date3 = setMonth(7 - 1);
date3 = setDate(30);
System.out.println(date3); // Fri Jul 30 15:44:17 KST 2021
// Date의 형식을 지정하는 객체
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss");
//sdf 객체에서 제공하는 format() 메소드 호출 시 Date 객체 전달
// => 포맷이 지정된 날짜가 String형으로 변환
// sdf.format(Date객체): 반환형 String형
String formatDate = sdf.format(today);
System.out.println(formatDate); // 2022-08-11-03:54:45
*예외 처리(Exception)
에러 (오류) 종류
1. 시스템 에러: 컴퓨터의 오작동으로 인해 발생하는 에러
=> 개발자가 아닌 컴퓨터의 문제이며 소스코드로 해결 안됨
2. 컴파일 에러: 소스코드상의 문법적인 문제로 발생하는 에러
=> 소스코드 수정으로 해결 가능(이클립스가 빨간 밑줄로 알려 주는 에러)
3. 런타임 에러: 소스코드상으로는 문제가 없는데 프로그램 실행 도중 발생하는 에러
=> 사용자의 잘못일 수도 있고, 개발자가 예측 가능한 경우를 제대로 처리 안 해 놓은 잘못일 수도 있음
=> 충분히 예측 가능한 오류들 == UncheckedException
=> 애초에 예외가 발생하지 않게끔 if문인 "조건문"으로 선처리하여 해결하는 것이 권장됨
4. 논리 에러: 소스코드상의 문법적인 문제도 없고 실행했을 때도 굳이 문제가 되진 않지만 내가 짠 프로그램 의도상 반대로 작동하는 에러
=> 시스템 에러를 제외한 예외들이 발생했을 경우에 대비해서 미리 처리하는 방법을 정의해 두는 것을 예외처리라고 함
=> 예외 처리를 하는 이유: 예외 발생 시 프로그램이 비정상적으로 종료되는 것을 막기 위함임, 반드시 해야 함!
*예측 불가능한 예외들(IOException의 자식 클래스)에 대한 예외 처리는 CheckedException이라 하며 반드시 예외처리 해야 함
=> 사람이 아닌 외부 매체와 어떤 "입출력"이라는 과정이 나타날 때 주로 발생함
<후처리 예외 처리 방법>
1. try ~ catch문
=> try {
실행할코드 (예외가 발생될 법한 구문이 포함되어 있음);
} catch (발생할예외클래스명 변수명) {
해당 예외가 발생할 경우 실행할 구문;
}
=> catch블럭을 다중으로 작성하려면 범위가 작은 자식 타입의 예외 클래스를 먼저 기술해야 함
ex)public void method3() {
System.out.println("배열의 크기를 입력하세요: ");
int size = sc.nextInt();
sc.nextLine();
try {
int[] arr = new int[size];
System.out.println("100번 인덱스 값: " + arr[100]);
} catch (NegativeArraySizeException e) { // NegativeArraySizeException은 RuntimeException의 자식 클래스
System.out.println("배열의 크기로는 음수를 제시할 수 없습니다.");
} catch (RuntimeException e) { // RuntimeException은 NegativeArraySizeException의 자식 클래스
System.out.println("예외가 발생하긴 했음");
2. throw(== 떠넘기기, 위임하기)
=> 떠넘기기를 받은 메소드에서는 결국 try ~ catch문으로 예외처리를 해 주거나, main 메소드까지 넘어갔을 경우 JVM이 직접 예외처리를 실행함
=> public void 메소드명() throws 예외처리할예외이름 {