Information Security Study
240119 자바 API 등(System, String, StringBuilder/StringBuffer, Math 클래스) 본문
네트워크 캠퍼스/JAVA
240119 자바 API 등(System, String, StringBuilder/StringBuffer, Math 클래스)
gayeon_ 2024. 1. 19. 15:54System 클래스
- 자바 프로그램은 운영체제상에서 바로 실행되는 것이 아니라 JVM 위에서 실행된다. 따라서 운영체제의 모든 기능을 자바 코드로 직접 접근하기는 어렵다.
- 하지만 System 클래스를 이용하면 운영체제의 일부 기능을 이용할 수 있다. 프로그램 종료, 키보드로 입력, 모니터로 출력, 메모리 정리, 현재 시간 읽기 등이 가능하다.
- System 클래스의 모든 멤버는 static으로 구성되어 있어 클래스 이름으로 바로 접근이 가능하다.
System 클래스 주요 메서드
- exit(): 현재 실행하고 있는 프로세스를 강제 종료시킨다. 정상 종료일경우 매개값으로 0을 주고, 비정상 종료인경우 0 이외에 다른 값을 준다.
- currentTimeMillis() : 컴퓨터의 시계로부터 현재 시간을 읽어서 밀리세컨드(1/1000초) 단위와 나노세컨드(1/10^9초)단위의 long값을 리턴한다. 주로 프로그램의 실행 소요 시간 측정으로 성능을 테스트할 때 사용한다.
- getProperty(): JVM이 시작할 때 자동 설정되는 시스템의 속성값을 구한다.
- gc(): Garbage Collector를 실행시킨다.
String 클래스
- String은 생성자를 사용해서 객체를 만들 필요 없이 기초 데이터를 사용할 때처럼 바로 초기화해서 사용할 수 있다.
String 클래스의 주요 메서드
- charAt(): 특정 인덱스의 글자를 리턴.
- indexOf(): 특정 문자열의 시작 인덱스 값을 반환한다. 만약 주어진 문자열이 포함되어 있지 않으면 -1을 리턴한다.
- length(): 문자열의 길이를 알려준다.
- replace(): 특정 문자열을 변경한다.
- substring(): 인덱스를 기준으로 그 앞의 문자열을 잘라준다. 만약 매개값으로 인덱스를 2개 주면 처음 매개값 이상 두 번째 매개값 미만의 문자열을 제외하고 나머지를 삭제한다.
- toUpperCase(): 문자열을 대문자로 치환한다.
- toLowerCase(): 문자열을 소문자로 치환한다.
- trim(): 문자열의 앞, 뒤 공백을 제거한다.
- equals(): 문자열의 값을 비교한다.
- valueOf(): 기본 데이터 타입의 값들을 문자열로 변환한다.
String 클래스의 단점
- String 클래스는 아주 많이 쓰이고 좋은 기능들을 많이 가지고 있지만 메모리를 과소비한다는 문제점이 있다.
- String 객체는 처음 초기화된 데이터에 변화가 생기면 기존 객체를 재활용하지 않고 새로운 객체를 생성한다.
charAt() 예제
package api.lang.string;
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() 예제
package api.lang.string;
public class StringIndexOf {
public static void main(String[] args) {
// 특정 문자열의 시작 인덱스 값을 반환한다.
String to = "tomatoes";
// 단일 파라미터로 조회만 할 경우 0번에서 제일 가까운 단어 하나만 조회된다.
System.out.println(to.indexOf("to"));
// 두 번째 파라미터로 조회 시작 파라미터를 지정할 수 있다.
System.out.println(to.indexOf("to", 1));
// 없는 단어 조회시 -1이 나온다.
System.out.println(to.indexOf("na"));
}
}
replace() 예제
package api.lang.string;
public class StringReplace {
public static void main(String[] args) {
// 자바는 15버전부터 멀티라인 문자열을 지원한다.
// 원래 자바 문자열은 여닫는 " 를 한 줄에 작성해야 했다.
// String a = "가나다라";
// String a = "가나다라 (허용)
// 마바사"; (허용 안함)
// 여닫는 따옴표가 다른 줄에 위치한 경우는 """을 이용한다.
// """을 사용한 줄에는 문자열을 작성할 수 잆고 다음 줄부터 작성해야 한다.
String notice = """
공지사항
1. 복습 철저히 해주세요
2. 회고록 매일 작성해주세요
3. 개발 공부 집중해주세요 """;
System.out.println(notice);
// replace()는 String을 리턴하고 첫 단어를 두 번째 단어로 바꿔준다.
String newNotice = notice.replace("해주세요", "하기");
System.out.println(newNotice);
}
}
substring() 예제
package api.lang.string;
public class StringSubstring {
public static void main(String[] args) {
// 주민번호 양식
String ssn = "121230-4568137";
System.out.println(ssn);
// substring() 메서드에 매개값으로 인덱스를 1개 지정 시
// 해당 인덱스부터 마지막 지점까지의 문자를 추출한다.
String last = ssn.substring(7);
System.out.println(last);
// substring() 메서드에 매개값으로 인덱스를 2개 지정 시
// 첫 번째 매개값 이상, 두 번째 매개값 미만 범위 문자를 추출한다.
String first = ssn.substring(0, 6); // 0번 이상 6번 미만
System.out.println(first);
}
}
trim() 예제
package api.lang.string;
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() 예제
package api.lang.string;
public class StringValueOf {
public static void main(String[] args) {
int a = 10;
double b = 8.79;
System.out.println(a + b); // 18.79
String str1 = String.valueOf(a); // int -> String
String str2 = String.valueOf(b); // double -> String
System.out.println(str1 + str2);
}
}
StringBuilder
- String 클래스의 단점인 새로운 객체를 생성하는 문제로 인해 속도가 느려지는 현상이 발생하기 때문에 이 문제를 해결하기 위해 속도적인 측면에서 개선된 StringBuffer와 StringBuilder를 사용한다.
- StringBuilder가 성능적으로는 좀 더 낫지만, StringBuffer는 Thread safety를 보장한다.
- 따라서 정말 세밀한 성능이슈를 따지지 않는 환경에서는 StringBuffer를 쓰면 중간은 간다.
StringBuilder & StringBuffer 클래스의 주요 메서드
- append(): 기존 문자열의 뒤에 문자열을 추가한다.
- insert(): 특정 위치에 문자열을 추가한다.
- delete(): 문자열을 삭제한다.
- deleteCharAt(): 특정 인덱스의 문자 하나를 삭제한다.
- replace(): 문자열의 일부분을 다른 문자열로 대체한다.
- setCharAt(): 문자열에서 주어진 index의 문자를 다른 문자로 대체한다.
- toString(): StringBuilder 객체의 값을 문자열로 반환한다.
- reverse(): 문자열을 거꾸로 뒤집는다.
※ 매번 할당하지 않는 원리
StringBuilder와 StringBuffer는 생성 시 할당하는 저장용량 capacity (16) 을 가지고 있으며, append 연산으로 저장용량을 초과하는 경우 기존 저장용량의 1.5배가 되는 새로운 저장용량을 가진 객체를 재할당하게 된다.
StringBuilder & StringBuffer 예제
package api.lang.stringb;
public class StringBuilderExample {
public static void main(String[] args) {
// 이 코드에서 StringBuilder는 전부 StringBuffer로 대체해도 잘 동작한다.
// 둘의 차이는 쓰레드 안전이 보장되는지 아닌지 여부뿐이다.
// 따라서 쓰레드 안전을 보장받고 싶다면 StringBuffer를 사용하면 된다.
StringBuilder sb = new StringBuilder("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());
}
}
Math 클래스
- Math 클래스는 수학 계산에 사용할 수 있는 메서드들을 제공한다.
- Math 클래스가 제공하는 메서드는 모두 정적 메서드이므로 Math 클래스 이름으로 바로 사용이 가능하다.
Math 클래스 주요 메서드
- abs(): 절댓값을 구함.
- ceil(): 올림값을 구함.
- floor(): 내림값을 구함.
- max(): 수를 비교하여 최댓값을 구함.
- min(): 수를 비교하여 최솟값을 구함.
- random(): 랜덤값을 구함(0.0 <= 값 < 1.0)
- rint(): 현재 수에서 가까운 정수를 실수형태로 구함.
- round(): 반올림값을 구함.
Math 예제
package api.lang.math;
public class MathExample {
public static void main(String[] args) {
// 수학 관련된 연산이나 혹은 상수를 저장해둔 Math 클래스는 정적 변수와 메서드를 가지므로
// 굳이 Math 객체를 생성하지 않아도 활용할 수 있다.
// 절댓값 출력
System.out.println(Math.abs(-15.294));
// 올림값 출력
System.out.println(Math.ceil(10.0));
System.out.println(Math.ceil(10.000001));
// 내림값 출력
System.out.println(Math.floor(10.0));
System.out.println(Math.floor(10.9999999));
// 최댓값: 제시된 수 중 가장 큰 값 하나만 출력
System.out.println(Math.max(99.9, 12.34));
// 최솟값: 제시된 수 중 가장 작은 값 하나만 출력
System.out.println(Math.min(0.0001, 0.00001));
// 무작위 수: 하지만 컴퓨터 시스템은 완벽한 난수가 아닌 시드값에 따른 의사난수를 쓴다.
System.out.println(Math.random());
// 가장 가까운 실수 출력
System.out.println(Math.rint(12.500001));
System.out.println(Math.rint(12.499999));
// 반올림: 소수점 아래 값이 0.5 미만이면 그대로, 이상이면 1 증가
System.out.println(Math.round(10.49999));
System.out.println(Math.round(10.500001));
// 혹은 Math 클래스 내에 정적변수로 자주 사용하는 상수값(원주율, 자연상수 등)도 제공한다.
System.out.println(Math.PI);
System.out.println(Math.E);
}
}