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