1. API(Application Programming Interface)
: 응용 프로그램에서 사용할 수 있도록 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스
* Java 8 버전 API
- API는 Oracle에서 제공하고 있다. 필요한 것들은 여기서 찾으면 된다.
☞ https://docs.oracle.com/javase/8/docs/api/
2. Math 클래스
(1) 특징
① 수학과 관련된 기능들이다.
→ 형식: Math.사용할기능
② 모든 필드와 메소드가 전부 static으로 되어 있다.
→ static 생략이 가능하고 생성자는 private이며, 객체 생성이 필요 없다.
③ java.lang 패키지 안에 존재한다.
(2) π(파이) : Math.PI
System.out.print(Math.PI);
// 출력값: 3.141592653589793
(3) 반올림 : Math.round(double타입) → 반환형은 long 타입
double num = 5.46
System.out.print(Math.round(num);
// 출력값: 5
(4) 올림 : Math.ceil(double타입) → 반환형은 double 타입
double num = 1.23;
System.out.print(Math.ceil(num));
// 출력값: 2.0
(5) 버림 : Math.floor(double타입) → 반환형은 double 타입
double num = 3.14;
System.out.print(Math.floor(num));
// 출력값: 3.0
(6) 절대값 : Math.abs(int/long/float/double타입)
→ 반환형은 int/long/float/double타입
int num = -11;
System.out.print(Math.abs(num));
// 출력값: 11
(7) 최소값 : Math.min(int, int/long, long/float, float/double, double타입)
→ 반환형은 int/long/float/double타입
System.out.print(5.19, 10.01);
// 출력값: 5.19
(8) 최대값 : Math.max(int, int/long, long/float, float/double, double타입)
→ 반환형은 int/long/float/double타입
System.out.print(5.19, 10.01);
// 출력값: 10.01
(9) √(제곱근=루트) : Math.sqrt(double타입) → 반환형은 double 타입
System.out.print(Math.sqrt(16));
// 출력값: 4.0
(10) 제곱 : Math.pow(double, double) → 반환형은 double 타입
System.out.print(Math.pow(3, 4));
// 출력값: 81.0
(11) 랜덤값 : Math.Random()
System.out.print(Math.Random());
// 출력값은 실행할 때마다 달라진다.
3. String 관련 클래스
(1) String 클래스
: 불변 클래스(immutable class)이다. String 클래스는 수정할 때 기존의 값이 담긴 공간에서 수정되는 것이 아니라
새로운 공간에 수정된 값이 들어간다.
① 사용법
ⓐ 대입 연산자 넣기
ⓑ 생성자 new String("") 호출
② 메소드
String str1 = new String("HELLO WORLD!");
String str1 = new String("HELLO WORLD!");
ⓐ toString() - 생략 가능
: String 클래스에서는 저장된 문자열을 반환하도록 재정의되어 있다.
System.out.println(str1.toString());
System.out.println(str2.toString());
// 출력값: HELLO WORLD!
// HELLO WORLD!
ⓑ equals()
: 문자열을 비교한다.(주소값 비교X) / Object 클래스의 equals를 상속받아 오버라이딩을 한다.
비교한 두 문자열이 서로 같으면 true 출력, 다르면 false 출력된다.
System.out.println(str.equals(str2));
// 출력값: true
* Object의 equals가 주소값을 비교한다.
ⓒ hashCode()
: String 클래스에서 주소값이 아니라 문자열을 기반으로 해시코드값을 만들어 반환한다.
- 실제 주소값의 해시코드를 반환하려면 System.identityHashCode()를 사용한다.
// 문자열 기반의 해시코드(주소값X)
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
// 출력값: 435340829
// 435340829
// 실제 주소값의 해시코드
System.out.println(System.identityHashCode(str1));
System.out.println(System.identityHashCode(str2));
System.out.println(str1 == str2);
// 출력값: 1829164700
// 2018699554
// false
// 실제 주소값은 다르므로 false가 출력된다.
③ 문자열을 리터럴(literal)로 생성
: 상수 풀(String pool)에 리터럴 값만 넣으면 서로 같은 주소값이 나온다.
상수 풀에는 같은 문자열이 있을 수 없다.
String str1 = "ASAP";
String str2 = "ASAP";
ⓐ toString()
System.out.println(str1.toString());
System.out.println(str2.toString());
// 출력값: ASAP
// ASAP
ⓑ equals()
System.out.println(str1.equals(str2));
// 출력값: true
ⓒ hashCode(), System.identityHashCode()
- new String()을 호출 시엔 새로운 공간에 추가되므로 실제 주소값이 다르게 나오는 반면, 리터럴로 생성한
경우에는 새로 생성하는 것이 아니므로 실제 주소값이 같게 나온다.
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
// 출력값: 2018273
// 2018273
System.out.println(System.identityHashCode(str1));
System.out.println(System.identityHashCode(str2));
// 출력값: 1829164700
// 1829164700
- 기존 문자열에 새로운 값을 넣으면 이 변경된 값이 새로운 영역에 들어가게 된다.(해당 위치에서 변경X)
str = str + "hurry";
System.out.println(System.identityHashCode(str);
// 출력값: 2018699554
→ 기존 실제 주소값은 1829164700인데, 변경된 주소값은 2018699554이다.
(2) StringBuffer / StringBuilder
: 문자열은 불변클래스여서 합성 시에 새 메모리 영역을 할당받아 작업하므로 합성이 느리다.
이럴 때 좀더 빨리 합성하고 싶다면 사용하는 것이 가변형 클래스인 StringBuffer와 StringBuilder이다.
① StringBuffer
: 순서가 정해져 있어서 StringBuilder보다 상대적으로 느리지만 안전하다.
② StringBuilder
: 순서가 정해져 있지 않아 StringBuffer보다 빠르지만 안전하지 않다.
// 각각의 작업 시간 알아보기
// StringBuffer와 StringBuilder 둘 중 하나씩만 사용하면 된다.
StringBuffer sb = new StringBuffer();
StringBuilder sb = new StringBuilder();
// currentTimeMills()는 현재 시간 알아보는 메소드
long start = System.currentTimeMills(); // 시작 시간
for(int i = 0; i < 1000; i++) { // sb를 1000번 반복했을 때의 작업 시간
sb.append("HELLO WORLD"); // append()는 기존 문자열 뒤쪽에 새 문자열을 추가한다.
System.out.println(System.identityHashCode(sb)); // sb의 실제 주소값으로 출력
}
long finish = System.currentTimeMills(); // 종료 시간
System.out.println("작업 시간: " + (finish - start));
// StringBuffer의 작업 시간: 290
// String Builder의 작업 시간: 281
// 반복 횟수가 더 늘어날 수록 서로의 작업 시간 차이는 커진다.
(3) StringTokenizer
: 문자열을 문자열 배열로 분리시킨다.
String array = "Apple, Banana, Cranberry, Orange, Pineapple, Watermelon";
① 문자열.split(String 구분자) → 반환형은 String[]
: 구분자를 제시하여 해당 문자열을 분리시킨다.
String[] arr = array.split(", ");
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
// 출력값: Apple
// Banana
// Cranberry
// Orange
// Pineapple
// Watermelon
② 각각 분리된 문자열들을 토큰(token)으로 취급한다.
: StringTokenizer stn = new StringTokenizer(분리하려는 문자열, 구분자);
String stn = new StringTokenizer(array, ", ");
System.out.println(stn.countTokens()); // 분리된 문자열의 개수: 6개
System.out.println(stn.nextToken()); // Apple
System.out.println(stn.nextToken()); // Banana
System.out.println(stn.nextToken()); // Cranberry
System.out.println(stn.nextToken()); // Orange
System.out.println(stn.nextToken()); // Pineapple
System.out.println(stn.nextToken()); // Watermelon
// System.out.println(stn.nextToken());
// -> 토큰이 더 없을 때 nextToken() 호출 시 NoSuchElementException이 발생한다.
System.out.println(stn.countTokens()); // nextToken() 호출 시 해당 토큰을 꺼낸 후 종료한다.
// 위의 경우 토큰을 다 꺼내서 남은 토큰의 개수는 0개이다.
while(stn.hasMoreTokens()) { // 토큰이 남아있으면 true를, 남아있지 않으면 false를 반환한다.
System.out.println(stn.nextToken());
}
// 출력값: 6
// Apple
// Banana
// Cranberry
// Orange
// Pineapple
// Watermelon
// 0
// false
4. 문자열 관련 메소드
(1) 형태
: 메소드명(매개변수) - 반환형
String str = "HELLO WORLD!";
(2) 문자열.charAt(인덱스) → 반환형은 char
: 문자열에서 전달받은 인덱스 위치에 있는 문자 하나만 반환한다.
char ch = str.charAt(2);
System.out.println(ch);
// 출력값: L
(3) 문자열.concat(문자열2) → 반환형은 String
: 기존 문자열에서 전달받은 새 문자열을 합쳐서 반환한다.
String nStr = str.concat("!!");
System.out.println(nStr);
// 출력값: HELLO WORLD!!!
(4) 문자열.length() → 반환형은 int
: 문자열의 길이를 반환한다.
System.out.println(str.length());
// 출력값: 12
(5) 문자열.substring(시작 인덱스 / 시작 인덱스, 끝 인덱스) → 반환형은 String
: 문자열의 시작 인덱스 위치부터 문자열 끝까지의 문자열을 반환하거나, 문자열의 시작 인덱스 위치부터
반환하고자 하는 마지막 인덱스 위치까지의 문자열을 반환한다.
System.out.println(str.substring(3));
System.out.println(str.substring(2, 9));
// 출력값: L
// LLO WORL
(6) 문자열.replace(char old, char new) → 반환형은 String
: 문자열에서 기존 문자(old)를 새 문자(new)로 바꾸어서 문자열을 반환한다.
String nStr = str.replace('L', 'P');
System.out.println(nStr);
// 출력값: HEPPO WORPD!
(7) 문자열.trim() → 반환형은 String
: 문자열의 앞과 뒤의 공백을 제거해준다.(문자열 사이의 중간 공백은 제거X)
String address = " www.tis tory.com ";
System.out.println(address.trim());
// 출력값: www.tis tory.com
// 문자열 사이에 있는 중간 공백을 제거하려면 문자를 새로 바꿔주는 replace()를 사용한다.
System.out.println(address.replace(" ", "");
// 출력값: www.tistory.com
(8) 문자열.toUpperCase() / 문자열.toLowerCase() → 반환형은 String
: 문자열을 대문자로 변환(.toUpperCase())해주거나 소문자로 변환(.toLowerCase())해준다.
String str2 = "Hello World!";
System.out.println(str2.toUpperCase());
System.out.println(str2.toLowerCase());
// 출력값: HELLO WORLD!
// hello world!
(9) 문자열.toCharArray() → 반환형은 char[]
: 문자열의 각 문자들을 char 타입 배열에 저장한 후 해당 배열을 반환한다.
char[] cArr = str.toCharArrat();
for(int i = 0; i < cArr.length; i++) {
System.out.println(cArr[i] + " ");
}
// 출력값: H E L L O W O R L D !
(10) String.valueOf(char[] c) → 반환형은 String
: 문자 배열을 문자열로 반환한다.
char[] cArr = str.toCharArray();
System.out.println(String.valueOf(cArr));
// 출력값: HELLO WORLD!
5. Wrapper 클래스
: 기본 자료형을 객체화해준다.
기본 자료형 | Wrapper 클래스 |
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
Integer i1 = 10;
Integer i2 = 20;
// 기본 자료형일 때는 동등비교연산자(==)를 사용하며,
System.out.println(num1 == num2);
// Wrapper클래스는 동등비교할 때 .equals()를 사용한다.
// 같으면 true, 다르면 false 반환
System.out.println(num1.equals(num2));
// prior.compareTo(later)
// -> prior이 later보다 작으면 -1, 같으면 0, 크면 1을 반환
System.out.println(i1.compareTo(i2));
// 출력값: false
// -1
// String(문자열)
String str1 = "10"; // int
String str2 = "15.5"; // double
System.out.println(str1 + str2); // 문자열의 합
// 출력값: 1015.5
// String형 -> 기본 자료형 ('파싱한다' 라고 표현한다.)
// 기본자료형 변수명 = Wrapper클래스명.parse기본자료형(변환할 문자열);
int iNum = Integer.parseInt(str1); // "10" -> 10
double dNum = Double.parseDouble(str2); // "15.5" -> 15.5
System.out.println(iNum + dNum); // 정수형의 합
// 출력값: 25.5
// 기본 자료형 -> String형
// String 변수명 = String.valueOf(변환할 기본자료형값)
String iStr = String.valueOf(iNum); // 10 -> "10"
String dStr = String.valueOf(dNum); // 15.5 -> "15.5"
System.out.println(iStr + dStr);
// 출력값: 1015.5
}
6. 날짜 관련 클래스
(1) Date 클래스
: java.util 패키지에 존재하며, 날짜와 시간에 대한 정보를 담는다.
* Java 개발 초창기에 급히 만들어져서 완성도가 낮고, jdk의 버전이 올라가면서 여러 메소드들이 deprecate되었다.
(2) SimpleDateFormat 클래스
: java.text 패키지에 존재한다.
import java.util.Date;
import java.text.SimpleDateFormat;
public static void main(String[] args) {
Date now = new Date();
System.out.println("현재 시간: " + now);
// 출력값: Sun Mar 10 19:31:55 KST 2022
// 원하는 날짜 출력
// 1. 매개변수 생성자를 사용하여 변경
Date choiceDate = new Date(2022 - 1900, 12 - 1, 22, 12, 30, 00);
System.out.println(choiceDate);
// 출력값: Thu Dec 22 12:30:00 KST 2022
// 2. 형식을 지정하여 SimpleDateFormat 객체를 생성
SimpleDateFormat time = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분 ss초");
String birth = time.format(choiceDate);
System.out.println(birth);
// 출력값: 2022년 12월 22일 12시 30분 00초
}