본문 바로가기

Java/기초

[Java] java.lang패키지와 유용한 클래스1

1. java.lang패키지

1.1 Object클래스

모든 클래스의 최고 조상이기 떄문에 Object클래스의 멤버들은 모든 클래스에서 바로 사용 가능하다.

1) protected Object clone()

- 객체 자신의 복사본을 반환한다.

- Object클래스에 정의된 clone()은 단순히 인스턴스변수의 값만을 복사하기 때문에 참조변수 타입의 인스턴스 변수가 정의되어 있는 클래스는 완전한 인스턴스 복제가 이루어 지지 않는다.

ex. 배열의 경우, 복제된 인스턴스도 같은 배열의 주소를 갖기 때문에 복제된 인스턴스의 작업이 원래의 인스턴스에 영향을 미치게 된다. 이런 경우 clone메서드를 오버라이딩해서 새로운 배열의 내용을 복사하도록 해야한다.

2) public boolean equals(Obecjt obj)ㅇ

- 객체 자신과 객체 obj가 같은 객체인지 알려준다.(같으면 true)

[참고] 객체를 생성할 때, 메모리의 비어있는 공간을 찾아 생성하므로 서로 다른 두 개의 객체가 같은 주소를 갖는 일은 있을 수 없다. 두 개 이상의 참조변수가 같은 주소값을 갖는 것(한 객체를 참조하는 것)은 가능하다.

3) protected void finalize()

- 객체가 소멸할 떄 가비지 컬렉터에 의해 자동적으로 호출된다. 이 때 수행되어야하는 코드가 있을 때 오버라이딩한다.(거의 사용안함)

4) public Class getClass()

- 객체 자신의 클래스 정보를 담고 있는 Class인스턴스를 반환한다.

5) public int hashCode()

- 객체 자신의 해시코드를 반환한다.

- 이 메서드는 해싱(hashing)기법에 사용되는 '해시함수(hash function)'를 구현한 것이다. 해싱은 데이터관리기법 중의 하나인데 다량의 데이터를 저장하고 검색하는 데 유용하다.

- 해시함수는 찾고자하는 값을 입력하면, 그 값이 저장된 위치를 알려주는 해시코드(hashcode)를 반환한다.

- 일반적으로 해시코드가 같은 두 객체가 존재하는 것이 가능하지만, Object클래스에 정의된 hashCode메서드는 객체의 주소값을 이용해서 해시코드를 만들어 반환하기 때문에 서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없다.

[참고] 해싱기법을 사용하는 HashMap이나 HashSet과 같은 클래스에 저장할 객체라면 반드시 hashCode메서드를 오버라이딩해야 한다.

6) public Stirng toString()

- 객체 자신의 정보를 문자열로 반환한다.

7) public void notify()

- 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다.

8) public void notifyAll()

- 객체 자신이 사용하려고 기다리는 모든 쓰레드를 깨운다.

9) public void wait(), wait(long timeout), wait(long timeout, int nanos)

- 다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간(timeout, nanos)동안 기다리게 한다.(timeout은 천 분의 1초, nanos는 109분의 1초)

 

* 클래스 로더

실행 시에 필요한 클래스를 동적으로 메모리에 로드하는 역할을 한다. 먼저 기존에 생성된 클래스 객체가 메모리에 존재하는지 확인하고, 있으면 객체의 참조를 반환하고 없으면 클래스 패스(classpath)에 지정된 경로를 따라서 클래스 파일을 찾는다. 못 찾으면 ClassNotFoundException이 발생하고, 찾으면 해당 클래스 파일을 읽어서 Class객체로 반환한다.

 

* Reflection

자바의 Reflection은 JVM에서 실행되는 애플리케이션의 런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 프로그램에서 사용된다.(클래스의 구조를 개발자가 환인할 수 있고, 값을 가져오거나 메소드를 호출하는데 사용된다.)

이미 로딩이 완료된 클래스에서 또 다른 클래스를 동적으로 로딩(Dynamic Loading)하여 생성자(Constructor), 멤버 필드(Member Variables)그리고 멤버 메서드(Member Method0등을 사용할 수 있도록 한다. 즉 컴파일 시간(Compile Time)이 아니라 실행 시간(Run Time)에 동적으로 특정 클래스의 정보를 객체화를 통해 분석 및 추출해낼 수 있는 프로그래밍 기법이다.

Reflection을 사용하는 기술은, Spring Framework, ORM기술인 하이버네이트, jackson라이브러리 등에 사용된다.

Reflection을 사용해서 스프링에서는 런타임 시에 개발자가 등록한 빈을 애플리케이션에서 가져와 사용할 수 있게 되는 것이다.

 

1.2 String 클래스

- 변경 불가능한(immutable) 클래스

[참고] Stirng 클래스는 앞에 final이 붙어 있으므로 다른 클래스의 조상이 될 수 없다.

한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, 변경할 수는 없다.

예를 들어 아래의 코드와 같이 '+'연산자를 이용해서 문자열을 결합하는 경우 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열("ab")이 담긴 String인스턴스가 생성되는 것이다.

이처럼 덧셈 연산자'+'를 사용해서 문자열을 결합하는 것은 매 연산 시 마다 새로운 문자열을 가진 String인스턴스가 생성되어 메모리공간을 차지하게 되므로 가능한 한 결합횟수를 줄이는 것이 좋다.

문자열 간의 결합이나 추출 등 문자열을 다루는 작업이 많아 필요한 경우에는 String클래스 대신 StringBuffer클래스를 사용하는 것이 좋다. StringBuffer인스턴스에 저장된 문자열을 변경이 가능하므로 하나의 StringBuffer인스턴스만으로도 문자열을 다루는 것이 가능하다.

- 문자열의 비교

문자열을 만들 때는 두 가지 방법, 문자열 리터럴을 지정하는 방법과 Stirng클래스의 생성자를 사용해서 만드는 방법이 있다.

String클래스의 생성자를  이용한 경우에는 new연산자에 의해서 메모리할당이 이루어지기 때문에 항상 새로운 String인스턴스가 생성된다. 그러나 문자열 리터럴은 이미 존재하는 것을 재사용하는 것이다.

[참고] 문자열 리터럴은 클래스가 메모리에 로드될 때 자동적으로 미리 생성된다.

- 빈 문자열(empty string)

'Strng s = "";'과 같은 문장이 있을 때, 참조변수 s가 참조하고 있는 String인스턴스는 내부에 'new char[0]'과 같이 길이가 0인 char형 배열을 저장하고 있는 것이다.

[참고] C언어에는 길이가 0인 배열을 선언할 수 없다.

- String 클래스의 생성자와 메서드

1) String(Stirng s)

- 주어진 문자열(s)를 갖는 String인스턴스를 생성한다.

2) String(char[] value)

- 주어진 문자열(value)을 갖는 String인스턴스를 생성한다.

3) String(StringBuffer buf)

- StringBuffer인스턴스가 갖고 있는 문자열과 같은 내용의 String인스턴스를 생성한다.

4) char charAt(int index)

- 지정된 위치Iindex)에 있는 문자를 알려준다.(index는 0부터 시작)

5) int compareTo(String str)

- 문자열(str)과 사전순서로 비교한다. 같으면 0을, 사전순으로 이전이면 음수를, 이후면 양수를 반환한다.

6) String concat(String str)

- 문자열(str)을 뒤에 덧붙인다.

7) bollean contains(CharSequence s)

- 지정된 문자열(s)이 포함되었는지 검사한다.

8) boolean endsWith(String suffix)

- 지정된 문자열(suffix)로 끝나는지 검사한다.

9) boolean equals(Object obj)

- 매개변수로 받은 문자열(obj)과 String인스턴스의 문자열을 비교한다. obj가 String이 아니거나 문자열이 다르면 false를 반환한다.

10) boolean equalsIgnoreCase(String str)

- 문자열과 String인스턴스의 문자열을 대소문자 구분없이 비교한다.

11) int indexOf(int ch)

- 주어진 문자(ch)가 문자열에 존재하는지 확인하여 위치(index)를 알려준다. 못 찾으면 -1을 반환한다.(index는 0부터 시작)

12) int indexOf(int ch, int pos)

- 주어진 문자(ch)가 문자열에 존재하는지 지정된 위치(pos)부터 확인하여 위치(index)를 알려준다. 못 찾으면 -1을 반환한다.(index는 0부터 시작)

13) int indexOf(String str)

- 주어진 문자열이 존재하는지 확인하여 그 위치(index)를 알려준다. 없으면 -1을 반환한다.(index는 0부터 시작)

14) String intern()

- 문자열을 상수풀(constant pool)에 등록한다. 이미 상수풀에 같은 내용의 문자열이 있을 경우 그 문자열의 주소값을 반환한다.

15) int lastIndexOf(int ch)

- 지정된 문자 또는 문자코드를 문자열의 오른쪽 끝에서부터 찾아서 위치(index)를 알려준다. 못 찾으면 -1을 반환한다.

16) int lastIndexOf(String str)

- 지정된 문자열을 인스턴스의 문자열 끝에서 찾아서 위치(index)를 알려준다. 못 찾으면 -1을 반환한다.

17) int length()

- 문자열의 길이를 반환한다.

18) String replace(char old, char nw)

- 문자열 중의 문자열(old)을 새로운 문자열(nw)로 모두 바꾼 문자열을 반환한다.

19) String replaceAll(String regex, String replacement)

- 문자열 중에서 지정된 문자열(regex)과 일치하는 것을 새로운 문자열(replacement)로 모두 변경한다.

20) String replaceFirst(String regex, String replacement)

- 문자열 중에서 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환한다.

21) String[] split(String regex)

- 문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환한다.

22) String[] split(String regex, int limit)

- 문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환한다. 단 문자열 전체를 지정된 수(limit)로 자른다.

23) boolean startsWith(String prefix)

- 주어진 문자열(prefix)로 시작하는지 검사한다.

24) String substring(int begin), String substing(int begin, int end)

- 주어진 시작위치(begin)부터 끝 위치(end)범위에 포함된 문자열을 얻는다. 이 때, 시작위치의 문자는 범위에 포함되지만, 끝 위치의 문자는 포함되지 않는다.(begin <= x < end)

25) String toLowerCase()

- String인스턴스에 저장되어있는 모든 문자열을 소문자로 변환하여 반환한다.

26) String toString()

- String인스턴스에 저장되어 있는 문장열을 반환한다.

27) String toUpperCase()

- String인스턴스에 저장되어 있는 모든 문자열을 대문자로 변환하여 반환한다.

28) String trim()

- 문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환한다. 이 때 문자열 중간에 있는 공백은 제거되지 않는다.

29) static String valueOf(boolean b) 

* char c,int i, long l, float f, double d, object o 파라미터 모두 가능

- 지정된 값을 문자열로 변환하여 반환한다. 참조변수의 경우, toString()을 호출한 결과를 반환한다.

- join()과 StringJoiner

join()은 여러 문자열 사이에 구분자를 넣어서 결합한다. 구분자로 문자열을 자르는 split()과 반대의 작업이다.

 

- 유니코드의 보충문자

String클래스의 메서드 중에 매개변수의 타입이 char인 것들이 있고, int인 것들도 있다. 문자를 다루는 메서드라서 매개변수의 타입이 char일 것 같은데 int인 이유는 확장된 유니코드를 다루기 위해서이다.

- 문자 인코딩 변환

getBytes(String charsetName)를 사용하면 문자열의 문자 인코딩을 다른 인코딩으로 변경할 수 있다.