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 메서드

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) : 기본 데이터 타입의 객체를 만들 때 사용

 

 

 

 

 

 

 

 

 

 

 

 

'네트워크캠퍼스 > JAVA' 카테고리의 다른 글

객체지향 정리  (0) 2024.01.25
프로세스와 쓰레드  (0) 2024.01.24
자바의 예외처리전략  (0) 2024.01.18
예외처리  (0) 2024.01.17
인터페이스  (0) 2024.01.16

+ Recent posts