Java 파트11-2. java.lang 패키지

1. System 클래스


System 클래스의 모든 필드와 메소드는 정적 필드 및 메소드로 구성

프로그램 종료(exit())

  • exit 메소드를 호출하여 JVM을 강제 종료 = JAVA프로그램을 강제 종료
  • exit 메소드가 지정하는 int 매개값을 종료 상태값이라 함
    • 보통은 매개값으로 0을 주어 정상 종료시킨다
package sec02.exam06;

public class ExitExam {

	public static void main(String[] args) {
		for(int i=0;i<10;i++) {
			System.out.println(i);
			if(i==5)
				System.exit(0);
		}

	}

}

현재 시각 읽기(currentTimeMillis(), nanoTime())

  • currentTimeMillis() : 1/10^3 단위 long 값 리턴
  • nanoTime() : 1/10^9 단위 long 값 리턴
package sec02.exam06;

public class ExitExam {

	public static void main(String[] args) {
		long time1 = System.nanoTime();
		
		int sum = 0;
		for(int i=1;i<10000;i++) {
			sum+=i;
		}
		
		long time2 = System.nanoTime();
		
		System.out.println(time2-time1);
	}

}


2. Class 클래스


자바는 클래스와 인터페이스의 메타 데이터를 Class 클래스로 관리한다. 메타 데이터는 타입 이름 및 파일 경로 정보, 필드 정보, 생성자 정보, 메소드 정보를 의미한다.

Class 객체 얻기(getClass(), forName())

클래스명으로 얻는 방법

// 두 가지 방법
Class clazz = 클래스이름.class
Class clazz = Class.forName("패키지...클래스이름")

객체로부터 얻는 방법

Class clazz = 참조변수.getClass();
// 예시
package sec02.exam07;

public class CarExam {

	public static void main(String[] args) throws ClassNotFoundException {
		
		// Car클래스의 클래스 객체가 생성되어 번지가 clazz에 저장
		Class clazz = Car.class; 
		
		// 해당 클래스의 클래스 객체가 생성되어 번지가 clazz2에 저장
		// 만약 해당되는 클래스가 없다면 예외가 발생
		Class clazz2 = Class.forName("sec02.exam07.Car");
		
		// Car 클래스의 클래스 객체 번지를 리턴
		Car car = new Car();
		Class clazz3 = car.getClass();
		
		System.out.println(clazz == clazz2); // true
		System.out.println(clazz == clazz3); // true
		
		System.out.println(clazz.getName()); // sec02.exam07.Car
		System.out.println(clazz.getSimpleName()); // Car
		System.out.println(clazz.getPackage().getName()); // sec02.exam07 // 패키지이름

	}

}

3가지 방법으로 Car클래스의 클래스 객체를 얻어서 대입을 했는데 Car 클래스는 하나이기 때문에 이들 각각의 변수가 참조하는 클래스 객체는 단 하나이다. 즉, 변수가 참조하고 있는 메모리 번지는 같다는 의미이다.

클래스 경로를 활용하여 리소스 절대 경로 얻기

  • Class 객체는 파일 경로 정보를 가지고 있기 때문에 이 경로를 활용해 다른 리소스 파일의 경로를 얻을 수 있다.

그림1

Car클래스의 객체의 번지를 clazz에 저장하고 Class가 가지고 있는 getResource 메소드의 인자로 동일한 위치의 경우 파일명만, 하위 폴더 밑에 있다면 하위폴더/파일명을 작성하여 getResource가 리턴한 URL에서 이 URL이 가지고 있는 getPath메소드를 호출하게 되면 최종적으로 변수에는 파일에 대한 절대경로가 저장된다. 이렇게 절대 경로를 구해서 이미지 데이터를 읽고 UI에 나타낼 수 있는 것이다.
패키지 폴더를 다른 경로에 놓고 실행할 수도 있다. 예를 들면 C:\가 아니고 D:\에 가져다 놓고 실행할 수도 있다는 것이다. 하지만 위와 같이 사용하면 패키지가 어디에 있든지 간에 정확한 경로를 얻을 수 있다.


3. String 클래스


스트링 리터럴과 new String으로 생성된 스트링 객체는 서로 다르게 관리된다. 스트링 리터럴은 자바 내부에서 리터럴 테이블로 특별히 관리하여, 동일한 리터럴을 공유시킨다. 하지만 new String으로 생성된 스트링은 new를 이용하여 생성되는 다른 객체와 동일하게 힙 메모리에 생성된다. 즉, String str = “자바”; 의 경우 동일한 “자바”의 경우 같은 곳을 참조하지만, new의 경우는 문자열이 같더라도 서로 다른 곳을 참조한다. 직접 String 객체를 생성

// 배열 전체를 String 객체로 생성
String str = new String(byte[] bytes);

// 지정한 문자셋으로 디코딩
String str = new String(byte[] bytes, String charsetName);

// 배열의 offset 인덱스 위치부터 length만큼 String 객체로 생성
String str = new String(byte[] bytes, int offset, int length);
// 지정한 문자셋으로 디코딩
String str = new String(bytes[] bytes, int offset, int length, String charsetName)

이외에도 여러가지 방법이 있다.
// 예시
package sec02.exam08;

public class ByteToStringExam {

	public static void main(String[] args) {
		byte[] bytes = {72,101,108,108,111,32,74,97,118,97};
		
    // String 생성자는 bytes배열의 값을 문자로 변환해서 전부 결합한 문자열을 만들어 String 객체로 생성한다
		String str1 = new String(bytes); 
		System.out.println(str1); // Hello Java
		
		String str2 = new String(bytes,6,4);
		System.out.println(str2); // Java
	}

}

// 예시
package sec02.exam08;

import java.io.IOException;

public class KeyboardToStringExam {

	public static void main(String[] args) throws Exception {
		byte[] bytes = new byte[100];
		
		System.out.print("입력: ");
		// System.in은 키보드로 입력이고
		// read는 키코드 값을 읽는데 매개값에 저장한다는 뜻
		// 그리고 read는 읽은 키코드의 수를 return
		// 만약 hello와 엔터를 입력하면 윈도우 자바에서는 개행이 \r\n이므로
		// 2개가 추가되어 총 7이 리턴된다		
		int readByteNo = System.in.read(bytes);
		
		String str = new String(bytes,0,readByteNo-2);
		System.out.println(str);
		

	}

}

그림2


문자 추출(charAt())

  • 매개값으로 주어진 인덱스의 문자를 리턴
package sec02.exam08;

public class CharAtExam {

	public static void main(String[] args) {
		String subject = "자바 프로그래밍";
		char charValue = subject.charAt(3);
		System.out.println(charValue); // 프
	}

}

인덱스 3에 해당하는 ‘프’가 리턴되어 출력된다.


문자열 비교(equals())

  • 문자열 비교를 할 때 ==를 사용하면 원하지 않는 결과가 나올 수 있다. -> equals 사용
package sec02.exam08;

public class EqualsExam {

	public static void main(String[] args) {
		// new를 이용할 경우 항상 별개의 객체가 만들어진다.
		String strVar1 = new String("신민철");
		
		// 문자열 리터럴로 대입한 문자열의 경우 하나의 String 객체가 생성되고 공유된다.
		String strVar2 = "신민철";
		String strVar3 = "신민철";
		
		System.out.println(strVar1==strVar2); // false // 번지가 다르므로
		System.out.println(strVar2==strVar3); // true // 번기가 같음
		
		System.out.println(strVar1.equals(strVar2)); // true // 문자열이 같음
		System.out.println(strVar1.equals(strVar3)); // true // 문자열이 같음

	}

}

그림3


바이트 배열로 변환(getBytes())

  • 문자열을 가지고 getBytes 메소드를 호출하면 각각의 문자를 바이트로 만들어 배열에 저장한 다음에 리턴한다. 이때 메소드의 매개값으로 문자셋에 대한 정보를 주게 되면 문자열을 바이트로 바꿀때 문자셋대로 바꿀 수 있다.
  • getBytes 메소드는 시스템의 기본 문자셋으로 인코딩된 바이트 배열 리턴
  • getBytes(Charset charset) 메소드는 특정 문자셋으로 인코딩된 바이트 배열 리턴
  • 바이트 배열을 다시 문자열로 디코딩할 때에는 어떤 문자셋으로 인코딩되었는가에 따라 다름
package sec02.exam08;

import java.io.UnsupportedEncodingException;

public class StringGetBytes {

	public static void main(String[] args) {
		String str = "안녕하세요";
		
		// str을 기본적으로 주어진 문자셋으로 바이트로 변환해서 바이트 배열로 리턴
		byte[] bytes1 = str.getBytes();
		// 기본적으로 한글 한자당 2바이트로 표현하므로 10바이트
		System.out.println("bytes1.length: " + bytes1.length);
		
		// 기본적으로주어진 문자셋으로 bytes1을 디코딩
		String str1 = new String(bytes1);
		System.out.println("bytes->String: "+str1);
		
		try {
			// 한글 한자를 3바이트
			byte[] bytes3 = str.getBytes("UTF-8");
			System.out.println("bytes3.length: " + bytes3.length);
			
			// UTF-8로 인코딩했으므로 디코딩할때도 UTF-8 사용
			String str3 = new String(bytes3,"UTF-8");
			System.out.println("bytes->String: "+str3);
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

	}

}


문자열 찾기(indexOf())

  • 매개값으로 주어진 문자열이 시작되는 인덱스 리턴
  • 주어진 문자열이 포함되어 있지 않으면 -1 리턴

문자열 찾기(contains())

  • 주어진 문자열이 존재하면 true, 아니면 flase를 리턴
package sec02.exam08;

public class StringindexOfExam {

	public static void main(String[] args) {
		String subject = "자바 프로그래밍";
		int location = subject.indexOf("프로그래밍");

		System.out.println(location);
		
		if(subject.indexOf("자바") != -1) {
			System.out.println("자바에 관련된 책");
		} else {
			System.out.println("자바에 관련되지 않은 책");
		}
		
		if(subject.contains("C")) {
			System.out.println("C에 관련된 책");
		} else {
			System.out.println("C에 관련되지 않은 책");
		}

	}

}


문자열 길이(length())

  • 문자열의 길이를 리턴
package sec02.exam08;

public class LengthExam {

	public static void main(String[] args) {
		String ssn = "1234567894123";
		int length = ssn.length();
		if(length == 13) {
			System.out.println("주민번호 자리수가 일치한다.");
		} else {
			System.out.println("주민번호 자리수가 일치하지 않는다.");
		}

	}

}


문자열 대치(replace())

  • 첫 번째 매개값인 문자열을 찾아 두 번째 매개값인 문자열로 대치한 새로운 문자열 생성 및 리턴
  • 원본 문자열을 변경하지 않고 새로운 것을 리턴한다는 점을 주의!
  • replace가 새로운 문자열을 리턴하는 이유는 String 타입 때문인데 String 타입은 문자열이 한 번 저장되면 다른 문자열로 변경이 불가능하다.
package sec02.exam08;

public class ReplaceExam {

	public static void main(String[] args) {
		String oldStr = "자바 프로그래밍";
		String newStr = oldStr.replace("자바", "JAVA");
		
		System.out.println(newStr);

	}

}


문자열 잘라내기(substring())

  • 주어진 인덱스에서 문자열을 추출
  • substring(int beginIndex, int endIndex)는 주어진 시작과 끝 인덱스 사이의 문자열 추출
  • substring(int beginIndex)는 주어진 인덱스부터 끝까지 문자열 추출
package sec02.exam08;

public class SubstringExam {

	public static void main(String[] args) {
		String ssn = "123456-1234567";
		
		String firstNum = ssn.substring(0,6); // 5번째 인덱스까지만 포함
		String secondNum = ssn.substring(7);
		
		System.out.println(firstNum);
		System.out.println(secondNum);
	}

}


알파벳 소, 대문자 변경(toLowerCase(), toUpperCase())

package sec02.exam08;

public class AlphabetCase {

	public static void main(String[] args) {
		String original = "Java Programming";
		
		String lowerCase = original.toLowerCase();
		String upperCase = original.toUpperCase();
		
		System.out.println(lowerCase);
		System.out.println(upperCase);
	}

}

그림4


문자열 앞뒤 공백 잘라내기(trim())

  • 문자열의 앞뒤 공백을 제거한 새로운 문자열 생성 및 리턴
package sec02.exam08;

public class TrimExam {

	public static void main(String[] args) {
		String oldStr = "    자바   프로그래밍   ";
		String newStr = oldStr.trim();
		
		System.out.println(oldStr);
		
		// 양쪽 공백만 지워지지 중간에 공백은 지워지지 않음
		System.out.println(newStr);
		

	}

}

그림4

String 타입이므로 수정되는 것이 아닌 새로운 객체가 생성된다.


문자열 변환(valueOf())

  • 기본 타입의 값을 문자열로 변환
package sec02.exam08;

public class StringvalueOfExam {

	public static void main(String[] args) {
		String str1 = String.valueOf(10);
		String str2 = String.valueOf(10.54);
		String str3 = String.valueOf(true);
		
		System.out.println(str1); // 10
		System.out.println(str2); // 10.54
		System.out.println(str3); // true
	}

}


4. StringBuffer 클래스


String 객체의 경우 내부의 문자열을 수정할 수 없지만, StringBuffer 객체는 문자열을 저장하는 가변 버퍼를 가지고 있기 때문에 저장된 문자열의 수정이 가능하다. 문자열의 크기가 늘어나면 내부 버퍼 크기를 자동으로 조절한다. 따라서 간단한 문자열은 String으로, 문자열의 길이가 길거나 수시로 변하는 경우 StringBuffer을 사용한다.

// 생성자
StringBuffer sb = new StringBuffer("문자열");

StringBuffer sb = new StringBuffer("java");

활용 메서드는 다음과 같다.

  • StringBuffer append(String str) : str 스트링을 스트링 버퍼에 덧붙인다.
  • StringBuffer append(StringBuffer sb) : sb 스트링 버퍼를 현재 스트링 버퍼에 덧붙인다.
  • int capacity() : 스트링 버퍼의 현재 크기 리턴
  • StringBuffer delete(int start, int end) : start 위치에서 end 위치 앞까지 부분 문자열 삭제
  • StringBuffer insert(int offset, String str) : str 스트링을 스트링 버퍼의 offset 위치에 삽입, 해당 위치에 있던 것은 뒤로 밀림
  • StringBuffer replace(int start, int end, String str) : 스트링 버퍼 내의 start 위치의 문자부터 end의 앞 문자까지를 str로 대치
  • StringBuffer reverse() : 스트링 버퍼 내의 문자들을 반대 순서로 변경
  • void setLength(int newLength) : 스트링 버퍼 내의 길이를 newLength로 재설정, 현재 길이보다 길다면 널문자로 채우고, 작으면 기존 문자열이 잘린다.
StringBuffer sb = new StringBuffer("a"); // a
sb.append(" pencil"); // a pencil
sb.insert(2,"nice "); // a nice pencil
sb.replace(2,6,"bad"); // a bad pencil // 6이 공백이고 6 앞까지, 즉 5까지 
sb.delete(0,2); // bad pencil
sb.reverse(); // licnep dab
int n = sb.length(); // 10
char c = sb.charAt(3); // n
sb.setLength(3); // lic



© 2021. By Backtony