10. 자바 기본 API 클래스
자바 API 도큐먼트
쉽게 API를 찾아 이용할 수 있도록 문서화한 것이다.
http://docs.oracle.com/javase/8/docs/api/
Java Platform SE 8
docs.oracle.com
객체 해시코드(hashCode())
객체 해시코드란 객체를 식별할 하나의 정수값을 말한다.
Object의 hashcode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴하기 때문에 객체마다 다른 값을 가지고 있다. 객체의 동등 비교를 위해서는 Object의 equals() 메소드만 재정의하지 말고 hashCode() 메소드도 재정의해서 논리적 동등 객체일 경우 동일한 해시코드가 리턴되도록 해야 한다.
객체 복제 (clone())
객체를 복제하는 이유는 원본 객체를 안전하게 보호하기 위해서이다.
- 얕은 복제(thin clone)
- 단순히 필드값을 복사해서 객체를 복제하는 것을 말한다.
- 필드가 기본 타입일 경우 값 복사가 일어나고, 필드가 참조 타입일 경우에는 객체의 번지가 복사된다.
- Object의 clone() 메소드는 자신과 동일한 필드값을 가진 얕은 복제된 객체를 리턴한다.
- 원본 객체는 반드시 java.lang.Cloneable 인터페이스를 구현하고 있어야한다. (복제를 허용한다는 의도적인 표시를 하기 위해서)
-
public class Member implements Cloneable { //Cloneable : 복제할 수 있다는 표시 public String id; public String name; //생성자 등... }
- 깊은 복제(deep clone)
- 깊은 복제란 참조하고 있는 객체도 복제하는 것을 말한다.
- Object의 clone() 메소드를 재정의해서 참조 객체를 복제하는 코드를 직접 작성해야 한다.
객체 비교(compare())
compare() 메소드의 리턴 타입은 int 인데,
a가 b보다 작으면 음수, 같으면 0, 크면 양수를 리턴하도록 구현 클래스를 만들어야 한다.
public interface Comparator<T> {
int compare(T a, T b);
}
Null 여부 조사(isNull(), nonNull(), requireNonNull())
- Objects.isNull(Obejct obj)는 매개값이 null 인 경우 true를 리턴한다.
- nonNull(Obejct obj) 는 매개값이 not null 인 경우 true를 리턴한다.
- requireNonNull(T obj, ...) 는 not null 인 경우 obj를 리턴한다.
System 클래스
java.lang에 속하는 System 클래스를 사용하면 운영체제의 일부 기능을 이용할 수 있다.
System 클래스의 모든 필드와 메소드는 정적(static) 필드와 정적(static) 메소드로 구성되어있다.
//프로그램 종료 exit()
System.exit(0); //JVM 정상종료
//가비지 컬렉터 실행
//JVM이 빠른 시간내에 실행시키기 위해 노력한다.
System.gc();
//현재시각 읽기
System.currentTimeMillis(); //밀리세컨드
System.nanoTime(); //나노세컨드
String 클래스의 메소드 몇가지
java.lang 패키지의 String 클래스의 인스턴스로 관리된다.
- 바이트 배열로 변환(getBytes())
- 네트워크로 문자열을 전송하거나, 문자열을 암호화할 때 문자열을 바이트 배열로 변환한다.
- 바이트 배열을 다시 문자열로 변환(디코딩)할 때에는 어떤 문자셋으로 인코딩된 바이트 배열이냐에 따라서 디코딩 방법이 다르다. 단순하게 Stirng(byte[] bytes) 생성자를 이용해서 디코딩하면 시스템의 기본 문자셋을 이용한다. 시스템 기본 문자셋과 다른 문자셋으로 인코딩된 바이트 배열일 경우 다음 String 생성자를 이용해서 디코딩해야한다.
-
//바이트 배열로 변환 try{ byte[] bytes = "문자열".getBytes("EUC-KR"); //알파벳: 1byte, 한글: 2byte byte[] bytes = "문자열".getBytes("UTF-8"); //알파벳: 1byte, 한글: 3byte } //클래스 내에서... //기본 문자셋으로 인코딩과 디코딩 byte[] bytes1 = str.getBytes(); System.out.println("bytes1.length: " + bytes1.length); String str1 = new String(bytes1); System.out.println("bytes1 -> String: " + str1); //시스템 기본 문자셋과 다른 문자셋으로 인코딩 된 바이트 배열인 경우 byte[] bytes1 = str.getBytes("EUC-KR"); //EUC-KR을 이용해 인코딩&디코딩 System.out.println("bytes1.length: " + bytes1.length); String str1 = new String(bytes1, "EUC-KR"); System.out.println("bytes1 -> String: " + str1); byte[] bytes1 = str.getBytes("UTF-8"); //UTF-8을 이용해 인코딩&디코딩 System.out.println("bytes1.length: " + bytes1.length); String str1 = new String(bytes1, "UTF-8"); System.out.println("bytes1 -> String: " + str1);
- 알파벳 소 · 대문자 변경(toLowerCase(), toUpperCase())
- toLowerCase() : 소문자로 변경
- toUpperCase() : 대문자로 변경
- equalsIgnoreCase() : 대소문자 무시 후 스펠링 같은지 비교, 같으면 true 반환
동적 객체 생성(newinstance())
Class 객체를 이용하면 new 연산자를 사용하지 않아도 동적으로 객체를 생성할 수 있다.
이 방법은 코드 작성 시에 클래스 이름을 결정할 수 없고, 런타임 시에 클래스 이름이 결정되는 경우에 매우 유용하게 사용된다. newInstance() 메소드는 기본 생성자를 호출해서 객체를 생성하기 때문에 반드시 클래스에 기본 생성자가 존재해야한다.
try{
Class clazz = Class.forName("런타임 시 결정되는 클래스 이름");
Object obj = clazz.newInstance();
}catch(Exception e){
}
StringBuffer, String Builder 클래스
문자열을 저장하는 String은 내부의 문자열을 수정할 수 없다.
문자열을 결합하는 + 연산자를 많이 사용하면 할수록 그만큼 String 객체의 수가 늘어나기 대문에, 프로그램 성능을 느리게 하는 요인이 된다.
문자열을 변경하는 작업이 많을 경우에는 StringBuffer 또는 StringBuilder 클래스를 사용하는 것이 좋다.
StringBuffer는 멀티 스레드 환경에서 사용할 수 있도록 동기화가 적용되어 있어 스레드에 안전하지만(Thread Safe),
StringBuilder는 단일 스레드 환경에서만 사용하도록 설계되어있다.
[자문자답 문제]
1. 객체 해시코드란?
답)
객체를 식별할 하나의 정수값을 말한다.
Object의 hashCode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴하기 때문에 객체마다 다른 값을 가지고 있다.
2. 객체의 동등 비교를 위해서는 어떻게 해야하는가?
답)
Object의 equals() 메소드만 재정의하지 말고 hashCode() 메소드도 재정의해서 논리적 동등 객체일 경우 동일한 해시코드가 리턴되도록 해야 한다.
3. 객체를 복제란? 또 객체를 복제하는 이유는?
답)
객체 복제 : 원본 객체의 필드값과 동일한 값을 가지는 새로운 객체를 생성하는 것이다.
객체를 복제하는 이유 : 원본 객체를 안전하게 보호하기 위해서이다.
4. 얕은 복제(thin clone)와 깊은 복제(deep clone)에 대해 설명하세요.
답)
얕은 복제(thin clone) : 단순히 필드값을 복사해서 객체를 복제하는 것. (기본타입은 값 복사가, 참조타입은 객체의 번지 복사가 일어난다.)
깊은 복제(deep clone) : 참조하고 있는 객체도 복제하는 것. (기본타입은 값 복사가, 참조타입도 복제가 된다.)
5. System 클래스란?
답)
System 클래스는 모든 필드와 메소드가 static으로 구성되어 있고, 운영체제의 일부 기능을 이용할 수 있다.
(프로그램 종료, 키보드의 입력, 모니터의 출력, 메모리 정리, 현재 시간 읽기 등)
6. String 문자열을 결합하는 + 연산자를 많이 사용할 경우 단점은?
답)
그만큼 String 객체의 수가 늘어나기 대문에, 프로그램 성능을 느리게 하는 요인이 된다.
문자열을 변경하는 작업이 많을 경우에는 StringBuffer 또는 StringBuilder 클래스를 사용하는 것이 좋다.
7. StringBuffer 와 StringBuilder란?
답)
StringBuffer는 멀티 스레드 환경에서 사용할 수 있도록 동기화가 적용되어 있어 스레드에 안전하지만(Thread Safe),
StringBuilder는 단일 스레드 환경에서만 사용하도록 설계되어있다.
해당 포스트는 이것이 자바다(신용권의 Java 프로그래밍 정복)을 읽은 후 기록한 내용입니다.
참고서적링크 : https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=50563128
이것이 자바다
15년 이상 자바 언어를 교육해온 자바 전문강사의 노하우를 아낌 없이 담아낸 자바 입문서. 저자 직강의 인터넷 강의와 Q/A를 위한 커뮤니티(네이커 카페)까지 무료로 제공하여 자바 개발자로 가
www.aladin.co.kr