Information Security Study

240119 자바 API 등(System, String, StringBuilder/StringBuffer, Math 클래스) 본문

네트워크 캠퍼스/JAVA

240119 자바 API 등(System, String, StringBuilder/StringBuffer, Math 클래스)

gayeon_ 2024. 1. 19. 15:54

System 클래스

  • 자바 프로그램은 운영체제상에서 바로 실행되는 것이 아니라 JVM 위에서 실행된다. 따라서 운영체제의 모든 기능을 자바 코드로 직접 접근하기는 어렵다.
  • 하지만 System 클래스를 이용하면 운영체제의 일부 기능을 이용할 수 있다. 프로그램 종료, 키보드로 입력, 모니터로 출력, 메모리 정리, 현재 시간 읽기 등이 가능하다.
  • System 클래스의 모든 멤버는 static으로 구성되어 있어 클래스 이름으로 바로 접근이 가능하다.

 

System 클래스 주요 메서드

  1. exit(): 현재 실행하고 있는 프로세스를 강제 종료시킨다. 정상 종료일경우 매개값으로 0을 주고, 비정상 종료인경우 0 이외에 다른 값을 준다.
  2. currentTimeMillis() : 컴퓨터의 시계로부터 현재 시간을 읽어서 밀리세컨드(1/1000초) 단위와 나노세컨드(1/10^9초)단위의 long값을 리턴한다. 주로 프로그램의 실행 소요 시간 측정으로 성능을 테스트할 때 사용한다.
  3. getProperty(): JVM이 시작할 때 자동 설정되는 시스템의 속성값을 구한다.
  4. gc(): Garbage Collector를 실행시킨다.

 

String 클래스

  • String은 생성자를 사용해서 객체를 만들 필요 없이 기초 데이터를 사용할 때처럼 바로 초기화해서 사용할 수 있다.

 

String 클래스의 주요 메서드

  1. charAt(): 특정 인덱스의 글자를 리턴.
  2. indexOf(): 특정 문자열의 시작 인덱스 값을 반환한다. 만약 주어진 문자열이 포함되어 있지 않으면 -1을 리턴한다.
  3. length(): 문자열의 길이를 알려준다.
  4. replace(): 특정 문자열을 변경한다.
  5. substring(): 인덱스를 기준으로 그 앞의 문자열을 잘라준다. 만약 매개값으로 인덱스를 2개 주면 처음 매개값 이상 두 번째 매개값 미만의 문자열을 제외하고 나머지를 삭제한다.
  6. toUpperCase(): 문자열을 대문자로 치환한다.
  7. toLowerCase(): 문자열을 소문자로 치환한다.
  8. trim(): 문자열의 앞, 뒤 공백을 제거한다.
  9. equals(): 문자열의 값을 비교한다.
  10. 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 클래스의 주요 메서드

  1. append(): 기존 문자열의 뒤에 문자열을 추가한다.
  2. insert(): 특정 위치에 문자열을 추가한다.
  3. delete(): 문자열을 삭제한다.
  4. deleteCharAt(): 특정 인덱스의 문자 하나를 삭제한다.
  5. replace(): 문자열의 일부분을 다른 문자열로 대체한다.
  6. setCharAt(): 문자열에서 주어진 index의 문자를 다른 문자로 대체한다.
  7. toString(): StringBuilder 객체의 값을 문자열로 반환한다.
  8. 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 클래스 주요 메서드

  1. abs(): 절댓값을 구함.
  2. ceil(): 올림값을 구함.
  3. floor(): 내림값을 구함.
  4. max(): 수를 비교하여 최댓값을 구함.
  5. min(): 수를 비교하여 최솟값을 구함.
  6. random(): 랜덤값을 구함(0.0 <= 값 < 1.0)
  7. rint(): 현재 수에서 가까운 정수를 실수형태로 구함.
  8. 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);
	}
}