[JAVA] 이것이 자바다 - 기본 API 클래스(1)

17170 단어 JavaJava

자바 API 도큐먼트

  • API는 프로그램 개발에 자주 사용되는 클래스 및 인터페이스의 모음을 말한다. ex) String 클래스, System 클래스
  • API 도큐먼트는 쉽게 API를 찾아 이용할 수 있도록 문서화한 것을 말한다.
  • 💡 API Document

java.lang과 java.util 패키지

java.lang 패키지

  • java.lang 패키지는 자바 프로그램의 기본적인 클래스를 담고 있는 패키지이다.
  • java.lang 패키지에 있는 클래스와 인터페이스는 import없이 사용할 수 있다.
  • 주요 클래스

Object 클래스

  • 클래스를 선언할 때 다른 클래스를 상속받지 않으면 자동으로 Object 클래스를 상속받게 된다.
  • Object는 자바의 최상위 부모 클래스이며 모든 클래스는 Object 클래스의 자식,자손 클래스이다.

객체 비교(equals())

  • equals() 메소드는 비교연산자인 ==과 동일한 결과를 리턴한다.
  • String 객체의 equals() 메소드는 기존 메소드를 재정의해서 String 객체의 번지를 비교하는 것이 아니라 문자열이 동일한지를 비교한다.

객체 해시코드(hashCode())

  • 객체 해시코드란 객체를 식별할 하나의 정수값을 말한다.
  • Object의 hashCod()는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴하기 때문에 객체마다 다른 값을 가지고 있다.
  • 논리적 동등비교 시 hashCode() 오버라이딩의 필요성
    • 컬렉션 프레임워크의 HashSet, HashMap, Hashtable과 같은 클래스는 두 객체가 동등한 객체인지 판단할 때 아래의 과정을 거친다.
public class Key{
	public int number;
    
    public Key(int number){
    	this.number = number;
    }
    
    @Override
    public boolean equals(Object obj){
    	if(obj instanceof Key){
        	Key compareKey = (key)obj;
            if(this.number == compareKey.number){
            	return true;
            }
        }
        return false;
    }
}

 public class KeyExample{
	public static void main(String[] args){
	    // Key 객체를 식별키로 사용해서 
      	    // String 값을 저장하는 HashMap 객체 생성
    	    HashMap<key,String> hashMap=new HashMap<key, String>();
            
            // 식별키 "new Key(1)"로 "홍길동" 저장
            // new로 Key 생성자에 매개값을 1로 주고 새로운 객체를 생성함
            hashMap(new Key(1), "홍길동");
            
            // 식별키 "new Key(1)"로 "홍길동" 읽기
            String value = hashMap.get(new Key(1));
            System.out.println(value);
            
            // hsashCode()가 같지 않기 때문에 결과는 null
	}
}

// hashCode()를 재정의해서 같은 해시코드값 리턴하기
public class Key{
	...
    
    @Override
    public int hashCode(){
    	return number;
    }
}

객체 문자 정보(toString())

  • Object 클래스의 toString()은 객체를 문자열로 표현한 값을 리턴한다.
  • 기본적으로 Object 클래스의 toString()은 "클래스명@16진수해시코드"로 구성된 문자 정보를 리턴한다.
  • System.out.println(클래스)를 리턴하면 자동으로 클래스.toString()을 호출해 리턴값을 얻은 후 출력한다.

객체 복제(clone())

  • 객체 복제는 원본 객체의 필드값과 동일한 값을 가지는 새로운 객체를 생성한다.
  • 객체를 복제하는 이유는 원본 객체를 안전하게 보호하기 위해서이다.
  • Object의 clone()은 자신과 동일한 필드값을 가진 얕은 복제된 객체를 리턴한다.
  • clone()으로 객체를 복제하려면 원본 객체는 반드시 Cloneable 인터페이스를 구현해야 한다.
  • 얕은 복제(thin clone)
    • 단순히 필드값을 복사해서 객체를 복제하는 것
    • 기본 타입일 경우 값 복사, 참조 타입일 경우 객체의 번지 복사
  • 깊은 복제(deep clone)
    • 깊은 복제란 참조하고 있는 객체도 복제하는 것을 말한다.
    • 깊은 복제를 하려면 Object의 clone()을 재정의해서 참조 객체를 복제하는 코드를 직접 작성해야 한다.
public class Member implements Cloneable{
	public String name;
    public int age;
    public int[] scores;
    public Car car;
    
    public Member(String name, int age, int[] scores, Car car){
    	this.name = name;
        this.age = age;
        this.scores = scores
        this.car = car;
    }
    
    @Override
    protected Object clone() throws CloneNotSupportedException{
    	// 얕은 복사를 해서 name, age 복사
        Member cloned = (Member)super.clone();
        // scores 깊은 복제
        cloned.scores = Arrays.copyOf(this.scores
        				, this.scores.length);
       // car 깊은 복제
       cloned.car = new Car(this.car.model);
       // 깊은 복제된 Member 객체 리턴
       return cloned;
    }
    
    public Member getMember(){
    	Member cloned = null;
        try{
		cloned = (Member) clone();
	}catch(CloneNotSupportedException e){
        	e.printStackTrace();
        }
        return cloned;
    }
}

객체 소멸자(finalize())

  • GC는 참조하지 않는 배열이나 객체를 소멸시키기 전에 finalize()를 실행시킨다.
  • Object의 finalize()는 기본적으로 실행 내용이 없기 때문에 객체 소멸전 사용했던 자원을 닫고 싶거나 중요한 데이터를 저장하고 싶다면 finalize()를 재정의할 수 있다.
  • GC는 메모리의 상태를 확인하고 일부 객체를 무작위로 소멸시키고 구동 시점이 일정하지 않기 때문에 되도록 사용하지 않는 것이 좋다.

Objects 클래스

  • Objects 클래스는 객체 비교, 해시코드 생성, null 여부, 객체 문자열 리턴 등의 연산을 수행하는 정적 메소드로 구성된 Object의 유틸리티 클래스이다.

객체 비교(compare(T a, T b, Comparator< T >c))

  • compare(T a, T b, Comparator< T >c)는 두 객체를 비교자(Comparator)로 비교해서 int 값을 리턴한다.
  • Comparator< T >는 제네릭 인터페이스 타입으로 두 객체를 비교하는 compare(T a, T b)가 정의되어 있다.
  • a가 b보다 작으면 음수, 같으면 0, 크면 양수를 리턴하도록 구현 클래스를 만들어야 한다.

동등 비교(equals()와 deepEquals())

  • Object.equals(Object a, Object b)는 두 객체의 동등을 비교하는데 다음과 같은 결과를 리턴한다.
  • 만약 a와 b가 모두 null이라면 true를 리턴한다.
  • deepEquals(Object a, Object b) 역시 두 객체의 동등을 비교하는데 a와 b가 서로 다른 배열일 경우 항목 값까지 모두 같다면 true를 리던한다.
  • Arrays.deepEquals(Object[] a, Object[] b)와 동일하다.

해시코드 생성(hash(), hashCod())

  • Object.hash(Object ...values)는 매개값으로 주어진 값들을 이용해 해시코드를 생성하는 역할을 하는데, 주어진 매개값들로 배열을 생성하고 Arrays.hashCode(Object[])를 호출해서 해시코드를 얻고 이 값을 리턴한다.
  • Object.hashCode(Object o)는 매개값으로 주어진 객체의 해시코드를 리턴하기 때문에 o.hashCode()와 리턴값이 동일하다.
  • 매개값이 null이면 0을 리턴한다.

널 여부 조사(isNull(), nonNull(), requireNonNull())

  • Object.isNull(Object obj)는 매개값이 null인 경우 true를 리턴한다.
  • nonNull(Object obj)은 매개값이 not null인 경우 true를 리턴한다.
  • requireNonNull()은 다음 세가지로 오버로딩 되어있다.

객체 문자 정보(toString())

  • Object.toString()은 객체의 문자 정보를 리턴한다.
  • 첫번째 매개값이 not null이면 toString()으로 얻은 값을 리턴하고 null이면 "null" 또는 두번째 매개값인 nullDefault를 리턴한다.

좋은 웹페이지 즐겨찾기