JAVA API (Application Programming interface)
API는 라이브러리라고 부르며 프로그램 개발에 자주 사용되는 클래스 및 인터페이스의 모음을 말한다.
자바 표준 API 문서 주소 : https://docs.oracle.com/javase/8/docs/api
java.lang 패키지
java.lang 패키지는 자바 프로그램의 기본적인 클래스들을 담고 있는 패키지이다. 그렇기 때문에 java.lang패키지에 있는 클래스와 인터페이스는 import 구문 없이 사용할 수 있다.
java.lang패키지 주요 클래스
1.Object : 자바 클래스 최상위 클래스
2. System : 표준 입력장치(키보드)로부터 데이터를 입력받거나 표준 출력장치(모니터)로 출력하기 위해 사용
3. Class : 클래스를 메모리에 로딩할 때 사용
4. String : 문자열을 저장하고 문자열의 여러 가지 정보를 얻을 때 사용
5. StringBuffer, StringBuilder : 문자열을 저장하고 내부 문자열을 조작할 때 사용
6. Math : 수학 함수를 이용할 때 사용
7. Wrapper(Byte, Short, Integer, Long, Float, Double, Boolean, Character)
: 기본 데이터 타입의 객체를 만들 때 사용
Object 클래스
클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않으면 묵시적으로 Object 클래스를 상속하게 된다. 따라서 모든 자바의 클래스는 Object 클래스의 자식이거나 자손 클래스이다.
모든 클래스가 object를 상속하기 때문에 object에 메서드는 모든 클래스에서 사용이 가능하다.
System 클래스
자바 프로그램은 운영체제상에서 바로 실행되는 것이 아니라 JVM위에서 실행된다. 따라서 운영체제의 모든 기능을 자바 코드로 직접 접근하기는 어렵다.
하지만 System클래스를 이용하면 운영체제의 일부 기능을 이용할 수 있다. 프로그램 종료, 키보드로 입력, 모니터로 추력, 메모리 정리, 현재 시간 읽기 등이 가능하다.
System클래스의 모든 멤버는 static으로 구성되어 있어 클래스 이름으로 바로 접근이 가능하다.
System 클래스 주요 메서드
1.exit() : 현재 실행하고 있는 프로세스를 강제 종료시킨다. 정상 종료일 경우 매개 값으로 0을 주고, 비정상 종료인 경우 0 이외에 다른 값을 준다.
2. currentTimeMillis(), nanoTime() : 컴퓨터의 시계로부터 현재 시간을 읽어서 밀리세컨드(1/1000초) 단위와 나노세컨드(1/10^9초) 단위의 long값을 리턴합니다. 주로 프로그램의 실행 소요시간 측정으로 성능을 테스트할 때 사용한다.
/*
currentTimeMillis()와 nanoTime() 메서드 사용법
처음시작부분과 끝나는 부분 두부분의 시간을 구하고 그 차이로 프로그램이
돌아가는 시간을 알아내는데 많이 사용된다.
*/
package api.lang.system;
public class SystemTime {
public static void main(String[] args) {
/*
- currentTimeMillis()와 nanoTime() 메서드는
1970년 1월 1일 자정부터 현재까지의 시간을 초로 변환한
에폭시간을 각각 long타입의 밀리초(1/1000), 나노초(1/10^9)
로 리턴합니다.
*/
long start = System.currentTimeMillis(); //왜 long을 쓰냐면 currentTimeMillis위에 마우스를
//올려보면 받아올때 값을 long으로 받아온다고 적혀있다. 그래서 long을 쓴다.
long sum = 0;
for(long i=1; i<=100000000L; i++) {
sum += i;
}
long end = System.currentTimeMillis();
System.out.println("계산에 소요된 시간: "
+ (end-start) * 0.001 + "초");
}
}
3. getProperty() : JVM이 시작할 때 자동 설정되는 시스템의 속성 값을 구한다.
4. gc(): Garbage Collector를 실행시킨다. (좀 더 메모리 해제를 빨리하기 위한 것)
자바는 c처럼 포인터를 사용자가 사용불가 (객체데이터를 메모리에서 지워버릴 수 없음 기다려야 함.)
힙 영역의 쓰레기 영역 데이터를 빨리 지우라고 독촉할 수 있다.
String 클래스
Stinf은 생성자를 사용해서 객체를 만들 필요 없이 기초 데이터를 사용할 때처럼 바로 초기화해서 사용할 수 있다.
-String 클래스의 주요 메서드
1. charAt() : 특정 인덱스의 글자를 리턴.
2. indexof() : 특정 문자열의 시작 인덱스 값을 반환한다. 만약 주어진 문자열이 포함되어 있지 않으면 -1을 리턴한다.
3. length() : 문자열의 길이를 알려준다.
4. replace() : 특정 문자열을 변경한다.
5. substring() : 인덱스를 기준으로 그 앞의 문자열을 잘라준다. 만약 매개 값으로 인덱스를 2개 주면 처음 매개값 이상 두 번째 매개 값 미만의 문자열을 제외하고 나머지를 삭제한다.
6. toUpperCase() : 문자열을 대문자로 치환
7. toLowerCase() : 문자열을 소문자로 치환
8. trim() : 문자열의 앞, 뒤 공백을 제거
9. equals() : 문자열의 갚을 비교
10. valueof() : 기본 데이터 타입의 값들을 문자열로 변환
string 클래스의 단점
1. string 클래스는 아주 많이 쓰이고 좋은 기능들을 많이 가지고 있지만 메모리를 과소비한다는 문제점이 있다.
string은 배열의 형태로 저장되므로
ex) sting s = "hello"를 하면 s엔 아래의 hello의 위치 주소 값(0x10)이 저장되고
H | e | l | l | o |
다시 s ="hello world"를 하면 위 문자는 그대로 뒤고 새로운 위치(0x20)에
h | e | l | l | o | w | .... |
저장한다. 그럼 계속 쌓이게 되고 과부하가 오는데 (자바의 경우 일정 시기에 자동으로 삭제가 되긴 한다.)
그래서 객체 하나로 편집을 할 수 있는 스트링 버퍼, string Builder가 있다.
string Builder
package api.lang.sb;
public class StringBuilderExample {
public static void main(String[] args) {
//하나의 string로 추가 없이 수정, 삭제를 수행한다.
StringBuilder sb = new StringBuilder("Java ");
//문자열을 맨 끝에 추가하는 메서드 append()
sb.append("Program Study");
System.out.println(sb);
// 이건 위와 동일한 결과를 출력하지만 위는 하나의 객체로 아래는 두개의
//객체를 가지고 출력하기 때문에 메모리 과부화를 불러온다.
//그래서 아래와같은 방식은 사용안하는게 좋다.
/*String str = "Java ";
str = str + "Program Study";
System.out.println(str);*/
//문자열을 특정 인덱스 위치에 삽입하는 메서드 insert()
sb.insert(12, "ming");
System.out.println(sb); //Java Programming Study
//특정 인덱스 범위의 문자열을 교체하는 메서드 replace()
sb.replace(5, 16, "Book");
System.out.println(sb); //Java Book Study
//문자열을 삭제하는 메서드 delete(begin, end)
//Java Study
sb.delete(4, 9);
System.out.println(sb); //Java Study
System.out.println(sb.length()); //10
}
}
string과 string Builder 속도 차이 : string은 수만은 객체를 만들어서 작업하므로 속도가 느리다.
package api.lang.sb;
public class StringTest {
// string과 string Builder 속도 차이를 보자.
public static void main(String[] args) {
long start, end;
start = System.currentTimeMillis();
String str = "A";
for(int i=0; i<100000; i++) {
str = str + "A";
}
end = System.currentTimeMillis();
System.out.println("String: " + (end-start)*0.001 + "초");
start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder("A");
for(int i=0; i<100000; i++) {
sb.append("A");
}
end = System.currentTimeMillis();
System.out.println("StringBuilder: " + (end-start)*0.001 + "초");
}
}
----------결과---------
String : 2.602초
StringBuilder : 0.001초
2. string 객체는 초음 초기화된 데이터에 변화가 생기면 기존 객체를 재활 요하지 않고 새로운 객체를 생성한다.
* Wrapper 클래스
- 자바는 기본 타입의 값을 갖는 객체를 생성할 수 있다.
- 이러한 객체를 포장(Wrapper) 객체라고 하는데 이유는 기본 타입의 값을 객체 내부에 두고 포장하기 때문이다.
- 포장 객체의 특징은 포장하고 있는 기본 타입의 값은 외부에서 변경할 수 없다. 만약 변경하고 싶다면 새로운 포장 객체를 생성해야 한다.
- 기본 타입의 값을 포장 객체로 만드는 과정을 박싱(Boxing)이라 하며 포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱(Unboxing)이라 한다.
- 포장 클래스의 주요 용도는 기본 타입의 값을 박싱 해서 포장 객체로 만드는 것이지만, 문자열을 기본 타입 값으로 변환할 때도 많이 사용한다. 대부분의 포장 클래스는 "parse + 기본 타입" 명으로 되어있는 정적 메서드를 제공한다.
- Byte, Short, Integer, Iong, Float, Double, Boolean, Character
자바 변수의 기본형에 대응되는 래퍼 클래서(Wrapper Class)
변수의 기본 자료형 이름의 첫 번째 글자만 대문자로 바꾸면 된다.
기본자료형 | 래퍼클래스 |
boolean | Boolean |
short | Short |
int | Int |
long | Long |
float | Float |
double | Double |
char | Char |
byte | Byte |
Wrapper 클래스
package api.lang.wrapper;
import java.util.Arrays;
public class Boxing {
public static void main(String[] args) {
int a = 100;
double b = 3.51;
char c = 'H';
boolean d = false;
//Boxing: 기본타입의 데이터를 객체타입으로 변환.
Integer val1 = new Integer(a);
Double val2 = new Double(b);
Character val3 = new Character(c);
Boolean val4 = new Boolean(d);
Byte val5 = new Byte((byte)75);
String val6 = new String("hello");
// 그럼 이제 객체타입변환 즉, 클래스가 됬기 때문에 Object와 상속관계를 가짐
//같은 타입까지 묶을수 있었지만 이제 부모타입으로 배열을 만들어 여러 타입을 같이 묶을수 있다.
Object[] arr = {val1, val2, val3, val4, val5, val6};
System.out.println(Arrays.toString(arr));
//Unboxing: 포장된 데이터를 다시 기본타입으로 변환.
//포장클래스가 제공하는 기본타입이름+Value()메서드 이용.
int i = val1.intValue();
double j = val2.doubleValue();
char k = val3.charValue();
boolean x = val4.booleanValue();
byte y = val5.byteValue();
}
// 사실 위 과정이 매우 귀찮타 그래서 자바에선 오토박싱 기능을 제공하고 있다.
//자동으로 박싱 언박싱이 가능하다.
}
오토 박싱
package api.lang.wrapper;
import java.util.Arrays;
public class AutoBoxing {
public static void main(String[] args) {
//AutoBoxing: 기본타입 데이터를 자동으로 객체로 변환.
//자바10버전부터는 오토박싱 기능만을 사용하도록 권고하고 있습니다.
int a = 100;
Integer val1 = a; //auto boxing
Double val2 = 3.1415;
Object[] arr = {56, 3.154, "안녕", 99, 200.12};
System.out.println(Arrays.toString(arr));
//AutoUnboxing
int x = val1; //AutoUnboxing
double y = val2 + 5.3; //Double + double
//Parsing: 문자열데이터를 기본타입으로 변환
String s1 = "10";
String s2 = "5.43";
int i = Integer.parseInt(s1);
double j = Double.parseDouble(s2);
boolean k = Boolean.parseBoolean("true");
System.out.println(i * j);
}
}
'IT' 카테고리의 다른 글
19. 자바 - List 컬렉션 기초 (1) | 2022.10.05 |
---|---|
18. 자바 - java.util 패키지 (0) | 2022.10.05 |
14. 자바 - 다형성 (0) | 2022.09.28 |
프린터 오프라인 상태로 인쇄 안될 때 해결 방법 (0) | 2022.09.28 |
15-2. 자바 - 사용제한자 추상화(abstract) (0) | 2022.09.27 |