Post

객체

객체

객체(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;
}

declarationinstantiationinitialization

1
2
Box b1 = new Box();
Box b2 = b1;

newoperator

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.