CodeGym /행동 /JAVA 25 SELF /new로 객체 생성

new로 객체 생성

JAVA 25 SELF
레벨 14 , 레슨 3
사용 가능

1. 키워드 new

Java에서 어떤 클래스의 객체든 생성하려면 키워드 new를 사용합니다. 이 '마법 같은' 단어는 JVM에게 새 객체를 위한 메모리를 할당하고 해당 객체의 생성자를 호출하라고 요청합니다.

비유:
클래스가 자동차의 설계도라면, new는 그 설계도를 바탕으로 실제 자동차를 조립하는 공장입니다.

예시

Person vasya = new Person();

여기서 무슨 일이 일어나는지 살펴봅시다:

  1. new Person() — Person 타입의 새 객체가 생성됩니다(생성자가 호출됨).
  2. vasya — 생성된 객체의 참조(주소)를 저장하는 변수입니다.

메모리에서의 동작

Person vasya = new Person();를 작성하면, 메모리에는 객체의 필드(예: 이름과 나이)를 위한 공간이 할당되고, 변수 vasya에는 그 공간의 주소, 즉 참조가 저장됩니다.

주의:
new를 쓰지 않으면 변수는 아무 것도 가리키지 않는 참조(null)일 뿐입니다. 그런 '빈' 객체의 필드나 메서드에 접근하려 하면 NullPointerException이 발생합니다.

2. 생성자 호출: 어떻게 동작할까?

생성자는 객체를 생성할 때 호출되어 필드를 초기화하고 인스턴스를 사용할 준비를 시키는 특별한 메서드입니다.

구문

ImyaKlassa imyaPeremennoy = new ImyaKlassa(argumenty);
  • 클래스에 매개변수가 있는 생성자가 있다면, 반드시 그 매개변수를 전달해야 합니다.
  • 매개변수가 없는 생성자(또는 기본 생성자)라면, 괄호는 비워 둡니다.

예시: 매개변수가 있는 생성자

public class Person {
    String name;
    int age;

    // 매개변수가 있는 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

객체 생성:

Person petya = new Person("Petya", 25);

"Petya"25라는 값이 새 객체의 nameage 필드에 저장됩니다.

매개변수 없는 생성자

public Person() {
    this.name = "이름 없음";
    this.age = 0;
}

이제 이렇게 작성할 수 있습니다:

Person mysteryMan = new Person(); // name="이름 없음", age=0

3. 객체 사용: 필드와 메서드

객체를 생성한 후에는 점 연산자(.)를 통해 그 필드와 메서드에 접근할 수 있습니다:

petya.name = "Pyotr";
System.out.println(petya.name); // Pyotr

petya.sayHello();

클래스에 다음과 같은 메서드가 있다면:

public void sayHello() {
    System.out.println("안녕하세요, 제 이름은 " + name + "입니다!");
}

그러면 petya.sayHello(); 호출 결과는 다음과 같습니다: 안녕하세요, 제 이름은 Pyotr입니다!

예시: 전체 클래스

public class Person {
    String name;
    int age;

    public Person(String name, int age) { // 생성자
        this.name = name;
        this.age = age;
    }

    public void sayHello() { // 메서드
        System.out.println("안녕하세요, 제 이름은 " + name + "입니다!");
    }
}

사용 예:

Person vasya = new Person("Vasya", 30);
vasya.sayHello(); // 안녕하세요, 제 이름은 Vasya입니다!

4. 참조 변수: 이것이 무엇일까?

Java에서 클래스 타입의 변수는 객체 자체가 아니라 메모리에 있는 객체에 대한 참조입니다.

데모

Person vasya = new Person("Vasya", 30);
Person anotherVasya = vasya;

이제 vasyaanotherVasya는 메모리의 동일한 객체를 가리킵니다. 한 변수를 통해 필드를 변경하면 다른 변수로 보더라도 변경된 값을 보게 됩니다:

anotherVasya.age = 31;
System.out.println(vasya.age); // 31

중요한 점:
서로 다른 두 객체를 생성하면, 그 둘은 서로 독립적입니다:

Person petya = new Person("Petya", 25);
Person masha = new Person("Masha", 22);

petya.age = 99;
System.out.println(masha.age); // 22 (변경되지 않음!)

5. 예시: 여러 객체 생성 및 사용

애플리케이션에 여러 객체를 추가해 봅시다. Person 클래스가 있고, main에서 여러 사람을 생성해 인사말을 출력해 보겠습니다.

Person 클래스

public class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void sayHello() {
        System.out.println("안녕하세요, 제 이름은 " + name + "이고, 나이는 " + age + "살입니다!");
    }
}

main에서의 사용

public class Main {
    public static void main(String[] args) {
        Person vasya = new Person("Vasya", 25);
        Person petya = new Person("Petya", 27);

        vasya.sayHello(); // 안녕하세요, 제 이름은 Vasya이고, 나이는 25살입니다!
        petya.sayHello(); // 안녕하세요, 제 이름은 Petya이고, 나이는 27살입니다!

        // 객체의 독립성 데모:
        vasya.age = 100;
        vasya.sayHello(); // 안녕하세요, 제 이름은 Vasya이고, 나이는 100살입니다!
        petya.sayHello(); // 안녕하세요, 제 이름은 Petya이고, 나이는 27살입니다!
    }
}

프로그램 출력:

안녕하세요, 제 이름은 Vasya이고, 나이는 25살입니다!
안녕하세요, 제 이름은 Petya이고, 나이는 27살입니다!
안녕하세요, 제 이름은 Vasya이고, 나이는 100살입니다!
안녕하세요, 제 이름은 Petya이고, 나이는 27살입니다!

6. 객체 생성 시 흔한 실수

오류 №1: new를 쓰지 않음

Person vasya;
vasya.name = "Vasya"; // NullPointerException!

변수 vasya는 어떤 객체도 가리키지 않습니다(null). 반드시 new로 객체를 생성해야 합니다.

오류 №2: 생성자에 필요한 매개변수를 전달하지 않음

Person petya = new Person(); // 파라미터 없는 생성자가 없다면 컴파일 오류

클래스에 매개변수가 있는 생성자만 있다면, 객체 생성 시 그 매개변수를 반드시 지정해야 합니다.

오류 №3: 변수가 객체 자체를 저장한다고 착각함

Person a = new Person("Anya", 20);
Person b = a;
b.age = 99;
System.out.println(a.age); // 99, a와 b는 동일한 객체를 참조하는 참조이기 때문!

Java에서 클래스 타입 변수는 항상 참조이지, 객체 자체가 아닙니다.

오류 №4: 한 객체의 필드를 변경하고도 다른 객체에는 영향이 없을 거라 기대함

Person x = new Person("X", 1);
Person y = x;
x.age = 42;
System.out.println(y.age); // 42

두 개의 독립적인 객체가 필요하다면, 각각 따로 생성하세요!

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION