1. 정의
- 생성자는 new 연산자와 같이 사용되어, 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당
- 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용됨
- new 연산자에 의해 생성자가 성공적으로 실행되면 힙(Heap) 영역에 객체가 생성되고 객체의 주소가 리턴 됨
2. 기본 생성자
- 모든 클래스는 생성자가 반드시 존재하며, 하나 이상을 가질 수 있다.
3. 매개변수가 있는 생성자
- 생성자는 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일해야함
- 생성자도 메소드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아 인스턴스의 초기화에 사용할 수 있다.
- 인스턴스마다 각기 다른 값으로 초기화되어야하는 경우가 많기 때문에 매개변수를 사용한 초기화는 매우 유용
- this키워드 사용 : this는 객체 자기 자신의 참조 주소값을 가지고 있다. this를 통해 필드와 동일한 이름을 갖는 매개변수 사용 가능
4. 생성자 오버로딩
- 외부의 다양한 데이터를 이용해 객체를 초기화하려면 생성자도 다양화될 필요가 있다.
- 생성자 오버로딩을 통해 매개변수를 달리하여 생성자를 여러 개 선언하여 다양화할 수 있다.
- 생성자가 오버로딩되었을 경우, new 연산자로 생성자를 호출할 때 제공되는 매개 값의 타입과 수에 의해 호출될 생성자가 결정됨
5. 생성자에서 다른 생성자 호출
- 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드 발생
- 매개변수의 수만 달리하고 필드 초기화 내용이 비슷한 생성자에서 이러한 현상을 많이 볼 수 있다.
- 필드 초기화 내용은 한 생성자에서만 집중적으로 작성하고, 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선
- 생성자에서 다른 생성자를 호출할 때에는 this() 코드를 사용
- this() 호출은 반드시 생성자의 첫 줄에서만 호출이 가능
6. 생성자를 이용한 인스턴스 복사
-
현재 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스를 하나 더 만들고자 할 때 생성자를 이용할 수 있다.
-
두 인스턴스가 같은 상태를 갖는다는 것은 두 인스턴스의 모든 인스턴스 변수가 동일한 값을 갖고 있다는 것을 뜻함
-
인스턴스 c2는 c1을 복사하여 생성된 것이므로 서로 같은 상태를 갖지만, 서로 독립적으로 메모리 공간에 존재하는 별도의 인스턴스이므로 c1의 값들이 변경되어도 c2는 영향을 받지 않음
7. super와 부모생성자
부모 생성자
- class가 인스턴스화 될때 생성자가 실행되면서 객체의 초기화를 함.
- 그 때 자신의 생성자만 실행이 되는것이 아니고, 부모의 생성자부터 실행됨
- new 연산자로 Bus객체를 생성하면, Bus객체가 메모리에 올라갈때 부모인 Car도 함께 메모리에 올라간다.
- 생성자가 호출될 때 자동으로 생성자가 호출되면서 부모객체를 초기화 하게 됨
- 생성자는 객체를 초기화 하는 일을함
super
- 자신을 가리키는 키워드가 this라면, 부모를 가리키는 키워드는 super
- super()는 부모의 생성자를 의미
- 부모의 생성자를 임의로 호출하지 않으면, 부모 class의 기본생성자가 자동으로 호출
- super 키워드는 자식에서 부모의 메소드나 필드를 사용할 때도 사용
8. 생성자는 어떨 때 쓰이는가 ?
- 생성자는 객체를 생성하자 마자 값을 지니고 있도록 하거나, 어떤 메소드가 바로 작동되도록 할 때 사용
- 또는, 객체가 생성되면 보통 그 클래스가 가지고 있는 어떤 인스턴스 변수에 객체를 생성해 참조 시켜두는 목적으로도 사용
예시 ~~
참조 : https://digiconfactory.tistory.com/entry/%EC%9E%90%EB%B0%94-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-8-2-%EC%83%81%EC%86%8D-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%83%9D%EC%84%B1%EC%9E%90-super-%ED%82%A4%EC%9B%8C%EB%93%9C | 자바 튜토리얼 (8-2) 상속 클래스 생성자, super 키워드, 클래스 형변환 | 코딩각
참조 : 1. https://programmer-seva.tistory.com/79 | 세바의 코딩 교실 2. https://programmers.co.kr/learn/courses/5/lessons/192 3. [JAVA] Constructor(생성자) 와 super(); | https://medium.com/@kimddub/java-constructor-%EC%83%9D%EC%84%B1%EC%9E%90-%EC%99%80-super-58e6cbd7e757 | Subin Kim