내가 자바를 처음 배울 때 가장 뜬구름처럼 다가오는 개념은 바로 생성자 였고, 자바를 배워본 많은 사람들이 아마 공감할 것이다
(...아니라고 느꼈다면 당신은 천재야...)
생성자랑 인스타 맞팔은 되어 있어
하지만 연락처는 모르는 사이라면...❓
오늘 생성자가 무엇인지 제대로 짚고 친해져보자❗
먼저 생성자를 처음 배울 때 구구단 마냥 튀어나오는 코드를 살펴보자
Car c1 = new Car(); // 클래스명 Car
나는 자바를 처음 배울 때, 아니 두번 세번 배울 때도 생성자가 어떤 놈인지 헷갈렸다
요오놈이 새로운 객체, 즉 인스턴스를 만들어 낸다는 뜻을 아는 정도였달까?
결론부터 말하자면 생성자는 우변 new Car();
에 있는 Car()
다. 여기서 한 가지 의문이 생길 수 있다. '생성자'는 이름 값을 하려면 마치 인스턴스를 '생성'하는 역할을 해야 할 것만 같다. 그러나 실제로 새로운 인스턴스를 생성하는 건 생성자가 아닌 바로 new 연산자다.
연산자 new는 heap 영역에 인스턴스를 생성한다.
또 new는 새로 생성된 인스턴스의 주소를 참조 변수 c1에 저장해준다.
좌변 Car c1
도 한번 살펴보면 c1
은 새로 만들어진 인스턴스를 참조하는 참조 변수 고, Car
는 참조 타입 이다. c1
이라는 변수 가 Car
라는 객체(인스턴스) 를 대상으로 가리킨다는 의미로 알면 되겠다.
생성자는 인스턴스가 생성될 때 호출되는 ⭐메소드⭐ 다.
다시 한번, 생성자는 메에에에에소오오오드드드드 라는 사실을 꼭 기억하자 !!
메소드의 정의가 헷갈린다면 정의를 한번 훑고 올 것을 추천한다
연산자 new가 인스턴스를 생성하면, 생성자라는 메소드가 실행된다. 새로운 인스턴스가 만들어질 때마다 호출되기 때문에 생성자는 인스턴스를 초기화 하는 역할을 한다고 볼 수 있다.
한편 생성자는
...는 특징을 가지고 있어 아래와 같이 선언 해준다. 생성자와 일반 메소드의 선언 방식을 꼭 비교해보자❗
public class Car {
public Car() {...} //생성자 선언
// [접근 제한자] [생성자명(=클래스명)] {...}
}
public class CarMain {
public static void main(String[] args) {...} //메소드 선언
// [접근 제한자] [static] [리턴 타입] [메소드명](매개변수) {...}
}
여기서 생성자가 선언되는 위치 가 중요한데, 생성자는 Car 클래스 안
에 선언되어 있다. '클래스 만들 때 생성자를 짠 기억은 없는데...?' 갸우뚱 했다면 정말로 못 본 게 맞다. 클래스에 생성자를 따로 적지 않아도 프로그램은 돌아가는데, 이는 컴파일러가 자동으로 기본 생성자를 만들어 주기 때문이다. 만약 생성자를 하나라도 만든다면 기본 생성자는 추가되지 않는다.
기본 생성자, 즉 default 생성자는 매개 변수가 0개인 생성자를 말한다.
위 예제의 연장선으로 수정된 Car 클래스
를 한번 살펴보자
public class Car {
private String name;
//첫 번째 생성자
public Car() {
System.out.println("car");
}
//인스턴스에 이름을 부여할 수 있는 두 번째 생성자
public Car(String name) {
this.name = name;
}
}
두 public Car (){...}
는 모두 생성자다. 근데 두 생성자는 차이가 있다. 한 생성자만 입력 값을 받고 있다. 만약 Car c1 = new Car();
에서 생성자 Car()
가
public Car(String name) {...}
는 name을 전달받으면 객체의 필드 값이 지정되므로 인스턴스에게 이름을 붙여주는 역할을 한다고 볼 수 있다.이처럼 하나의 클래스 안에서 이름이 같은 생성자, 즉 메소드를 여러 개 호출하는 것을 메소드를 오버로딩 이라고 하는데 다른 개념들과 연계된 내용은 다음에 다뤄보도록 하겠다.
자바 문법은 등장하는 용어들끼리 뉘양스도 비슷한데 개념까지 비슷해 공부하다 애를 먹기 씹상이다. 그래서 새로운 개념을 접할 때마다 이전에 배운 개념이나 용어들은 잘 숙지 되어 있는지 항상 되새겨 보는 것이 중요한 거 같다 !!
비록 냥이의 코딩 속도를 따라잡으려면 멀었지만 다들 화이팅해보자 🔥🔥
훌륭한 글 감사드립니다.