9.1~9.2 (java.lang, 유용한 클래스)
1. java.lang패키지
- 자바 프로그래밍에 기본이 되는 클래스 포함
- import 없이도 사용 가능
Object 클래스
- 모든 클래스들의 최고 조상
- Object클래스의 멤버들은 모든 클래스에서 사용가능
- boolean equals(Object obj)
- obj: 객체의 참조변수
- this==obj 결과 반환(두 객체가 같은 객체인지 판단)
- 오버라이딩을 통해서 주소가 아닌 참조변수가 가리키는 객체의 내용을 기준으로 변경가능(Ex) String 클래스)
- int hashCode()
- 객체의 주소값을 해시코드로 반환
- 32bit JVM에서는 주소가 다를 때 해시코드 중복 불가
- 64bit JVM에서는 주소가 다를 때 해시코드 중복 가능
- 해싱기법을 사용하는 클래스(HashMap, HashSet, …)에 저장할 객체는 반드시 오버라이딩 필요
- String toString()
- 객체를 문자열로 반환
- 기본적으로 Object이름과 주소값을 해시코드로 변환한 값을 반환
- Object Clone()
- 인스턴스 멤버필드의 값을 복사해서 새로운 객체 반환(얕은 복사; 참조변수의 경우 주소값복사)
- Cloneable 인터페이스를 구현한 클래스에서만 호출가능
- 공변 반환 타입(covariant return type)
- 오버라이딩할 때 조상 메서드의 반환타입을 자손 메서드의 반환타입으로 변경을 허용
- JDK1.5부터 지원
class MyClass implements Clonealbe {
public MyClass clone() { // 접근 제어자 public 변환, 공변 반환타입 적용
Object obj = null;
try {
obj = super.clone(); // clone은 반드시 예외처리 필요
} catch(CloneNotSupportedException e)
return (MyClass)obj; // 공변 반환타입 적용으로 clone() 호출 시 형변환 필요없음
}
}
// MyClass copy = (Myclass)original.clone() - 공변 반환타입 미적용
// MyClass copy = original.clone() - 공변 반환타입 적용
- 깊은 복사
- 원본이 참조하는 객체까지 복사함
- 복사본의 참조 변수가 원본이 참조하는 객체의 복사 된 객체를 가리킴
- Class getClass()
- 자신이 속한 클래스의 이름이 ‘Class’인 클래스의 객체를 반환
- 클래스 파일이 클래스 로더에 의해 메모리에 올라갈 때, 자동으로 생성
- 클래스 로더
- 클래스 파일을 메모리에 로드하고 변환
- 기존에 생성된 클래스 객체가 메모리에 존재하는지 확인
-
- 클래스 객체가 존재하면 객체의 참조를 반환
- 클래스 객체가 없으면 클래스 패스에 지정된 경로를 따라서 클래스 파일 찾기 시도
2.1. 클래스파일을 찾으면 파일을 읽고 Class 객체로 변환
2.2. 클래스파일을 못 찾으면 ClassNotFOundException 발생
- Class객체를 얻는 방법
- Class c = new MyClass.getClass(); // 생성된 객체로부터 얻기
- Class c = card.class; // 클래스 리터럴(*.class)로부터 얻기
- Class c = Class.forName(”MyClass”) // 클래스 이름으로부터 얻기
- Class객체로 클래스의 모든 정보를 얻거나 Class객체로 인스턴스 생성 가능
- String 클래스
- 변경 불가능한(immutable) 클래스
- final 클래스로 다른 클래스의 조상일 수 없음
- 멤버필드 char[] value에 문자열 저장
- 초기화된 String 클래스에 문자열을 대입하면 새로운 String 객체를 생성 후 문자열 저장
- 문자열 간 연산이 많이 필요한 경우에는 변경가능한 StringBuffer 사용
- 빈 문자열은 길이가0인 char 배열을 내부적으로 가지고 있음
- null character을 사용하지않고 문자열의 길이 정보를 따로 저
- 문자열 리터럴
- 자바 소스파일에 포함된 문자열 리터럴은 컴파일 시 해당 소스파일의 클래스 파일에 저장
- String의 인스턴스로 저장, 같은 내용의 문자열 리터럴은 같은 인스턴스
- “abc” == “abc” (true)
- new String(”abc”) == new String(”abc”) (false)
- String 클래스의 메서드
- String(StringBuffer buf): buf의 문자열로 스트링 인스턴스 생성
- char charAt(int index): 인덱스의 문자 반환
- int compareTo(String str): str과 사전순서로 비교 같으면 0, 이전이면-1, 이후면 1, 반환
- String concat(String str): 이후에 str 덧붙임
- boolean contains(CharSequence s): s가 포함되어있는지 확인
- boolean endsWith(String suffix): suffix로 끝나는지 확인
- boolean equals(Object obj): obj와 자신의 문자열 비교, 같으면 true obj가 String이 아니거나 문자열이 다르면 false 반환
- boolean equalsIgnoreCase(String str): 대소문자 구분 없이 str과 비교
- int indexOf(int ch): 주어진 문자 ch가 문자열에 존재하면 인덱스 반환, 없으면 -1
- int indexOf(int ch, int pos): 주어진 문자 ch가 문자열에 존재하는지 pos부터 확인, 없으면 -1
- int indexOf(String str): str이 문자열에 존재하면 인덱스 반환, 없으면 -1
- int lastIndexOf (int ch): 마지막부터 주어진 문자 ch를 찾아서 인덱스 반환, 없으면 -1
- int lastIndexOf(String str):마지막부터 str을 문자열 찾아서 인덱스 반환, 없으면 -1
- int length(): 문자열의 길이 반환
- String intern(): 문자열을 constant pool에 등록, 이미 등록되어있으면 주소값 반환
- String replace(char old, char nw): 문자열의 old를 nw로 교체
- String replace(CharSequence old, CharSequence nw): 문자열의 old를 nw로 교체
- String replaceAll(String regex, String replacement): 문자열의 regex를 replacement로 교체
- String replaceFirst(String regex, String replacement): 문자열의 첫번째 regex를 replacement로 교체
- String[] split(String regex): 문자열을 regex를 기준으로 나누어 배열로 반환
- String[] split(String regex, int limit): 문자열을 limit까지만 나누어 반환
- boolean startWith(String prefix): 문자열이 prefix로 시작하는지 확인
- String substring(int begin)(int begin, int end): begin부터 end까지 반환 단, end문자는 포함되지않음
- String toLowerCase(): 문자열을 모두 소문자로 변환
- String toUpperCase(): 문자열을 모두 대문자로 변환
- String toString(): 인스턴스의 문자열을 반환
- String trim(): 문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 제거
- static String valueOf(Object or Premitive Type value): value를 문자열로 반환, 참조변수의경우 toString() 반환
- join(String 구분자, String[])
- 배열의 요소 사이에 구분자를 넣어서 결합
- java.util.StringJoiner클래스도 문자열 결합 수행
- 유니코드의 보충 문자
- 유니코드는 16비트 문자 체계 → 20비트 문자 체계로 확장됨
- 기존 char 타입으로 다루지 못하고 int 필요
- 확장된 문자들을 보충 문자라고 함
- String 메서드의 매개변수가 int ch인 것은 보충문자를 지원
- String을 Premitive Type으로 변환
- ~
.parse~() 사용
- ~~~.valueOf 사용
- StringBuffer
- 지정된 문자열 변경 가능
- 문자열 편집을 위한 버퍼가 있으며 생성될 때 크기가 설정됨, 기본값 16
- 생성자 매개변수로 문자열을 전달 할 수 있으며 이떄 버퍼크기는 문자열 길이 + 16
- 편집 중인 문자열이 버퍼보다 커지면 버퍼를 늘리는 작업이 필요함
- instance.append(String str)로 문자열을 추가 할 수 있으며 자신의 주소 반환
- equals 메서드가 오버라이딩 되어있지않아 toString()으로 문자열 변환 후 내용을 비교해야됨
- 동기화가 성능을 떨어뜨림 → StringBuilder 사용
- Wrapper 클래스
- Primitive type을 객체로 다뤄야할 때 사용
- 멤버필드로 대응되는 Primitive type변수를 가짐
- boolean: Boolean
- char: Character
- byte: Byte
- short: Short
- int: Integer
- long: Long
- float: Float
- double: Double
- Primitive → Wrapper 박싱
- 기본형과 참조형간 연산에서 컴파일러가 참조형을 자동으로 기본형으로 바꾸는데 이를 Autoboxing이라 함
- Wrapper → Primitive 언박싱
2. 유용한 클래스
- java.util.Objects
- 모든 메서드가 static
- boolean isNull(Object obj): obj가 null이면 true 아니면 false
- boolean nonNull(Object obj): !Objects.isNull(obj)
-
T requireNonNull(T Obj)
T requireNonNull(T Obj, String message)
T requireNonNull(T Obj, Suppler messageSpplier): 해당 객체가 null이면 throw
- int compare(Object a, Object b, Comparator c): 객체 a, b를 c 기준으로 비교
- boolean equals(Object a, Object b): 두 객체가 같은지 비교, null검사 필요없음
- boolean deepEquals(Object a, Object b): 두 객체의 내용을 비교, 재귀적으로 비교하기때문에 다차원 배열도 비교가능
- java.math.BigInteger
- long보다 훨씬 큰 값을 다룰 수 있음
- 표현범위는 +-2 X Integer.MAX_VALUE^2 (10의 6억 제곱)
- 성능은 떨어짐
- immutable
- java.math.BigDecimal
- 정수를 이용해서 실수를 표현
- 정수를 저장하는데 BigInteger 사용
- immutable
- 실수를 정수와 10의 제곱으로 표현
- 멤버필드
- private final BigInteger intVal;
- private final int scale;
- private transient int precision;
- 123.45 = 12345X10^-2
- intVal: 12345
- scale: 2
- precisiion: 5
Leave a comment