[컬러잇자바] #5. 왜 생성자를 사용할까?

2026. 1. 26. 23:29·Language/ColorIt_Java

※ [컬러잇 자바] 시리즈는 "왜?"라는 질문을 중심으로 자바의 기초문법에서 고급 자바기술까지 알아보는 컬러잇 개발블로그 시리즈입니다.

 

컬러잇 자바시리즈 5편. 저번시간에는 객체의 행동인 메서드에 대해서 알아보았습니다. 이제 변수와 메서드에 대해 알았으니 "객체 간의 상호작용"이라하는, 어느 객체가 다른 객체를 참조하고, 객체의 변수와 메서드에 직접 접근할 수 있습니다.

 

다만 아직 객체가 실제로 생성되지는 않았습니다. 지금까지 다룬 내용들은 "이 객체가 저 객체를 참고하게할거야"라고 정의를 해둔 상태에 불과합니다. 객체가 생성되어야 우리는 그 객체에 대해서 변수나 메서드를 호출할 수 있습니다.

 

오늘은 자바에서 객체를 생성하는 생성자에 대해서 알아보고, 클래스의 초기 변수들의 값을 설정하는, 초기화에 대해서 알아보겠습니다.


객체를 생성한다고?

new 연산자

class Dog {
    int age;
    String name;
}

객체를 다루면서 늘 꾸준히 등장하는 개 클래스가 있습니다.

 

class Person {
    Dog myDog;
}

변수에 대해서 배울 때, 참조형 변수는 (객체 이름) (변수이름);으로 선언하고, (변수이름).(객체의 변수명 또는 메서드명) 으로 객체의 요소에 접근해야한다고 배웠습니다. 하지만 위처럼 변수를 선언하면, "나는 이 Dog 객체를 참조하는 참조형 변수 myDog를 사용할거야"라고 선언한 것입니다.

 

다만 여기서 끝나서는 안되고, 모든 객체는 생성되어야합니다.

자바에는 힙 메모리라고하는, 객체들이 살고 있는 공간이 있습니다. 여기에 4살 초코, 5살 뽀삐, 9살 백구 등 개 객체가 살고 있는 것입니다.

따라서 진짜로 객체를 참조하고, 객체의 변수나 메서드에 접근해야한다면, 힙메모리에 객체가 태어나게 해야합니다. 이를 생성이라고 합니다.

 

class Person {
    Dog myDog = new Dog();
}

이렇게 객체를 생성할 때에는 new 연산자라는 것이 필요합니다. new 연산자를 사용하면 자바는 "아, 힙 메모리에 개 객체를 하나 태어나게하라는 뜻이구나"라고 인식하고 힙 메모리에 새로운 개 객체를 태어나게합니다.

 

즉, 가장 기본적으로 객체를 태어나게하는, 생성을 하고싶다면, new (태어나게하려는 객체이름)(); 을 사용해야합니다.


생성자

좋습니다. 이제 객체를 힙 메모리에 태어나게하는 new 연산자에 대해서 알아보았습니다. 그러면 new 뒤에 있는 Dog()는 무엇일까요?

 

그 전에, 단순히 new Dog(); 이라고하면 이름이 없고 나이는 0살인 개 객체가 생성됩니다. 이런 개는 존재할 수 없습니다. 따라서 객체가 생성될 때 생성과 함께 이름과 나이를 지정해주어야합니다.

 

이처럼, 객체가 생성될 때 객체의 변수들이 특정한 값을 가지도록하는 것을 초기화라고 합니다. 그리고 이 초기화는 생성자에서 다룰 수 있습니다. 즉, new 연산자 뒤에 있는 Dog() 가 생성자가 되는 것이지요.

 

class Dog {
    int age;
    String name;
    
    Dog(){
        age = 3;
        name = "뽀삐";
    }
}

가장 기본적인 생성자의 예시입니다. 메서드와 비슷하게 생겼지만, 메서드와 다른점은 반환타입이 없으며, 생성자의 이름은 반드시 클래스의 이름과 같아야합니다.

보면 알 수 있듯이 생성자도 메서드와 비슷합니다. 그래서 new Dog(); 이라고하면, new 연산자 뒤에 Dog() 생성자가 호출되어 age와 name 변수가 각각 특정한 값으로 정해집니다.

 

따라서 아무것도 설정하지 않고 개 객체를 만들면, 기본값으로 3살 뽀삐 객체가 생성되게 되는 것입니다. 하지만 세상에 있는 모든 개가 3살도 아니고 이름이 뽀삐는 더더욱 아닙니다.


매개변수를 받는 생성자

class Dog {
    int age;
    String name;
    
    Dog(int age, String name){
        this.age = age;
        this.name = name;
    }
}
class Person {
    Dog myDog = new Dog(5, "초코");
}

생성자는 매개변수도 받을 수 있습니다. 메서드의 매개변수와 똑같은 기능을 가지고 있으며, 생성자의 매개변수가 있다면 객체를 생성하는 쪽에서 전해주는 매개변수로 변수의 값을 초기화하는 것이죠.

 

this 키워드 역시 메서드를 다룰 때 했던 것과 같습니다. 매개변수 이름인 age, name과 객체 내 변수 이름 age, name을 구분하기 위해서 객체 자신을 가리키는 키워드로 사용한다고 했죠,

 

class Person {
    Dog myDog = new Dog(5);  //에러! 모든 매개변수를 전부 전달해주어야합니다.
    Dog myDog = new Dog("초코");  //에러! 모든 매개변수를 전부 전달해주어야합니다.
    Dog myDog = new Dog();  //에러! 모든 매개변수를 전부 전달해주어야합니다.
}

중요한 점은 생성자에 매개변수가 있다면 반드시 매개변수의 종류와 순서에 맞춰서 매개변수를 전달해주어야합니다. age와 name을 매개변수로 받는 생성자가 있다고할 때, age나 name만 매개변수로 넘기거나, 아무것도 매개변수로 전해주지 않으면 오류가 발생합니다.


생성자는 여러 개가 가능합니다!

그렇다면, 우리가 모든 개의 나이를 아는 것도 아니고, 간혹가다가 이름 없는 개가 생길 수도 있지 않을까요? 그러면 age와 name 변수 두 개를 반드시 필요로하는 생성자를 사용하기엔 어렵지 않을까요?

 

class Dog {
    int age;
    String name;
    
    Dog(int age){
        this.age = age;
        name = "초코";
    }
}
class Person {
    Dog myDog = new Dog(5);
}

이름 모르는 개가 있다면 나이만 지정해주고, 이름을 지정해주지 않거나 임의의 기본값으로 정의할 수 있습니다. 위의 경우에는 나이만 매개변수로 전해주면 이름이 초코이며, 개 주인 객체가 지정해주는 나이를 가지게 되겠지요.

 

class Dog {
    int age;
    String name;
    
    Dog(int age, String name){
        this.age = age;
        this.name = name;
    }
    
    Dog(int age){
        this.age = age;
        name = "초코";
    }
    
    Dog(String name) {
        this.name = name;
        age = 4;
    }
    
    Dog() {
        this.name = "초코";
        this.age = 4;
    }
}

또 생성자의 중요한 특징 중 하나는, 생성자의 이름이 같더라도 매개변수가 다르다면 생성자를 여러 개 선언할 수 있습니다. (이는 메서드에도 적용되는 특징이며, 이를 오버로딩이라고합니다. 다음에 다룰 예정입니다.)

 

따라서 개 객체를 생성하는 쪽에서는 위와같이 생성자가 있다면 개의 이름만 알거나, 나이만 알거나, 둘 다 알거나, 둘 다 모르는 경우에 대해서도 객체를 생성할 수 있습니다.


생성자는 자바가 직접 만들어줄 때도 있습니다

또 하나의 특이점은 객체 내의 생성자가 아무것도 없다면, 자바가 알아서 생성자를 만들어준답니다!

 

class Dog {
    int age;
    String name;
}
class Person {
    Dog myDog = new Dog();
}

이렇게 객체의 생성자가 없더라도 생성자의 호출 및 객체의 생성이 가능합니다. 단, 이 때 자바가 만들어주는 생성자는 아무기능이 없습니다. 매개변수도 없고, 변수의 초기화도 진행되지 않습니다. 그래서 직접 초기화를 할 필요가 없는 경우에는 생성자를 만들어주지 않아도 됩니다.

 

알아두어야 할 점은 개발자가 어느 생성자라도 직접 생성자를 만든다면, 자바는 알아서 생성자를 만들어주지 않습니다. 이 점을 유의해야합니다. 개 객체에 이름만 매개변수로 받아서 초기화시키는 생성자를 직접 만들어준다면, Dog myDog = new Dog(); 는 에러가 발생합니다.


초기화하지 않으면 어떤 일이 일어날까요?

생성자를 통해서 자바의 초기값을 설정해줄 수 있습니다. 초기화라고 했죠. 그런데 값을 넣어주지 않으면 어떤 일이 일어날까요? 가령 age 변수나 name 변수에 아무 값도 저장하지 않는다거나, 객체를 선언만하고 생성하지 않는 경우에는, 변수에는 어떤 값이 저장될까요? 두 가지 경우로 나뉩니다.

 

1. 메서드 안에서 변수를 선언한 경우

지금가지는 클래스 내부 및 메서드 외부에서 변수를 선언했지만, 사실 메서드 안에서도 변수를 선언할 수 있습니다. 다만 객체의 상태를 나타내는 용도는 아니고, 잠시 값을 저장할 공간이 필요할 때 저장해두는 용도입니다.

 

class Person {
    Dog myDog = new Dog();
    int amount;
    
    void setMyDogAge() {
        int age;
        amount = age;    //에러! 메서드 내에 선언된 변수 age의 값이 지정되지 않음
        myDog.age = age;    //에러! 메서드 내에 선언된 변수 age의 값이 지정되지 않음
        int age2 = age + 1; //에러! 메서드 내에 선언된 변수 age의 값이 지정되지 않음
}

이렇게 메서드 내부에서 변수를 선언했는데 값을 지정해주지 않을 경우, 그 변수를 사용하려할 때 에러가 발생합니다. age 변수에 값을 더하거나 빼거나, 다른 변수에 대입시키거나하는 모든 경우에서 에러가 발생합니다. 즉, 메서드 안에서 변수를 선언하면 변수에 값을 저장하기 전까지는 사용할 수 없습니다.

 

2. 메서드 밖, 클래스 안에서 변수를 선언한 경우

지금까지 배웠던 변수에 해당합니다. 객체의 상태를 나타낼 때 사용하는 그 변수입니다.

 

class Dog {
    int age;
    String name;
}
class Person {
    Dog myDog = new Dog();  //이 경우에는 정상적으로 객체가 생성됩니다.
    int age = myDog.age;    //int형 myDog.age 값의 기본값인 0
    
    Dog myDog2;             //객체가 생성되지 않아서 null
}

이 경우 변수를 선언했는데 개발자가 값을 직접 지정해주지 않았거나, 객체가 생성되지 않은 경우가 있습니다. 이 경우도 두 가지 경우로 나뉩니다.

 

1. 기본형변수

기본형변수는 아무 값도 지정되지 않은 경우 0으로 자동으로 초기화됩니다.

정수형과 실수형 변수는 0을 가지고, char 타입은 내부적으로 문자를 숫자에 대응시켜서 저장하는데, char 타입에는 0에 대응하는 문자가 저장됩니다. 불리언(boolean) 타입의 경우에는 0에 해당하는 false 값을 가집니다.

 

즉, 정수형과 실수형, 그리고 문자형은 0, 불리언형은 false 값을 가집니다. 그래서 아무 값도 저장하지 않았다라도 초기값이 0으로 설정된다는 것만을 알면 자유롭게 사용할 수 있습니다.

 

그래서 개 객체의 age 변수에 아무 값도 지정해주지 않으면 0살 개 객체가 만들어지는거죠.

 

2. 참조형변수

참조형변수는 기본값이 null이라는 값입니다. null값으로 자동초기화되며, 즉 참조형 변수를 선언한 후 아무런 객체도 대입하지 않으면 null 값이 저장됩니다.

 

class Person {
    Dog myDog2;             //객체가 생성되지 않아서 null
    int age = myDog2.age;   //에러! myDog2가 아무 객체도 가리키고 있지 않으므로
                            //age 값을 알 수 없습니다.
}

변수에 null 값이 저장되면 해당 변수가 가리킬 객체가 아직 태어나지 않았다는 것을 뜻합니다. 따라서 해당 참조형 변수를 통해서 객체의 상태나 메서드에 접근하면 "저는 아직 가리키는 객체가 없어서 객체의 변수나 메서드를 불러올 수 없어요"라고 오류를 발생시킵니다. 이것이 바로 NullPointerException, 줄여서 NPE라고 합니다.

 

즉, 위의 코드가 에러가 발생하는 이유는 age 변수에 문제가 있는게 아니라 myDog2 변수가 가리킬 Dog 객체가 아직 생성되지 않아 객체가 가지고있는 변수나 메서드를 불러올 수 없어서 에러가 발생하는 것입니다. 아직 myDog2 변수가 가리키는 개 객체의 나이가 3살인지, 2살인지, 9살인지 알 수 없기 때문입니다.

 

종종 개발하다 NPE가 발생하는 경우가 있습니다. NPE가 발생했다면 어디선가 값의 대입이 누락되었다는 것을 뜻하므로 한 번 확인해보는 것이 좋습니다.


이렇게 오늘은 생성자에 대해서 알아보았습니다.

참조형변수는 선언된 후 반드시 객체가 생성되어 변수가 객체를 가리키게 (참조하게) 해야합니다. 그리고 생성자는 그 과정에서 객체를 생성할 때 호출되어 변수를 개발자가 원하는 특정한 값으로 설정해두기 위해 필요합니다. 객체를 생성하고, 객체 내의 변수의 초기값을 설정하는 일을 따로 하는게 아니라 한 번에 할 수 있다는 장점이 있기에 더욱 편리합니다.

 

생성자는 일반 메서드와 비슷하게 매개변수를 받아서 매개변수값으로 변수를 초기화시킬 수 있습니다. 또한 생성자는 받는 매개변수가 다르다면 생성자를 여러 개 선언할 수 있어, 개의 이름만 받고 나이는 기본값으로 초기화하거나, 개의 나이만 알고 이름은 기본값으로 초기화하는 경우도 가능합니다.

 

만약 초기화를 통해 변수의 기본값을 설정해주지 않았다면, 메서드 내에서 선언된 변수는 변수에 값을 넣어주기 전까지 사용할 수 없는 반면, 메서드 외부 및 클래스 내부에 선언된 변수는 기본형 변수의 경우 0에 해당하는 값을, 참조형 변수에는 null 이라는 값이 저장됩니다. null의 경우에는 변수나 메서드에 접근할 수 없습니다. 객체가 생성되지 않았거든요.

 

이렇게 최종적으로 객체를 어떻게 생성하는지에 대해 알아보았습니다.

드디어 우리는 객체의 상태를 나타내는 변수, 그리고 객체가 할 수 있는 일을 나타내는 메서드, 그리고 객체를 생성할 수 있는 생성자에 대해서 알아보았습니다. 이제 객체를 구성하는 요소들을 거의 다 알았다고봐도 무방합니다.

 

따라서 다음편에서는, 직접 간단한 예제를 다뤄보면서 객체를 어떻게 생성하고, 객체에 어떻게 접근하고, 메서드는 어떻게 호출하고 등에 대해 알아보고, 기존까지 배웠던 개념들을 돌아보겠습니다. 그리고 아직 클래스나 객체에 대해 몇 가지 개념이 남았는데, 이 다음편에 이어서 그 개념들을 살펴보도록 하겠습니다. 감사합니다!!

'Language > ColorIt_Java' 카테고리의 다른 글

[컬러잇자바] #7 - 간단한 자바프로그램 만들어보기  (0) 2026.02.09
[컬러잇자바] #6. 왜 main 메서드를 사용할까?  (0) 2026.02.02
[컬러잇자바] #4. 왜 메서드를 사용할까?  (1) 2026.01.19
[컬러잇자바] #3. 왜 변수와 타입을 사용할까?  (1) 2026.01.12
[컬러잇 자바] #2. 왜 객체를 사용할까?  (1) 2026.01.05
'Language/ColorIt_Java' 카테고리의 다른 글
  • [컬러잇자바] #7 - 간단한 자바프로그램 만들어보기
  • [컬러잇자바] #6. 왜 main 메서드를 사용할까?
  • [컬러잇자바] #4. 왜 메서드를 사용할까?
  • [컬러잇자바] #3. 왜 변수와 타입을 사용할까?
컬러잇
컬러잇
개발을 합니다.
  • 컬러잇
    Color_It!
    컬러잇
  • 전체
    오늘
    어제
    • 분류 전체보기 (7)
      • Language (7)
        • ColorIt_Java (7)
      • CS (0)
      • 개인 프로젝트 (0)
      • 팀 프로젝트 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 디디디 개발블로그
  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
컬러잇
[컬러잇자바] #5. 왜 생성자를 사용할까?
상단으로

티스토리툴바