객체 원본을 유지해놓고 복사본을 사용하거나, 기본 프로토타입의 복사본을 사용해 동일한 인스턴스를 만들어 복잡한 생성과정을 간단하게 할때 사용한다.
객체를 복제해 또 다른 객체를 반환해 준다.
clone()으로 인스턴스를 복제하는 예제
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
public String toString() {
return "x = " + x + ", y = " + y;
}
}
class Circle implements Cloneable {
Point point;
int radius;
Circle(int x, int y, int radius) {
this.radius = radius;
point = new Point(x, y);
}
@Override
public String toString() {
return "Circle{" +
"point=" + point +
", radius=" + radius +
'}';
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
Circle circle = new Circle(10, 20, 30);
Circle copyCircle = (Circle) circle.clone();
System.out.println(circle);
System.out.println(copyCircle);
System.out.println(System.identityHashCode(circle));
System.out.println(System.identityHashCode(copyCircle));
}
}
clone() 메소드를 사용하려면 객체를 복제해도 된다는 의미로 Cloneable 인터페이스를 구현해야한다.
Object의 clone()은 클래스의 인스턴스를 새로 복제하여 생성해준다. 맴버젼수가 동일한 인스턴스가 다른 메모리에 새로 생성되는 것이다.
String에 intern() 이라는 메서드가 있는데, 변수 문자열값에 대해 상수풀을 뒤져서 상수풀에 존재하면 그걸 반환함
Wrapper class
기본자료형을 클래스로 씌워놓은것을 wrapper class라고 한다.
기본 자료형을 위한 클래스
primitive을 클래스로 써야하는 경우
매개변수가 객체거나 반환 값이 객체형인 경우
제네릭의 반환 타입을 지정할때 (자바 언어 스팩)
오토박싱과 언박싱
오토박싱 : primitive 타입을 reference타입으로 바꾸는 것
언박싱 : reference 타입을 primitive타입으로 바꾸는 것
Class class
자바의 모든 클래스와 인터페이스는 컴파일 되고 나면 class파일로 생성된다.
Class클래스는 컴파일 된 class 파일에 저장된 클래스나 인터페이스 정보를 가져오는데 사용된다.
코드를 작성할때 사용하는 여러 클래스의 모든 정보를 알고있는것은 아니다 (필요한 매개변수 또는 반환타입)
이런 경우 정보를 알고싶을때 Class 클래스를 활용한다.
Object 클래스의 getClass()활용
String s = new String();
Class c = s.getClass();
클래스 파일 이름을 Class변수에 직접 대입하기
Class c String.Class;
Class.forName(“CLASS_NAME”) 사용하기
Class c = Class.forName("java.lang.String");
c.getConstructors(); // 모든 생성자 가져오기
c.getFields(); // 모든 멤버 변수 가져오기
c.getMethods(); // 모든 메소드 가져오기
Reflection programming
Class 클래스를 사용하는 방법은 클래스의 자료형을 직접 사용하여 프로그래밍 하는 것 보다 더 복잡하고 예외처리도 해야 한다. 이미 우리가 자료형을 알고 있는 클래스인 경우 또는 컴파일 할 때 직접 참조 할 수 있는 클래스는 Class 클래스를 활용할 필요가 없다. 클래스의 정보를 모두 알고 있는 상황에서 리플렉션 프로그래밍을 하면 오히려 코드가 복잡해지고 속도도 느려진다.
따라서 리플렉션 프로그래밍은 컴파일 시점에 알 수 없는 클래스, 즉 프로그램 실행 중에 클래스를 메모리에 로딩 하거나 객체가 다른 곳에 위치해서 원격으로 로딩하고 생성할 때 사용한다.