1. JAVA API(Application Programming Interface)
→ 프로그램 개발에 자주 사용되는 클래스 및 인터페이스의 모음으로 라이브러리라고 부름
※ 자바 표준 API 문서 : https://docs.oracle.com/javase/8/docs/api
1) java.lang 패키지
→ 자바의 기본적인 클래스들을 담고 있는 패키지로 import 구문 없이 사용 가능
① Object : 자바클래스의 최상위 클래스
Object 클래스는 모든 클래스의 부모클래스이다.
public class MainClass {
public static void main(String[] args) {
ObjectInformation oi = new ObjectInformation();
System.out.println(oi);
}
}
Object 클래스를 확인해보면 toString 메서드가 이미 정의되어 있기 때문에 위와 같은 출력 결과를 확인할 수 있다.
public class ObjectInformation {
// toString 오버라이딩 후 System.out.println() 등으로 객체변수 조회 시
// 해당 인스턴스의 클래스 경로와 주소값 대신 toString에서 리턴한 문자가 콘솔에 찍힘
@Override
public String toString() {
return "조회 시 이게 나올거임";
}
}
ObjectInformation 클래스에 toString() 메서드를 오버라이딩하면 오버라이딩한 내용으로 바뀌어 출력되는 것을 확인할 수 있다.
② System : 표준입력장치(키보드)로부터 데이터를 입력받거나 표준출력장치(모니터)로 출력하기 위해 사용
- exit() : 현재 실행하고 있는 프로세스 강제 종료, 정상 종료일 경우 매개값으로 0을 줌
- currentTimeMills() : 컴퓨터의 시계로부터 현재 시간을 읽어서 밀리세컨드 단위와 나노세컨드 단위의 long 값 리턴
→ 프로그램의 실행 소요 시간 측정으로 성능을 테스트할 때 사용
public class SystemTimeEx {
public static void main(String[] args) {
// currentTimeMilllis()와 nanoTime() 메서드는 UNIX 시간 사용
// UNIX 시간 : 1970/01/01 00:00:00을 기점으로 얼마나 시간이 지났는지 숫자로 표현
// 현재까지의 시간을 1000분의 1초로 변환한 에폭시간과 10억분의 1초로 변환한 에폭시간을 long 타입으로 리턴
long start = System.currentTimeMillis();
System.out.println("시작시간 : " + start);
long sum = 0;
for(long i = 1; i < 10_000_000_000L; i++) {
sum += i;
}
long end = System.currentTimeMillis();
System.out.println("종료시간 : " + end);
System.out.println("계산에 소요된 시간 : " + (end - start));
}
}
위와 같이 해당 로직이 수행되는데 얼마나 시간이 걸리는지 알 수 있다.
- getProperty() : JVM이 시작할 때 자동 설정되는 시스템의 속성값 구함
- gc() : Garbage Collector 실행
③ Class : 클래스를 메모리에 로딩할 때 사용
④ String : 문자열을 저장하고 문자열의 여러 가지 정보를 얻을 때 사용
→ 생성자를 사용하여 객체를 만들 필요 없이 기초 데이터처럼 바로 초기화 가능
- 주요 메서드
charAt() | 특정 인덱스 글자 리턴 |
indexOf() | 특정 문자열의 시작 인덱스 반환, 해당 문자가 없으면 -1 리턴 |
length() | 문자열 길이 리턴 |
replace() | 특정 문자열 변경 |
substring() | 인덱스를 기준으로 그 앞의 문자열을 잘라줌 ex) 매개값으로 인덱스 2개 주면 처음 매개값~두번째 매개값의 문자열을 제외하고 삭제 |
toUpperCase() | 문자열을 대문자로 치환 |
toLowerCase() | 문자열을 소문자로 치환 |
trim() | 문자열의 앞, 뒤 공백 제거 |
equals() | 문자열의 값 비교 |
valueOf() | 기본 데이터 타입의 값들을 문자열로 변환 |
-charAt( ) 메서드 예시
public class StringCharAt {
public static void main(String[] args) {
// 일반 배열은 아래와 같이 인덱싱 가능
int [] iArr = {1, 2, 3, 4};
System.out.println(iArr[2]);
// 문자열은 일반 인덱싱([ ]을 사용하는 인덱싱)이 불가능
String str = "가나다라";
//System.out.println(str[2]);
System.out.println(str.charAt(2));
}
}
- indexOf( ) 메서드 예시
public class StringIndexOf {
public static void main(String[] args) {
// 특정 문자열의 시작 인덱스값을 반환
String to = "tomatos";
// 단일 파라키터로 조회만 할 경우 0번에서 제일 가까운 단어 하나만 조회
System.out.println(to.indexOf(to));
// 두 번째 파라미터로 조회 시작 파라미터 지정 가능
System.out.println(to.indexOf("to", 1)); // 0번부터가 아닌 1번부터 조회
// 없는 단어 조회 시 -1
System.out.println(to.indexOf("na"));
}
}
- replace( ) 메서드 예시
public class StringReplace {
public static void main(String[] args) {
// 자바는 15버전부터 멀티라인 문자열 지원
// 원래 자바 문자열은 여닫는 "를 한 줄에 작성해야했음
// String a = "가나다라"; (허용)
// String a = "가나다라
// "마바사"; (허용 X)
// 여닫는 따옴표가 다른 줄에 위치한 경우 " 세 개 이용
// """를 사용한 줄에는 문자열을 작성할 수 없고, 다음 줄부터 작성가능
String notice = """
<공지사항>
1. 복습 철저히 해주세요
2. 회고록 작성 해주세요
""";
System.out.println(notice);
// replace()는 String을 리턴하고, 첫 단어를 두 번째 단어로 바꿔줌
String newNotice = notice.replace("해주세요", "해주십시오");
System.out.println(newNotice);
}
}
- substring( ) 메서드 예시
public class StringSubstring {
public static void main(String[] args) {
// 주민번호 양식
String ssn = "010808-4987654";
System.out.println(ssn);
// substring() 메서드에 매개값으로 인덱스를 1개 지정 시
// 해당 인덱스부터 마지막 지점까지의 문자 추출
String last = ssn.substring(7); // 7번부터
System.out.println(last);
// substring() 메서드에 매개값으로 인덱스를 2개 지정 시
// 첫 번째 매개값 이상, 두 번째 매개값 미만 범위 문자 추출
String first = ssn.substring(0, 6); // 0 1 2 3 4 5까지 조회, 6은 범위 X
System.out.println(first);
}
}
- trim() 메서드 예시
public class StringTrim {
public static void main(String[] args) {
// trim은 좌측, 우측에서 다른 단어가 나오기 직전까지 공백을 전부 제거
String trimBefore = " 옆에 거슬 려요 ";
System.err.println(trimBefore);
String trimAfter = trimBefore.trim();
System.out.println(trimAfter);
}
}
- valueOf() 메서드 예시
public class StringValueOf {
public static void main(String[] args) {
int a = 10;
double b = 8.79;
System.out.println(a + b);
String str1 = String.valueOf(a); // int -> String
String str2 = String.valueOf(b); // double -> String
System.out.println(str1 + str2);
}
}
★ String 클래스 단점 : 처음 초기화된 데이터 변경 시 기존 객체 재활용이 아닌 새로운 객체 생성 → 메모리 과소비
위와 같이 String 클래스는 문자 내용이 변경될 때마다 새로운 영역에 다시 할당되어 속도가 느려지는 현상이 발생한다.
→ 속도적인 측면에서 개선된 StringBuffer와 StringBuilder 사용
⑤ StringBuffer, StringBuilder : 문자열을 저장하고 내부 문자열을 조작할 때 사용
- StringBuilder가 성능적으로는 좀 더 낫지만, StringBuffer는 Thread safety를 보장한다.
- 정말 세밀한 성능 이슈를 따지지 않는 환경에서는 StringBuffer를 쓰면 된다.
public class StringMemory {
public static void main(String[] args) {
// String의 경우 내용이 다른 문자는 항상 새롭게 할당
//String a = "0";
// StringBuilder, StringBuffer는 문자도 메모리 저장 시 변경 가능하게 저장
// 따라서 문자 내용이 바뀌어도 새로운 할당이 잘 일어나지 않으므로 성능상 우위에 있음
// StringBuilder는 Thread safety하지 않지만 StringBuffer보다 근소하게 성능이 좋음
//StringBuilder sb = new StringBuilder("0");
StringBuffer sb = new StringBuffer("0");
long start = System.currentTimeMillis();
for(int i = 0; i < 1_000_000; i++) {
//a += "0"; // a 문자에 0을 100만번 더함 -> 힙 할당도 100만번
sb.append("0"); // sb에 0을 100만번 더함 -> 힙 할당은 거의 새롭게 일어나지 않음
}
long end = System.currentTimeMillis();
System.out.println("소요시간(밀리초 : " + (end - start));
}
}
- StringBuilder 클래스의 주요 메서드
append() | 기존 문자열의 뒤에 문자열 추가 |
insert() | 특정 위치에 문자열 추가 |
delete() | 문자열 삭제 |
deleteCharAt() | 특정 인덱스의 문자 하나 삭제 |
replace() | 문자열의 일부분을 다른 문자열로 대체 |
setCharAt() | 문자열에서 주어진 index의 문자를 다른 문자로 대체 |
toString() | stringBuilder 객체의 값을 문자열로 반환 |
reverse() | 문자열을 거꾸로 뒤집기 |
public class StringBuilderEx {
public static void main(String[] args) {
// 이 코드에서 StringBuilder는 전부 StringBuffer로 대체해도 잘 동작한다.
// 둘의 차이는 쓰레드 안전이 보장되는지 아닌지의 여부뿐
// 따라서 쓰레드 안전을 보장받고 싶다면 StringBuffer만 사용하면 됨
//StringBuilder sb = new StringBuilder("JAVA");
StringBuffer sb = new StringBuffer("JAVA");
// 문자열 끝에 추가하는 메서드 append()
sb.append(" Program Study");; // sb += " Program Study"와 동일
System.out.println(sb);
// 문자열을 특정 인덱스 위치에 삽입하는 메서드 insert()
sb.insert(12, "ming");
System.out.println(sb);
// 특정 인덱스 범위 문자열을 교체하는 메서드 replace()
sb.replace(5, 16, "book"); // 5~15번 인덱스 11글자를 book 4글자로 치환
System.out.println(sb);
// 문자열을 삭제하는 메서드 delete(begin, end)
sb.delete(4, 9);
System.out.println(sb);
System.out.println(sb.length());
}
}
☆ 매번 할당하지 않는 원리
StringBuilder와 StringBuffer는 생성 시 할당하는 저장용량 capacity(16)를 가지고 있으며, append 연산으로 저장 용량을 초과하는 경우 기존 저장 용량을 가진 객체를 재할당하게 된다.
⑥ Math : 수학 함수를 이용할 때 사용
- 주요 메서드
abs() | 절대값 |
ceil() | 올림값 |
floor() | 내림값 |
max() | 최대값 |
min() | 최소값 |
random() | 랜덤값 (0.0 <= 값 <1.0) |
rint() | 현재 수에서 가까운 정수를 실수 형태로 구함 |
round() | 반올림값 |
public class MathEx {
public static void main(String[] args) {
// 수학 관련된 연산이나 혹은 상수를 저장해둔 Math 클래스는 정적 변수와 메서드를 가지므로
// 굳이 Math 객체를 생성하지 않아도 활용 가능
// 절대값 : 부호 무시
System.out.println(Math.abs(-15.294));
// 올림 : 소수점 아래자리가 존재하면 1 증가
System.out.println(Math.ceil(10.0));
System.out.println(Math.ceil(10.00001));
// 내림 : 소수점 아래자리가 존재하면 없애버림
System.out.println(Math.floor(10.0));
System.out.println(Math.floor(10.99999));
// 최대값 : 제시된 수 중 가장 큰 값 하나만 남김
System.out.println(Math.max(99.9, 12.34));
// 최소값 : 제시된 수 중 가장 작은 값 하나만 남김
System.out.println(Math.min(99.9, 12.34));
// 랜덤값 : 컴퓨터 시스템은 완벽한 난수가 아닌 시득닶에 따른 의사난수를 사용
System.out.println(Math.random());
// 가장 가까운 실수 구하기
System.out.println(Math.rint(12.500001));
// 반올림 : 소수점 아래값이 0.5 미만이면 정수를 그대로, 이상이면 1 증가
System.out.println(Math.round(24.604));
// 혹은 Math 클래스 내에 정적변수로 자주 사용하는 상수값(원주율, 자연상수 등)도 제공
System.out.println(Math.PI);
System.out.println(Math.E);
}
}
⑦ Wrapper(Byte, Short, Integer, Long, Float, Double, Boolean, Character) : 기본 데이터 타입의 객체를 만들 때 사용