티스토리 뷰

반응형

[Java의 정석 - http://www.yes24.com/Product/Goods/24259565]

 

1. java.lang 패키지

  • java.lang 패키지는 자바프로그래밍에 가장 기본이 되는 클래스들을 포함하고 있다
  • java.lang 패키지의 클래스들은 import 없이 사용할 수 있다

1.1 Object 클래스

  • 모든 클래스의 최고 조상
  • 멤버변수는 없음
  • Object 클래스의 메서드
    • 모든 클래스에서 바로 사용 가능
    • 모든 인스턴스가 가져야할 기본적인 것들
    • protected Object clone() : 객체 자신의 복사본을 반환
      • 자신을 복제하여 새로운 인스턴스를 생성하는 일을 한다
      • 단순히 인스턴스변수의 값만을 복사하기 때문에 참조 타입의 인스턴스 변수가 있는 클래스는 완전한 인스턴스 복제가 이루어지지 않는다
      • clone()을 사용하려면 복제할 클래스가 Cloneable 인터페이스를 구현해야하고 clone()을 오버라이딩하면서 접근 제어자를 protected에서 public으로 변경한다
        • Cloneable을 구현해야하는 이유는 인스턴스의 데이터를 보호하기 위해서
        • Cloneable가 구현되었다는 것은 클래스의 작성자가 복제를 허용한다는 의미
    • public boolean equals(Object obj) : 객체 자신과 객체 obj가 같은 객체인지 알려준다(같으면 true)
      • 매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean 값으로 알려 주는 역할을 한다
      • 두 객체의 같고 다름을 참조변수의 값으로 판단
      • 값 비교를 위해서 주로 오버라이딩해서 사용
    • protected void finalize() : 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출
    • public Class getClass() : 객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환
      • 자신이 속한 클래스의 Class 객체를 반환하는 메서드
      • Class 객체 : 이름이 'Class'인 클래스의 객체
        • 클래스의 모든 정보를 담고 있음
        • 클래스 당 1개만 존재
        • 클래스 파일이 클래스 로더(ClassLoader)에 의해서 메모리에 올라갈 때 자동으로 생성
        • 클래스 로더 : 실행 시에 필요한 클래스를 동적으로 메모리에 로드하는 역할
        • 클래스 파일을 읽어서 사용하기 편한 형태로 저장해 놓은 것이 클래스 객체
        • Class 객체를 얻는 방법
          • Card().getClass() : 생성된 객체로부터 얻는 방법
          • Card.class : 클래스 리터럴(*.class)로부터 얻는 방법
          • Class.forName("Card") : 클래스 이름으로부터 얻는 방법
        • Class 객체를 통해서 객체를 생성하고 메서드를 호출하는 등 동적인 코드를 작성할 수 있다
          • ex) Card.class.newInstance() : Class 객체를 이용해서 객체 생성
    • public int hashCode() : 객체 자신의 해시코드를 반환
      • 해싱(hasing) 기법에 사용되는 해시함수(hash function)를 구현한 것
      • 해시함수는 찾고자하는 값을 입력하면 그 값이 저장된 위치를 알려주는 해시코드(hash code)를 알려준다
      • 서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없다
      • 값으로 비교를 위해서는 hasCode()를 오버라이딩해서 사용해야 한다
    • public String toString() : 객체 자신의 정보를 문자열로 반환
      • 인스턴스에 대한 정보를 문자열(String)로 제공할 목적으로 정의한 것
      • 클래스 이름 + 16진수의 해시 코드 리턴
      • 보통 인스턴스 변수에 저장된 값들을 문자열로 표현하기 위해 오버라이딩해서 사용
    • public void notify() : 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨움
    • public void notifyAll() : 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨움
    • public void wait(), public void wait(long timeout), public void wait(long timeout, int nanos)
      : 다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간(timeout, nanos)동안 기다리게 한다(timeout은 천 분의 1초, nanos는 10^9의 1초)
  • 공변 변환타입(convariant return type)
    • 오버라이딩할 때 조상 메서드의 반환타입을 자손 클래스의 타입으로 변경을 허용하는 것
  • 얕은 복사와 깊은 복사
    • 얕은 복사(shallow copy)
      • 단순히 객체에 저장된 값을 그대로 복제
      • 원본을 변경하면 복사본도 영향을 받는다
    • 깊은 복사(deep copy)
      • 원본이 참조하고 있는 객체까지 복제
      • 원본의 변경이 복사본에 영향을 미치지 않는다

1.2 String 클래스

  • String 클래스 : 문자열을 위한 클래스
    • 문자열을 저장하고 이를 다루는데 필요한 메서드 함께 제공
    • 변경 불가능한(immutable) 클래스
      • String 클래스는 문자열을 저장하기 위해서 문자형 배열 참조변수(char[]) value를 인스턴스 변수로 정의해놓고 있다
      • 한번 생성된 String 인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고 변경할 수는 없다
    • 생성 방법
      • 문자열 리터럴 지정하기
      • String 클래스의 생성자를 이용해서 만들기
    • 문자열 리터럴
      • 자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다
      • 같은 내용의 문자열 리터럴은 한번만 저장된다
      • 리터럴들은 상수 저장소(constant pool)에 저장된다
    • 빈 문자열(empty string)
      • 길이가 0인 문자열("")
      • String은 빈 문자열로 초기화하는게 보통
    • String 클래스의 생성자와 메서드
      • String(String s/char[] value/StringBuffer buf)
        • 주어진 문자열를 갖는 인스턴스 생성
      • char charAt(int index)
        • 지정된 위치에 있는 문자열을 알려줌
      • int compareTo(String str)
        • 문자열(str)과 사전순서로 비교함
        • 같으면 0, 사전순으로 이전이면 음수, 이후면 양수
      • Stirng concat(String str)
        • 문자열을 뒤에 덧붙임
      • boolean contains(CharSequence s)
        • 지정된 문자열(s)이 포함되었는지 검사
      • boolean endsWith(String suffix)
        • 지정된 문자열(suffix)로 끝나는지 검사
      • boolean equals(Object obj)
        • 매개변수로 받은 문자열(obj)과 String 인스턴스의 문자열 비교
        • obj가 String이 아니거나 문자열이 다르면 false를 반환
      • boolean equalsIgnoreCase(String str)
        • 문자열과 String 인스턴스의 문자열을 대소문자 구분없이 비교
      • int indexOf(int ch)
        • 주어진 문자(ch)가 문자열에 존재하는지 확인하여 위치를 알려준다
        • 못 찾으면 -1을 반환
      • int indexOf(int ch, int pos)
        • 주어진 문자가 문자열에 존재하는지 지정된 위치부터 확인하여 위치를 알려준다
        • 못찾으면 -1을 반환
      • int indexOf(String str)
        • 주어진 문자열이 존재하는지 확인하여 그 위치를 알려줌
        • 없으면 -1을 반환
      • String intern()
        • 만자열을 상수풀(constant pool)에 등록한다
        • 이미 상수풀에 같은 내용의 문자열이 있을 경우 그 문자열의 주소값을 반환한다
      • int lastIndexOf(int ch/String str)
        • 지정된 문자 또는 문자코드/문자열를 문자열의 오른쪽 끝에서부터 찾아서 위치를 알려준다
        • 못 찾으면 -1 반환
      • int length()
        • 문자열의 길이를 알려준다
      • String replace(char old, char 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)
        • 문자열을 지정된 분리자(regex)로 나누어 문자열배열에 담아 반환한다
        • 단 문자열 전체를 지정된 수(limit)로 자른다
      • boolean startsWith(String prefix)
        • 주어진 문자열로 시작하는지 검사한다
      • String substring(int begin[,int end])
        • 주어진 시작위치부터 끝 위치 범위에 포함된 문자열을 얻는다
        • 시작위치의 문자는 범위에 포함되지만 끝 위치의 문자는 포함되지 않는다
      • String toLowerCase()
        • String 인스턴스에 저장되어있는 모든 문자열을 소문자로 변환하여 반환한다
      • String toString()
        • 문자열 반환
      • String toUpperCase()
        • String 인스턴스에 저장되어있는 모든 문자열을 대문자로 변환하여 반환한다
      • String trim()
        • 문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환한다
        • 문자열 중간에 있는 공백은 제거되지 않는다
      • static String valueOf(boolean b/char c/int i/long l/float f/double d/Object o)
        • 지정된 값을 문자열로 변환하여 반환한다
        • 참조변수의 경우 toString()을 호출한 결과를 반환한다
    • join()과 StringJoiner
      • join() : 여러 문자열 사이에 구분자를 넣어서 결합
      • split() : 구분자로 문자열을 자름
    • 보충 문자(supplementary characters)
      • char에서 int형으로 확장되면서 새로 추가된 문자들 
      • 위에 정리한 메서드 중 매개변수가 int ch인 것들은 보충 문자를 지원하는 것
      • char ch는 보충 문자를 지원하지 않는 것
    • 문자 인코딩 변환
      • getBytes(String charsetName) : 문자열의 문자 인코딩을 다른 인코딩으로 변환할 수 있음
    • String.format()
      • 형식화된 문자열을 만들어내는 방법
    • 기본형 값을 String으로 변환
      • 숫자를 문자열로 변환
        • 숫자 + 빈문자열("")
        • valueOf() 사용
    • String을 기본형 값으로 변환
      • valueOf() 사용
      • parseInt() 사용
        • 문자열에 공백 또는 문자가 포함되어 있는 경우 변환 시 예외(NumberFormatException)이 발생할 수 있음
        • trim()을 함께 사용해주면 좋음
        • 부호를 의미하는 '+'나 소수점을 의미하는 '.'와 float 형 값을 뜻하는 f와 같은 자료형 접미사는 자료형에 알맞는 변환을 하는 경우 허용

1.5 래퍼(wrapper) 클래스

  • 자바에서는 8개의 기본형을 객체로 다루지 않음
  • 래퍼(wrapper) 클래스
    • 기본형(primitive type) 변수도 객체로 다룰 수 있게 해줌
    • 생성자는 매개변수로 문자열이나 각 자료형의 값들을 인자로 받음
      • 각 자료형에 알맞는 문자열을 사용해야 됨
    • 객체 생성 시에 생성자의 인자로 주어진 각 자료형에 알맞은 값을 내부적으로 저장하고 있음
    • 래퍼 클래스의 생성자
      • boolean -> Boolean
        • Boolean (boolean value)
        • Boolean (String s)
      • char -> Character
        • Character (char value)
      • byte -> Byte
        • Byte (byte value)
        • Byte (String s)
      • short -> Short
        • Short (short value)
        • Short (String s)
      • int -> Integer
        • Integer (int value)
        • Integer (String s)
      • long -> Long
        • Long (long value)
        • Long (String s)
      • float -> Float
        • Float (double value)
        • Float (float value)
        • Float (String s)
      • double -> Double
        • Double (double value)
        • Double (String s)
    • 메서드
      • 래퍼 클래스는 모두 equals()가 오버라이딩되어 있어 주소값이 아닌 객체가 가지고 있는 값을 비교함
      • 비교 연산자는 사용할 수 없고 그대신 compareTo() 제공
      • toString()도 오버라이딩되어 있음
      • MAX_VALUE, MIN_VALUE, SIZE, BYTES, TYPE 등의 static 상수를 공통적으로 가지고 있음
    • Number 클래스
      • 추상 클래스
      • 내부적으로 숫자를 멤버변수로 갖는 래퍼 클래스들의 조상
    • 문자열을 숫자로 변환하기 : valueOf()가 조금 더 느림
      • 문자열 -> 기본형 : 타입.parse타입(String s[,int radix])
        • Byte.parseByte()
        • Shotr.parseShort()
        • Integer.parseInt()
        • Long.parseLong()
        • Float.parseFloat()
        • Double.parseDouble()
      • 문자열 -> 래퍼 클래스 : 타입.valueOf(String s)
        • Byte.valueOf()
        • Short.valueOf()
        • Integer.valueOf()
        • Long.valueOf()
        • Float.valueOf()
        • Double.valueOf()
  • 오토박싱 & 언박싱
    • 오토박싱(autoboxing) : 기본형 값을 래퍼 클래스의 객체로 자동 변환해주는 것
    • 언박싱(unboxing) : 래퍼 클래스의 객체를 기본형 값으로 변환해주는 것

2. 유용한 클래스

2.1 java.util.Objects 클래스

  • Objects 클래스
    • Object 클래스의 보조 클래스
    • 모든 메서드가 static
    • 객체의 비교나 널 체크(null check)에 유용
    • 메서드
      • isNull(Object obj) : 해당 객체가 널인지 확인해서 Null이면 true를 반환하고 아니면 false를 반환
      • nonNull(Object obj) : isNull()과 정반대, !Objects.isNull()과 같음
      • requireNonNull(T obj[, String message | Supplier<String> s]) : 해당 객체가 널이 아니어야 하는 경우에 사용
        • 객체가 널이면 NullPointerException을 발생시킴
        • 두 번째 매개변수로 지정하는 문자열은 예외 메세지가 됨
      • compare(Object a, Object b, Comparator c) : 두 비교대상이 같으면 0, 크면 양수, 작으면 음수 반환
      • equals(Object a, Object b) : 내부에서 널 검사를 해줌
      • deepEquals(Object a, Object b) : 객체를 재귀적으로 비교해서 다차원 배열의 비교도 가능
      • toString(Object obj[, String nullDefault]) : 내부적으로 널 검사를 해줌, 두번째 매개변수는 널일 경우 사용할 값
      • hashCode(Object obj) : 내부적으로 널 감사를 해줌
      • hash(Object... values) : 매개변수 가변

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함