객체
객체
객체(Object)란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신과 다른 것을 식별가능한 것을 뜻한다.
객체는 속성과 동작으로 구성되어 있다.
자바에서는 이러한 객체의 속성을 필드(field), 동작을 메소드(method)라고 한다.
객체를 생성하는 방법
자바에서 객체를 생성하는 방법은 다양하다.
- new 키워드 사용
- Class.forName(String className) 사용
- clone() 메서드 사용
- 역직렬화 사용
- 생성자 클래스의 newInstance() 메서드 사용
new 키워드 사용
- 먼저 클래스 타입의 변수를 선언해야 한다. 이는 객체를 참조할 수 있는 변수 선언이다.
- 두번째로 new 키워드를 사용하여 객체의 복사본을 해당 변수에 할당해야한다.
- 즉 new 키워드는 새 객체에 대한 메모리를 런타임 시 동적으로 할당한다.
- 하나의 객체 참조 변수를 다른 객체 참조 변수에 할당할 때 객체의 복사본을 만드는 것이 아니라 참조의 복사본만 만든다.
1
2
3
4
5
class Box {
double width;
double height;
double depth;
}
1
2
Box b1 = new Box();
Box b2 = b1;
Class.forName(String className) 메서드 사용
- 클래스 이름을 알고 있고 public default 생성자가 있을 경우 Class.forName 객체를 만들 수 있다.
- Class.forName은 자바에서 클래스를 로드하지만 객체를 생성하지는 않으므로 객체 생성을 하기 위해서는 클래스의 new Instance()를 사용해야 한다.
1
2
3
4
5
6
Class cls = Class.forName("GFG");
GFG obj = (GFG)cls.newInstance();
System.out.println("Object created for class:" + obj.getClass().getName());
clone() 메서드 사용
- 어떤 객체에서 clone()이 호출될 때마다 JVM은 실제로 새 객체를 생성하고 이전 객체의 모든 내용을 복사한다.
- clone() 메서드를 사용하여 객체를 만들면 생성자가 호출되지 않는다
- 객체에서 clone() 메서드를 사용하려면 Cloneable을 구현하고 그 안에 clone() 메서드를 정의 해야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class GFG implements Cloneable {
@Override
protected Object clone()
throws CloneNotSupportedException {
// Super() keyword refers to parent class
return super.clone();
}
String name="MyName";
}
public static void main(String[] args) {
GFG obj1 = new GFG();
try {
// Using the clone() method
GFG obj2 = (GFG)obj1.clone();
} catch (CloneNotSupportedException e) {
}
}
역직렬화 사용
- 객체를 직렬화한 다음 역직렬화할 때마다 JVM은 별도의 객체를 생성한다.
- deserialization 에서 JVM은 생성자를 사용하여 객체를 생성하지 않는다.
- 객체를 역직렬화하려면 클래스에서 Serializable 인터페이스를 구현해야 한다
1
2
3
4
5
class GFG implements Serializable {
private String name;
...
}
contructor 클래스의 newInstance() 메서드 사용
- 클래스의 newInstance() 메소드와 유사하다.
- java.lang.reflect.Constructor 클래스 에는 객체를 생성하는 데 사용할 수 있는 newInstance() 메서드가 있다.
- 이 newInstance() 메서드를 사용하여 매개변수화된 생성자와 개인 생성자를 호출할 수 있다.
- Class의 newInstance() 메서드는 내부적으로 Constructor 클래스의 newInstance() 메서드를 사용한다.
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
import java.lang.reflect.*;
class GFG {
private String name;
// 생성자
GFG() {}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) {
try {
Constructor<GFG> constructor
= GFG.class.getDeclaredConstructor();
GFG r = constructor.newInstance();
r.setName("GeeksForGeeks");
System.out.println(r.name);
} catch (Exception e) {}
}
객체는 메모리에 어떻게 저장될까?
- 자바에서 new()를 사용하여 객체를 할당할 때 객체는 힙에 할당되고 그렇지 않으면 전역 또는 정적이 아닌 경우 스택에 할당된다.
This post is licensed under CC BY 4.0 by the author.