* 이 글은 제가 공부하기 위해 최대한 사실에 입각해 내용을 적으려고 하지만 일부 내용들이 정확하지 않을 수 있습니다.
혹시나 잘못된 부분이 있으면 너그럽게 이해해주시고 피드백 부탁드려요!
12장 기본 API
(자바에서 제공하는 기본 프로그램)
12.1 java.lang 패키지
자바에서 제공하는 API 중 가장 많이 사용되는 클래스들로 자바 프로그램의 기본적인 클래스를 가지고 있는 패키지이다. java.lang 패키지에 있는 클래스들은 import 없이 바로 사용할 수 있는 클래스들로 이루어져 있다. 앞에서 String 클래스나 System 클래스를 import 하지 않고 사용할 수 있었던 이유가 바로 이것 때문이다. 이 java.lang 패키지의 많은 클래스들 중에서 자주 사용하는 클래스들만 배워보도록 하자.
클래스 | 용도 |
Object | 모든 클래스의 최상위 클래스 |
System | 표준 입출력 관련 클래스 |
Class | 클래스를 메모리에 로드할 때 사용 |
String | 문자열 |
StringBuffer, StringBuilder | 문자열 저장하거나 처리할 때 사용 |
Math | 수학관련 가능 |
Wrapper | 기본자료형의 데이터관련 클래스 |
12.1.1 Object 클래스
Object 클래스는 모든 클래스의 최상위 클래스이다. 클래스를 정의할 때 다른 클래스를 상속받지 않으면 그 클래스는 Object를 상속받도록 컴파일러가 자동으로 추가해준다. 결국 모든 클래스의 가장 상위에 있는 클래스이다. 따라서 모든 클래스는 Object의 메서드를 사용할 수 있게 된다. Object 클래스는 멤버 변수는 존재하지 않고, 다른 클래스에서 사용하게 될 메서드만 가지고 있어 Object 객체를 직접 생성하는 경우는 드물다.
메서드 | 설명 |
protected Object clone() | 자신 객체의 복사한 객체 리턴 |
public Boolean equals(Object obj) | 같은 객체인지 비교 |
protected void finalize() | 객체가 소멸될 때 가비지 콜렉션에 의해 호출되는 메서드 |
public Class getClass() | 자신 객체의 클래스 정보 리턴 |
public int hashCode() | 자신 객체의 해쉬코드 리턴 |
public String toString() | 자신 객체의 문자열 정보 리턴 |
public void notify() | 자신 객체를 사용하는 스레드 하나를 깨움 |
public void notifyAll() | 자신 객체를 사용하는 모든 스레드를 깨움 |
public void wait() | 다른 스레드가 notify/notifyAll을 실행할때까지 대기 |
public void wait(long timeout) | 다른 스레드가 notify/notifyAll을 실행할 때까지 timeout동안 대기 |
public void wait(long timeout, int nanos) | 다른 스레드가 notify/notifyAll을 실행할 때까지 timeout, nano동안 대기 |
이 중 equals(), hashCode(), toString() 메서드는 재정의해서 사용하는 경우가 많으므로 아래에서 살펴보고, 나머지 스레드에 관련된 notify(),notifyAll(), wait() 메서드는 뒤에 스레드 챕터에서 다시 살펴보도록 하자.
equals() 메서드
먼저 equals() 메서드에 대해 배워 보자. equals 메서드는 주로 객체를 비교하여 결과값을 boolean 값으로 리턴하는 역할을 한다.
아래 코드는 실제 Object 클래스에 정의되어 있는 equals() 메서드이다.
public boolean equals(Object obj) { return (this == obj); } |
this와 obj는 모두 참조변수로 비교하기 때문에 참조변수는 참조하고 있는 주소값으로 비교하게 된다.
package chapter12;
public class EqualsTest {
public static void main(String[] args) {
A a = new A();
A a2 = new A();
a.i = 10;
a2.i = 10;
System.out.println(a == a2);
System.out.println(a.equals(a2)); // 오버라이딩 목적으로 많이 씀
// 가지고 있는 멤버여부를 확인
}
}
class A {
int i;
@Override
public boolean equals(Object obj) {
return i == ((A)obj).i;
}
}
clone() 메서드
clone() 메서드는 클론이라는 말 그대로 객체를 복제하기 위한 메서드이다. 원본 객체의 필드값과 동일한 값을 가지는 새로운 객체를 새로 생성하는 것이다. 데이터를 제공할 때 원본의 데이터를 제공해서 수정을 하게 되면 수정 내용이 잘못되었을 때 원본으로 돌아가는 것이 어렵게 되기 때문에 데이터 분석 등에서는 원본 데이터를 제공하는 것보다는 복제한 데이터를 제공해서 이 데이터를 기반으로 분석 기법을 적용해보고 다시 새로운 분석 기법을 적용해보고자 할 때는 원본 데이터를 다시 복제해서 사용한다.
clone() 메서드를 사용하기 위해서는 java.lang 패키지에 있는 Cloneable이라는 인터페이스를 구현한 클래스에서만 사용이 가능하다.
이유는, 객체를 복제하는 경우 데이터도 복제되기 때문에, 무분별한 복제를 줄이기 위해 클래스를 정의한 사람이 Cloneable 인터페이스를 구현한다고 정의하는 것이 곧 복제를 허용한다는 의미가 되는 것이다. 이전에 배열 챕터에서 배웠던 배열을 복사하는 방법으로 System.arraycopy() 라는 메서드를 이용하는 방법을 배웠는데, 동일한 기능으로 clone() 메서드를 사용할 수 있다.
package chapter12;
public class EqualsTest {
public static void main(String[] args) {
A a = new A();
A a2 = new A();
a.i = 10;
a2.i = 10;
System.out.println(a == a2);
System.out.println(a.equals(a2)); // 오버라이딩 목적으로 많이 씀
// 가지고 있는 멤버여부를 확인
// a3
A a3 = a.clone();
//a == a3 ? 주소는 다르고 변수값만 같은것
A a4 = a; // 완전 같은것
}
}
class A implements Cloneable {
int i;
@Override
public boolean equals(Object obj) {
return i == ((A)obj).i;
}
@Override
protected A clone(){ // 공변변환이라 자손 클래스 복제하고 싶다
A a = null;
// TODO Auto-generated method stub
try {
a = (A)super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return a;
}
}
얕은복사 vs 깊은 복사
package chapter12;
import java.util.Arrays;
public class EqualsTest {
public static void main(String[] args) {
A a = new A();
A a2 = new A();
a.i = 10;
a2.i = 10;
// System.out.println(a == a2);
// System.out.println(a.equals(a2)); // 오버라이딩 목적으로 많이 씀
// 가지고 있는 멤버여부를 확인
// a3
A a3 = a.clone();
//a == a3 ? 주소는 다르고 변수값만 같은것
A a4 = a; // 복사
// a4 ==a?
a.i = 20;
a3.arr[1] = 10; // 얕은 복사(shallow copy)
System.out.println(a);
System.out.println(a3); // 클론을 통해서 만든 값들
System.out.println(a4);
}
}
class A implements Cloneable {
int i;
int[] arr = {1,2,3};
@Override
public boolean equals(Object obj) {
return i == ((A)obj).i;
}
@Override
protected A clone(){ // 공변변환이라 자손 클래스 복제하고 싶다
A a = null;
// TODO Auto-generated method stub
try {
a = (A)super.clone();
// 밑에 줄을 추가해주면 깊은 복사가 됨
a.arr = this.arr.clone(); // A클래스라느 참조에 배열이라는 참조
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return a;
}
@Override
public String toString() {
return "A [i=" + i + ", arr=" + Arrays.toString(arr) + "]";
}
}
12.1.2 System 클래스
System 클래스는 OS와 관련된 기능들이 존재하는 클래스로 모든 멤버가 static이라서 객체를 생성할 필요가 없기 때문에 생성자를 private으로 숨겨서 외부에서 객체 생성할 수 없도록 한 클래스이다. 화면에 출력하거나, 메모리, 현재 시간, 입/출력 등등이 존재한다. 이 System 클래스에서 가장 많이 사용되는 객체는 in과 out객체이다. System.in은 표준 입력 객체, System.out은 표준 출력 객체이다. 이 입/출력에 관련된 부분은 위에서 설명하기로 하고 System 클래스에 있는 자주 사용되는 메서드만 알아보자.
먼저 exit() 메서드는 프로그램을 강제 종료하는 기능을 하는데 매개변수 값을 정수를 넣어주는데, 이 정수는 운영체제에게 넘겨주는 코드로 어떤 이유로 종료되었는지 알려주는 코드값이며 0은 정상적으로 종료되었다는 메세지이다. exit(0) 형태로 사용된다. 또 다른 메서드로 현재 시스템에 설정된 속성값을 읽어오는 메서드가 있다. getProperty()라는 메서드인데 이 메서드는 JVM이 시작될 때 자동으로 읽어와 설정되는 속성값이다. 아래 예제는 getProperty() 메서드를 사용해서 대표적인 속성값들을 출력한 것이다.
exit()
package chapter12;
public class ExitEx {
public static void main(String[] args) {
System.exit(0); // 프로그램 끝
// System.out.println(System.currentTimeMillis()); // 시간정보보기
// 결과값 long타입으로 나옴
// Epoch - Time
// 1970-1-1 00:00:00 부터의 ms
// 1초가 지나면 1000
// 하루가 지나면 1970-1-2 00:00:00 + 24*60*60*1000
}
}
12.1.3 Class 클래스
Class 클래스는 클래스를 메모리에 로드하거나, 클래스나 인터페이스의 이름, 생성자, 필드, 메서드 정보 등을 확인할 수 있는 클래스이다. Class 객체를 얻는 방법은 객체를 이용해서 생성하는 방법과 문자열 주소를 이용해서 생성하는 방법이 있다.
package chapter12;
import java.lang.reflect.Method;
// 309page
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
ClassTest test1 = new ClassTest();
// 1번 방법 : 이미 만들어진 인스턴스를 통해 생성
Class c1 = test1.getClass();
// 2번 방법 : forName메서드를 통해 생성
// Class c2 = Class.forName("ClassTest");
Class c2 = Class.forName("chapter12.ClassTest"); // 해결방법
// 3번 방법 : 클래스 리터럴을 통해 생성
Class c3 = ClassTest.class;
// Class<ClassTest> c3 = ClassTest.class; // 위에 코드 노란줄 안뜨게하는 방법
//값 확인해보기
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
Object o = c3.newInstance(); // private 때문에, 추상클래스였을때문에, Exception이 2개 뜸
// 생성자 호출한다음에 인스턴스 생성하게 함
System.out.println(o);
Method[] methods = c3.getMethods();
for(Method m : methods) {
System.out.println(m.getName()); // object로부터 상속받은 메서드 다나옴
}
}
}
12.1.4 String 클래스
String 클래스는 이 책의 처음부터 계속 사용해왔던 문자열을 다루는 클래스이다. 문자열을 기본자료형을 정의하지 않고 클래스로 정의한 이유는 문자열과 관련된 여러가지 기능을 갖는 메서드까지 포함하기 위해서이다.
String 클래스의 특징으로 다른 클래스들과 다르게 new 키워드가 아니라 '=' 대입연산자로 객체를 생성할 수 있다. 그리고 + 더하기 연산이 가능한 클래스이다. 기본자료형과 + 연산을 하게 되면 기본자료형도 String으로 자동 형변환이 된다.
String에서 자주 사용하는 메서드들
메서드 | 기능 |
charAt(int index) | 문자열의 index 위치의 문자 리턴 |
equals(Object obj) | 해당 문자열의 값과 obj의 문자열 값을 비교 |
indexOf(String str) | 문자열 내 매개변수 문자열의 위치 리턴 |
indexOf(char ch) | 문자열 내 매개변수 문자(char)의 위치리턴 |
substring(int start) | 매개변수 start 위치(인덱스)에서 끝까지 잘라냄 |
substring(int start, int end) | 매개변수 start위치부터 end위치 전 인덱스까지 잘라냄 |
toLowerCase() | 문자열을 소문자로 변환하여 리턴 |
toUpperCase() | 문자열을 대문자로 변환하여 리턴 |
trim() | 문자열과 앞과 뒤 공백을 제거하여 리턴(중간의 공백은 제거 안됨) |
valueOf(기본자료형 i) | 기본자료형 값을 문자열로 변환하여 리턴 |
length() | 문자열의 길이를 리턴 |
startsWith(String str) | 문자열 중 매개변수 str로 시작하면 true 그렇지 않으면 false 리턴 |
endsWith(String str) | 문자열 중 매개변수 str로 끝나면 true 그렇지 않으면 false 리턴 |
replace(String old, String new) | 문자열 중 old를 new로 치환 |
replaceAll(String regex, String replacement) | 문자열 중 매개변수 문자열 regex를 replacement로 치환(정규식 사용가능) |
split(String regex) | 문자열을 매개변수 regex를 구분자로 나눠서 배열로 리턴 |
toString() | String 객체에 저장되어 있는 문자열 리턴 |
기본자료형 값을 문자열로 변경하는 방법 중 편한 방법이 + 덧셈 연산을 하는 방법과 valueOf() 메서드를 사용하는 방법이 있는데, 성능상으로는 valueOf()가 더 좋다고 하지만 큰 차이는 아니므로 편한 방법으로 사용하면 된다. 추가로 기본자료형 값들을 문자열로 변경하는 방법과 반대로 문자열을 기본자료형으로 변경하는 방법을 알아보자.
기본자료형 => 문자열 | 문자열 => 기본자료형 |
String.ValueOf(boolean b) String.ValueOf(char c) String.ValueOf(int i) String.ValueOf(long l) String.ValueOf(float f) String.ValueOf(double d) |
Boolean.getBoolean(String s) Byte.parseByte(String s) Short.parseShort(String s) Integer.parseInteger(String s) Long.parseLong(String s) Float.parseFloat(String s) Double.parseDouble(String s) |
기본료형에서 문자열로 변환하는 방법은 String 클래스의 valueOf() 메서드 하나를 사용하면 된다.
매개변수만 다르기 때문이다.(오버로딩) 그리고 문자열을 기본자료형으로 변환하는 방법은 기본자료형 이름 그대로 첫자만 대문자로 된 클래스이름에 메서드는 parseXXX 이므로 하나하나 외우지 말고 메서드 이름 규칙을 기억하면 어렵지 않게 기억할 수 있을 것이다.
12.1.5 StringBuffer, StringBuilder 클래스
StringBuffer 클래스는 객체 자체의 수정이 가능하다. 그래서 StringBuffer 클래스는 동적 문자열이라고 부른다. 동적으로 값이 수정될 수 있다는 뜻이다. 이 StringBuffer 클래스에서는 값 비교를 위해 equals() 메서드를 오버라이딩하지 않았기 때문에 문자열 자체의 값을 비교하려면 String 클래스로 비교한 후 equals() 메서드를 이용해 비교해야한다.
StringBuffer 클래스의 주요 메서드와 사용법에 대해 알아보자.
메서드 | 기능 |
append(boolean b) append(char c) append(char[] str) append(double d) append(float f) append(int i) append(long l) append(Object obj) append(String str) |
매개변수 값을 문자열로 변환하여 StringBuffer 객체의 문자열값의 뒤에 붙임 |
charAt(int index) | 매개변수 index 위치의 문자 리턴 |
delete(int start, int end) | 매개변수 start 위치부터 end 위치 전 인데스까지 삭제한 문자열 리턴 |
deleteCharAt(int index) | 매개변수 index 위치의 문자 삭제 |
insert(int pos, boolean b) insert(int pos, char b) insert(int pos, char[] b) insert(int pos, double b) insert(int pos, float b) insert(int pos, int b) insert(int pos, long b) insert(int pos, Object b) insert(int pos, String b) |
매개변수 pos 위치에 두번째 매개변수 값을 문자열로 변환하여 추가 |
length() | 문자열의 길이 리턴 |
substring(int start) substring(int start, int end) |
매개변수 start 위치부터 end 위치 전 인덱스까지 잘라냄 end 매개변수가 생략되면 끝까지 잘라내어 리턴 |
toString() | 문자열로 변환하여 리턴 |
sb.append().append()... 이런 형태로 append() 메서드가 계속 연결되어 있는 것을 볼 수 있는데, 이런 코딩 방법을 메서드 체이닝(Method Chaining)이라고 한다. 메서드를 체인처럼 줄줄이 연결시킨 형태이다. 이렇게 사용할 수 있으려면 이 메서드의 리턴값이 해당 객체여야만 한다. 이 append() 메서드의 리턴값이 StringBuffer 클래스의 객체이기 때문에 뒤에 계속 붙여서 연속으로 실행할 수 있는 것이다. 메서드 체이닝은 앞으로도 자주 보이게 되는 형태이니 개념을 이해해두자. 그리고 각 append() 메서드의 매개변수가 문자열, 실수, boolean 다양하게 들어가 있는데, 이 메서드 역시 다양한 데이터타입을 갖는 매개변수로 오버로딩되어 있기 때문이다.
StringBuilder 클래스는 자바 1.5버전 이후에 추가된 클래스로 StringBuffer 클래스와 메서드도 동일하고 거의 비슷하나 차이점은 모든 메서드가 스레드에 동기화되어 있지 않다는 점이다. 반대로 StringBuffer 클래스의 모든 메서드는 스레드에 동기화되어있다.
그렇다면 String 클래스와 문자열을 다루는 방법이나 구조도 비슷하고 나중에 toString()으로 다시 문자열로 변환해야하는 번거로움도 있는데 이 클래스는 왜 사용할까?
우선, 다양한 메서드를 통해 문자열값을 추가, 변경할 수 있다는 장점도 있지만 무엇보다 속도가 아주 빠르다. 대량의 문자열을 처리해야 하는 경우 String 클래스보다 StringBuffer나 StringBuilder 클래스를 사용하도록 하자. 아래 예제를 통해 속도 차이를 확인해보자.
12.1.6 Math 클래스
Math 클래스는 수학계산에 관련된 기능을 가진 클래스이다. 생성자의 접근제한자가 private이기 때문에 다른 클래스에서 객체생성을 할 수 없다. 모든 멤버가 static 예약어가 붙어있는 클래스 멤버이므로 Math.멤버명으로 접근이 가능하다. Math 클래스 안에는 인스턴스 멤버가 하나도 없고, 멤버 중 상수 멤버는 2개고 나머지는 모두 메서드 멤버다. 또한 Math 클래스는 final 클래스이므로 다른 클래스에서 상속도 받을 수 없다. 상수 멤버는 PI(원주율), E(자연로그)가 있는데 상수이기 때문에 대문자로 정의되어 있다.
Math 클래스의 자주 사용하는 메서드를 살펴보자.
메서드 | 기능 |
abs(int a) abs(double b) abs(float b) abs(float l) |
변수의 절대값 리턴 |
ceil(double 변수) | 매개변수보다 큰 가장 작은 수(값 올림) |
floor(double 변수) | 매개변수보다 작은 가장 큰 수(값 내림) |
max(int a, int b) max(double a, double b) max(float a, float b) max(long a, long b) |
매개변수 두 개 중 큰 수 리턴 |
min(int a, int b) min(double a, double b) min(float a, float b) min(long a, long b) |
매개변수 두 개 중 작은 수 리턴 |
random() | 0.0 이상 1.0 미만의 랜덤 수 리턴(1은 포함되지 않음) |
rint(double d) | 실수 d와 가장 가까운 정수값을 double로 리턴 |
round(double d) | 반올림 |
12.1.7 Wrapper 클래스
기본자료형을 객체화 할 수 있는 클래스를 통틀어 Wrapper 클래스라 한다. Wrapper 클래스가 필요한 경우는 기본자료형 변수를 객체로 처리해야하는 경우인데, 예를 들어 다른 메서드에서 매개 변수가 객체로 정의되어 있거나 객체로 저장해야 할 때, 객체간의 비교를 할 때 등의 경우에는 기본자료형 값들을 객체로 변환하여 작업을 수행해야한다.
이 때 사용되는 것이 Wrapper클래스이다. 8개의 기본자료형(byte, char, short, int, long, float, double, boolean)을 대표하는 8개 Wrapper 클래스가 있는데, 이 클래스들을 이용하면 기본자료형 값을 객체로 처리할 수 있다.
Wrapper 클래스들의 이름을 보면 기본자료형 이름의 첫 글자를 대문자로 한 것이므로 어렵지 않게 외울 수 있을 것이다.
기본자료형 char, int는 character, integer의 줄임말이기 때문에 결국 모든 Wrapper 클래스는 기본자료형의 첫자를 대문자로 지정해 만들어 놓은 클래스가 된다.
Wrapper클래스의 생성자는 매개변수로 문자열이나 각 자료형의 값들을 인자로 받는다. 생성자가 오버로딩 되어 있는 것이다. 그래서 여러 자료형으로 다양하게 사용할 수 있다. 이 때 주의할 점은 생성자의 매개변수로 문자열을 넣을 때, 각 자료형에 맞는 문자열을 사용해야한다는 것이다. 예를 들어 Integer("홍길동")과 같이 정수로 변환할 수 없는 문자열을 넣으면 NumberFormatException이 발생하게 된다.
기본자료형 | Wrapper 클래스 |
boolean | Boolean |
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
기본자료형과 Wrapper 클래스 사이에는 서로 자동형변환이 가능한데, 이것을 우리는 박싱(Boxing, 기본자료형 -> Wrapper 객체), 언박싱(Unboxing, Wrapper 객체 -> 기본자료형)이라고 부른다.
Wrapper라는 이름에서 알 수 있듯이 Wrap은 포장같은 것을 싸다라는 뜻을 가지고 있다. 기본자료형의 값을 Wrapper 클래스로 변환하는 것을 박스에 포장한다는 개념으로 박싱이라고 하고, Wrapper 클래스에 담긴 객체의 값을 기본자료형으로 변환하는 것을 박스로 푼다는 개념으로 언박싱이라고 한다.
문자열 => 기본자료형 | 문자열 => 클래스객체 |
byte b = Byte.parseByte("10); | Byte b = Byte.valueOf("10"); |
short s = Short.parseShort("10); | Short s = Short.valueOf("10"); |
int i = Integer.parseInt("10"); | Integer i = Integer.valueOf("10"); |
long l = Long.parseLong("10"); | Long l = Long.valueOf("10"); |
float f = Float.parseFloat("10.5"); | Float f = Float.valueOf("10.5"); |
double d = Double.parseDouble("10.5"); | Double d = Double.valueOf("10.5"); |
12.2 java.util 패키지
12.2.1 Random 클래스
이름에서 알 수 있듯이 랜덤 수를 생성해주는 기능이 있는 클래스이다. Math 클래스에도 random() 메서드가 있지만, double 자료형으로만 랜덤수를 구할 수 있어, Random 클래스를 이용하면 boolean, int, long, float 등 다양한 자료형으로도 랜덤수를 구할 수 있다. 또한 seed 값을 설정해서 같은 랜덤수를 얻을 수 있다. 이 seed 값을 넣으면 같은 랜덤수를 구할 수 있게 된다.
메서드 | 기능 |
Random() | Random 객체를 생성하는 생성자 |
Random(long seed) | seed값을 매개변수로 Random 객체 생성 |
nextBoolean() | boolean 랜덤 수 리턴 |
nextBoolean(byte[] bytes) | byte 배열에 랜덤 수를 추가 |
nextDouble() | double 자료형의 랜덤 수 리턴 |
nextGaussian() | 평균이 0.0 표준편차가 1인 가우시안분포의 랜덤 수 리턴 |
nextInt() | 정수 랜덤 값 리턴 |
nextInt(int n) | 0부터 n미만까지의 정수 타입의 랜덤값 리턴 |
nextLong() | long 타입의 랜덤값 리턴 |
setSeed(long seed) | seed 값 변경 |
seed값은 long type, 현재 시간에 기반
Random()은 ssed 값에 의해 랜덤 결과가 같을 수 있음
Unix Time, Epoch Time은 부르는 이름만 다를 뿐 같은 것을 의미합니다. (POSIX Time 이라고도 합니다.)
이것은 시간을 나타내는 방식으로, '1970년 1월 1일 00:00:00 협정 세계시(UTC)' 부터의 경과 시간을 초로 환산하여 정수로 나타낸 것입니다.
12.2.2 Scanner 클래스
Scanner 클래스는 화면이나 파일, 문자열 등의 입력으로부터 문자를 읽어주는 클래스이다. 또한 뒤에서 배울 정규 표현식(Regular Expression)을 이용해서 한 줄 단위로 검색할 수 있어 복잡한 형태의 문자도 다양하게 처리할 수 있다. 여기에서는 사용자가 콘솔화면에서 키보드를 통해 직접 입력한 값을 읽어 올 수 있는 방법을 알아보도록 하겠다. 사용 방법은 아래와 같다.
Scanner scan = new Scanner(System.in); String input = scan.nextLine(); |
사용자가 입력한 값은 nextLine() 메서드를 통해 input 변수에 대입된다. nextLine() 메서드 대신 nextXXX() 메서드를 이용해 다양한 자료형으로 변환할 수 있다. Scanner 클래스에서 제공하는 사용자가 입력한 입력값을 리턴하는 메서드는 아래와 같다.
리턴타입 | 메서드 |
boolean | nextBoolean() |
byte | nextByte() |
short | nextShort() |
int | nextInt() |
long | nextLong() |
double | nextDouble() |
float | nextFloat() |
String | nextLine() |
12.2.3 Date 클래스
Date 클래스는 날짜와 시간을 표현하는 클래스로 오늘 일자와 시간, 또는 특정 일자의 일자와 시간을 처리할 때 사용한다.
12.2.4 Calendar 클래스
Calendar 클래스는 Date 클래스보다 나중에 jdk에 추가된 클래스로 보다 향상된 기능을 제공한다. 그래서 최근엔 Date 클래스보다 Calendar 클래스를 더 많이 사용한다. 그렇다고 Calendar 클래스가 Date 클래스를 완전히 대체하는 것은 아니므로 두 클래스를 모두 알고 있어야하며, Calendar와 Date 객체간에 서로 변환하는 경우도 많으므로 반드시 알아두도록 하자.
> Calendar 객체를 Date로 변환
Calendar cal = Calendar.getInstance(); Date d = new Date(cal.getTimeInMilis()); |
> Date 객체를 Calendar로 변환
Date d = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(d); |
Calendar 클래스는 추상 클래스이고 생성자의 접근 지정자가 protected라서 외부에서 new 연산자로 객체를 생성할 수 없고, 반드시 getInstance() 메서드를 통해 객체를 생성하거나 Calendar 클래스를 상속받은 GregorianCalendar 클래스를 이용해서 생성한 객체를 사용해야 한다.
Calendar cal = Calendar.getInstance(); |
> Calendar 클래스의 주요 메서드
메서드 | 기능 |
after(Object when) | 현재 Calendar 객체가 when 객체의 날짜보다 이후이면 true 그렇지 않으면 false 리턴 |
before(Object when) | 현재 Calendar 객체가 when 객체의 날짜보다 이전이면 true 그렇지 않으면 false 리턴 |
get(int field) | field에 해당하는 값 리턴 |
getInstance() | 현재 기준의 Calendar 객체 리턴 |
set(int y, int m, int d) | Calendar 객체에 년,월,일을 설정 |
위 표의 get() 메서드를 통해 현재 Calendar 객체의 필드값에 해당하는 값(년도, 월, 일, 시, 분, 초)을 얻을 수 있는데, 그럴려면, 필드에 들어갈 상수명을 알고 있어야한다. Calendar 클래스의 get() 메서드에서 사용하는 상수를 알아보자.
상수 | 설명 |
AM_PM | 0: 오전, 1: 오후 |
DAY_OF_MIONTH, DATE | 일자 |
MONTH | 달(1월: 0부터 시작) |
YEAR | 연도 |
SECOND | 초 |
MINUTE | 분 |
HOUR | 시간 |
HOUR_OR_DAY | 시간(0~23) |
DAY_OF_WEEK | 요일(일요일:1부터 시작) |
DAY_OF_YEAR | 일년 중 몇번째 일자 |
WEEK_OF_MONTH | 현재 달에서 몇주째인지 |
WEEK_OF_YEAR | 현재 연도에서 몇주째인지 |
DAY_OF_WEEK_IN_MONTH | 현재 월에서 몇번째 요일인지 |
12.2.5 Arrays 클래스
Arrays 클래스는 클래스 내에서 제공하는 static 메서드 등을 이용하여 배열의 비교나, 배열의 정렬 또는 배열의 내용을 특정 값으로 채우고자 하는 등의 일을 수행하는 클래스이다.
메서드 | 기능 |
asList(Object[] arr) | 매개변수의 배열을 List 객체로 리턴 |
binarySearch(Object arr, Object key) | 이진 검색으로 arr 배열에서 key를 찾아 index값 리턴 |
equals(Object[] arr1, Object[] arr2) | arr1 배열과 arr2 배열을 비교하여 같은 배열이면 true를 그렇지 않으면 false 리턴 |
fill(Object[] arr, Object val) | arr배열의 요소를 val값으로 모두 채움 |
fill(Object[] arr, int sidx, int eidx, Object val) | arr배열 중 sidx에서 edix전 인덱스까지 val 값으로 채움 |
sort(Object[] arr) | arr 배열을 오름차순으로 정렬 |
12.3 java.text 패키지
12.3.1 DecimalFormat 클래스
Decimal은 숫자라는 의미를 가지고 있어 DecimalFormat 클래스는 숫자 포맷을 지정할 수 있는 클래스이다.
12.3.2 SimpleDateFormat 클래스
앞에서 Date와 Calendar 클래스를 이용해서 날짜/시간을 구하거나, 계산하는 방법을 배웠는데, 년, 월, 일, 시간을 모두 따로 구해서 문자열 포맷에 맞춰 다시 출력하는 것은 너무 불편하다. 그래서 SimpleDateFormat이라는 클래스를 사용하면 아주 쉽게 처리할 수 있게 된다. SimpleDateFormat을 사용하는 방법은 아래와 같다.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); df.format(new Date()); |
기호 | 의미 | 기호 | 의미 |
G | 연대(BC,AD) | y | 년도 |
w | 해당 년의 몇째 주 | W | 해당 월의 몇째 주 |
d | 해당 월의 몇째 일 | D | 해당 년의 몇째 일 |
F | 해당 월의 몇째 요일 | E | 요일 |
a | AM/PM | M | 월 |
H | 시간(0~23) | h | 시간(1~12) |
K | 시간(0~11) | k | 시간(1~24) |
m | 분(0~59) | s | 초(0~59) |
Z | TimeZone(RFC) | z | TimeZone(General) |
'Full Stack > JAVA' 카테고리의 다른 글
[풀스택과정] JAVA 12장 연습문제 (1) | 2023.02.01 |
---|---|
[풀스택과정] JAVA 11장 연습문제 (1) | 2023.01.26 |
[풀스택과정] JAVA 11장 예외처리(에러를 미리 대비하자) (1) | 2023.01.25 |
[풀스택과정] JAVA 10장 연습문제 (1) | 2023.01.24 |
[풀스택과정] JAVA 10장 내부클래스(중첩클래스) (1) | 2023.01.24 |