면접 준비 용 자바 개념 정리 6

2018-09-24

1. StringBuffer, StringBuilder

  • 문자열을 결합하는 + 연산자를 많이 사용하면 할수록 그만큼 String 객체의 수가 늘어나기 때문에, 프로그램 성능을 느리게 하는 요인이 된다.
  • 문자열을 변경하는 작업이 많은 경우에는 String 클래스를 사용하는 것보다는 StringBuffer 또는 StringBuilder 클래스를 사용한느 것이 좋다.
  • 이 두 클래스는 내부 버퍼(buffer: 데이터를 임시로 저장하는 메모리)에 문자열을 저장해 두고, 그 안에서 추가, 수정, 삭제 작업을 할 수 있도록 설계 되어 있다.
  • 단 StringBuffer는 멀티 스레드 환경에서 사용할 수 있도록 동기화가 적용되어 있어 스레드에 안전하지만, StringBuilder는 단일 스레드 환경에서만 사용하도록 설계되어 있다.
public class Product {
    private String code;

    public Product(String code){
        this.code = code;
    }

    @Override
    public boolean equals(Object obj){
        if(obj.instanceof Product) {
            Product product = (Product) obj;
            if(code.equals(product.code)){
                return true;
            }
        }
        return false;
    }
}



2. 객체 해시코드(hashCode())

  • 객체 해시코드란 객체를 식별할 하나의 정수값을 말한다. Object의 hashCode()메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴하기 때문에 객체마다 다른 값을 가지고 있다.
  • HashSet, HashMap, Hashtable은 다음과 같은 방법으로 두 객체가 동등한지 비교한다. 우선 hashCode() 메소드를 실행해서 리턴된 해시코드 값이 같은지를 본다. 해시코드 값이 다르면 다른 객체로 판단하고, 같으면 equals() 메소드로 다시 비교한다. 그렇기 때문에 hashCode() 메소드가 true가 나와도 equals()의 리턴값이 다르면 다른 객체가 된다.

2-1. 해시코드 생성(hash(), hashCode())

  • Objects.hash(Object … values)는 매개값으로 주어진 값들을 이용해서 해시 코드를 생성하는 역할을 한다. 이 메소드는 클래스가 hashCode()를 재정의할 때 리턴값을 생성하기 위해 사용하면 좋다.
@Override
public int hashCode(){
    return Objects.hash(field1, field2, field3);
}



3. 객체 복제(clone())

3-1. 얕은 복제(thin clone)

  • 얕은 복제(thin clone)란 단순히 필드값만을 복사해서 객체를 복제하는 것을 말한다.
  • 필드값만 복제하기 때문에 필드가 기본타입일 경우 값 복사가 일어나고, 필드가 참조 타입일 경우에는 객체의 번지가 복사된다.
  • Object의 clone() 메소드는 자신과 동일한 필드값을 가진 얕은 복제된 객체를 리턴한다. 이 메소드로 객체를 복제하려면 원본 객체는 반드시 java.lang.Cloneable 인터페이스를 구현하고 있어야 한다.


3-2. 깊은 복제(deep clone)

  • 얕은 복제(thin clone)의 경우 참조 타입 필드는 번지만 복제하기 때문에 원본 객체의 필드와 복제 객체의 필드는 같은 객체를 참조하게 된다. 깊은 복제는 참조하고 있는 객체도 복사하는 것을 말한다.
  • 깊은 복제를 하려면 Object의 clone() 메소드를 재정의해서 참조 객체를 복제하는 코드를 직접 작성해야 한다.




참고

이것이 자바다 신용권의 Java 프로그래밍 정복