IT개발및프로그래밍/자바

자바 객체 생성의 핵심: new 키워드 이해하기

devgodmj 2024. 11. 11. 11:31

자바에서 new 키워드란? 객체 생성의 시작점!

자바에서 객체를 생성할 때 꼭 등장하는 new 키워드, 객체 지향 언어인 자바에서 new는 매우 중요한 역할을 합니다. 

  • new 키워드란?
    new 키워드는 자바에서 새로운 객체를 생성할 때 사용하는 연산자 입니다. new를 사용하면 프로그램이 메모리에 새로운 공간을 할당하여 객체를 만들고, 해당 객체의 참조(주소)를 반환합니다. 이를 통해 객체가 초기화되고 프로그램에서 사용될 수 있게 됩니다.
String str = new String("Hello, World!");
Person person = new Person(); // Person 클래스의 객체 생성

 

위 코드에서 new String("Hello, World!")와 new Person()은 각각 String 객체와 Person 객체를 생성합니다. new 키워드가 없었다면 객체를 생성할 방법이 없기 때문에, 클래스의 인스턴스를 만들려면 new가 필수적입니다.


* 인스턴스: 특정 클래스를 사용해 생성된 객체


  • new 키워드의 주요 역할
    • 객체 생성: new는 지정한 클래스의 객체를 힙 메모리에 생성합니다. 이는 프로그램에서 사용 가능한 객체를 만들어주는 첫 단계입니다.
    • 생성자 호출: 객체가 생성되면 생성자(Constructor)가 호출되어 초기화 작업을 수행합니다. 클래스마다 하나 이상의 생성자를 정의할 수 있는데, new 키워드는 해당 클래스의 생성자를 찾아 호출합니다.
    • 참조 반환: 생성된 객체의 메모리 주소를 반환하여, 변수에 할당할 수 있게 합니다. 이렇게 참조 주소를 통해 우리가 만든 객체에 접근하고 사용할 수 있게 됩니다.

  • 객체 생성 기본 예시
public class Person {
    String name;
    
    public Person(String name) { // 생성자 정의
        this.name = name;
    }
    
    public void sayHello() {
        System.out.println("Hello, " + name);
    }
}

// Main 클래스에서 Person 객체 생성
public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice"); // new로 Person 객체 생성
        person.sayHello(); // "Hello, Alice" 출력
    }
}

 

위 예제에서 new Person("Alice")는 다음을 수행합니다:

  • 새로운 Person 객체를 힙 메모리에 생성하고,
  • 생성자 Person(String name)을 호출하여 name 속성을 "Alice"로 초기화합니다.
  • 생성된 객체의 참조 주소를 person 변수에 저장하여 나중에 sayHello()와 같은 메서드를 호출할 수 있게 합니다.

 


  • new 없이 객체를 생성할 수는 없을까?
    일반적으로 자바에서 객체를 생성할 때 new는 필수적이지만, 예외적으로 리터럴(literal)을 사용하는 경우 new 없이도 객체 생성이 가능합니다. 예를 들어 String 객체는 문자열(String Pool)을 사용하여 new 없이도 간단히 생성할 수 있습니다. 
String str1 = "Hello, World!";
String str2 = "Hello, World!";

 

위 코드에서 str1과 str2는 동일한 "Hello, World!"라는 문자열을 참조합니다. 이는 자바가 **문자열 풀(String Pool)**이라는 메모리 영역에 동일한 문자열을 한 번만 저장하고, 이후 같은 문자열이 등장할 경우 해당 주소를 재사용하기 때문입니다.

반면, new String("Hello, World!")와 같이 new로 문자열 객체를 생성하면 문자열 풀과 별도로 새로운 객체가 생성됩니다.

 

 

  • new와 문자열 리터럴의 차이
String str1 = "Hello, World!";
String str2 = "Hello, World!";
String str3 = new String("Hello, World!");

System.out.println(str1 == str2); // true, 같은 문자열 풀을 참조
System.out.println(str1 == str3); // false, 새로운 객체 참조

 

이 예제에서 str1과 str2는 같은 문자열 풀의 "Hello, World!" 객체를 참조하므로 == 비교 시 true가 출력됩니다. 그러나 str3는 new 키워드를 사용해 생성된 별도의 객체를 참조하므로 == 비교 결과가 false가 됩니다.


  • new의 필요성
    자바는 객체 지향 언어이기 때문에 대부분의 데이터와 기능이 객체 형태로 관리됩니다. 기본 데이터 타입(int, double 등)을 제외한 모든 데이터는 객체로 표현되며, 클래스의 인스턴스를 생성하려면 new 키워드를 사용해야 합니다.
    • 독립적인 객체 생성: new로 생성된 객체는 각각 독립된 메모리 공간을 가지므로, 여러 개의 객체를 동시에 사용하거나 다르게 초기화할 수 있습니다.
    • 다양한 객체 생성: 하나의 클래스를 기반으로 여러 객체를 생성하고, 각 객체가 독립적인 역할을 수행할 수 있습니다.
    예를 들어, 다음과 같이 같은 클래스 Person을 기반으로 여러 객체를 만들 수 있습니다.
Person person1 = new Person("Alice");
Person person2 = new Person("Bob");

person1.sayHello(); // "Hello, Alice" 출력
person2.sayHello(); // "Hello, Bob" 출력

 

  • 생성자(Constructor)와 new의 관계
    new 키워드는 객체 생성 시 생성자를 호출하여 객체의 초기화 작업을 수행합니다. 생성자는 객체가 생성될 때 실행되는 특별한 메서드로, 객체의 초기 상태를 설정하는 역할을 합니다. 클래스에 생성자를 정의하지 않으면 컴파일러가 기본 생성자를 자동으로 추가하지만, 특정 파라미터를 받는 생성자를 정의할 수도 있습니다.
public class Car {
    String model;
    int year;

    public Car(String model, int year) {
        this.model = model;
        this.year = year;
    }
}

 

이제 Car 객체를 생성할 때 new Car("Tesla", 2023);처럼 생성자에 매개변수를 전달하여 초기화할 수 있습니다.


  • 정리
    자바에서 new 키워드는 객체를 생성하고 초기화하는 데 중요한 역할을 합니다.
    • 객체 생성: new는 메모리에 새로운 객체를 생성하고, 생성자를 호출하여 초기화합니다.
    • 참조 반환: 생성된 객체의 주소를 반환하여, 변수를 통해 객체에 접근하고 사용할 수 있게 합니다.
    • 문자열 리터럴 예외: new 없이도 문자열 리터럴을 통해 문자열 객체를 생성할 수 있지만, new를 사용하면 항상 새로운 객체가 생성됩니다.
    자바는 객체 지향 언어이기 때문에 대부분의 데이터와 기능이 객체 형태로 관리되며, 클래스의 인스턴스를 생성하기 위해 new가 필수입니다. 객체 생성과 new 키워드를 이해하면 자바의 메모리 관리와 객체 지향 개념을 더 깊이 이해할 수 있습니다.

    객체 지향 프로그래밍에서 객체 생성은 매우 중요한 작업이며, 자바의 new 키워드는 이를 가능하게 해주는 핵심적인 요소입니다.