9 minute read

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’인 클래스의 객체를 반환
    • 클래스 파일이 클래스 로더에 의해 메모리에 올라갈 때, 자동으로 생성
  • 클래스 로더
    • 클래스 파일을 메모리에 로드하고 변환
      1. 기존에 생성된 클래스 객체가 메모리에 존재하는지 확인
        1. 클래스 객체가 존재하면 객체의 참조를 반환
      2. 클래스 객체가 없으면 클래스 패스에 지정된 경로를 따라서 클래스 파일 찾기 시도 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