JAVA) 자바 생성자(Constructor) 이해하기 및 정리
생성자를 처음 배웠을때는 잘 이해하기 힘들었지만 계속 찾아보니 이해가되며, 쉬운 개념임을 알았다.
이번 블로그에서는 내가 이해한 생성자를 비유해가며 적어보려고 한다.
1. 생성자 정의
지식백과에 나오는 생성자는 이렇게 적혀있다.
객체 지향 프로그래밍(OOP)에서 쓰이는 객체 초기화 함수.
객체의 생성 시에만 호출되어 메모리 생성과 동시에 객체의 데이터를 초기화하는 역할을 한다.
자바 파일을 실행하면 클래스가 메모리에 로딩되고, 클래스 안의 생성자가 호출되어 초기화를 진행한다.
초기화라는게 뭘까?
초기화라는것은 처음·기본값도 맞지만. 자바에서는 값을 넣는것을 초기화라고 한다.
자바에서 배열을 만들때
int[] arr; 을 선언한다고 하고,
arr = {1, 2, 3} 이렇게 값을 넣는것을 초기화라고 한다.
=> 즉, 객체를 생성할때 값을 넣어주는 역할을 하는게 "생성자"라는 것이다.
근데, 의문점이 생긴다. 값을 넣는거는 메소드로도 얼마든지 할 수 있는데, 왜 굳이 생성자를..?
단지 객체 생성시 필수로 실행된다는것 외에는 별다를게 없는것 같은데.. 라고 생각할 수 있다.
이 의문점은 밑에 비유로 설명해보려 한다.
클래스가 레시피라면, 생성자는 재료담당자이다.
이해한 것을 먹을거로 비유해서 설명해보겠다😅
김치찌개를 만드는 레시피가 있다 = 클래스
김치찌개를 만드는데는 여러 재료가 필요해서 그 재료들을 구해와야한다.
재료는 다 중요하긴하지만 제일 중요한 재료는 "김치". 김치가 빠지면 김치찌개가 될 수 없다.
따라서 제일 중요한 쟤료는 재료 담당자가 미리 챙겨야한다. = 생성자
이렇게 클래스 객체를 생성하는데 꼭 있어야 하는 재료를 받는 역할을 생성자가 하는것이다.
객체 생성시 = 김치찌개를 만들기시작할때
생성자가 초기화를 진행 = 재료담당자가 김치를 필수로 챙기기
이제 대충 이해가 됐다고 치고 아래 코드로 직접 보자.
2. 생성자의 형태
▷ 생성자 이름은 클래스 이름과 같다.
▷ 클래스에 생성자는 최소 1개 이상 있어야 한다.
▷ new 연산자로 인스턴스화 할때 생성된다.
생성자가 최소 1개 있어야 하는데 클래스를 만들면서 생성자를 본적이 없을것이다.
사실은 있는데 보이지 않는것 뿐이다.
1개 이상은 무조건 필수이기에 우리가 직접 생성자를 적지 않으면 자바가 알아서 생성해준다.
기본 생성자의 형태는 다음과 같다
[접근제한자] 클래스명( ) { }
사실은 클래스마다 이 생성자가 숨어있고,
우리가 생성자를 직접 지정하면 기본 생성자는 자동으로 생성되지 않는다.
3. 생성자 직접 생성
class Kimchizzigea {
// 레시피: 김치찌개에 필요한 재료들 선언
String kimchi;
String dubu;
String pa;
String gogi;
// 생성자
public Kimchizzigea(String kimchi) {
this.kimchi = kimchi;
}
// 메서드
public void MakeZZigea(String ki, String d, String p, String g) {
System.out.println(ki + d + p + g + "재료들로 찌개를 만든다");
}
}
클래스를 인스턴스화 해보면
다음과 같이 첫번째 kz1에는 빨간 밑줄이 뜨면서 에러표시가 뜬다.
재료담당자인 생성자를 보면 Kimchizzigea(String kimchi)라고 김치를 필수로 챙기라고 했는데
kz1은 인스턴스를 생성할때 괄호( )안에 아무것도 넣지 않았기 때문이다.
이렇게 오류가 뜨게 하면서 필수 재료를 챙길 수 있도록 하는것이다.
=> 생성자는 객체 생성시 필수로 필요한 값을 초기화하는 메서드.
4. 생성자 오버라이드
오버라이드는 간단하게 말해서 같은 이름의 메서드를 여러개 만드는것이다.
필수로 받아야하는 값이 상황에 따라서 바뀔때 사용한다.
class Kimchizzigea {
String kimchi;
String dubu;
String pa;
String gogi;
public Kimchizzigea(String kimchi) {
this.kimchi = kimchi;
}
public Kimchizzigea(String kimchi, String gogi) {
this.kimchi = kimchi;
this.gogi = gogi;
}
....
}
5. 상속과 생성자, super()
super() : 부모의 생성자를 호출한다.
B가 A를 상속한다고 하면
B가 자신의 생성자를 실행하기 전에 먼저 부모의 기본 생성자를 실행하도록 되어있다.
따라서 부모에게 기본생성자가 없으면 에러가 발생한다.
이때 처리하는 방법 2가지
1) 부모 생성자에 기본 생성자를 추가한다.
2) super()로 부모의 생성자를 호출.
자식은 무조건 부모의 생성자를 불러야 하는게 법칙이기에
super()로 부모의 생성자를 부른다.
6. 생성자 this
this는 두 종류가 있다.
하나는 멤버변수를 가리키는 this, 또하나는 자신의 생성자를 가리키는 this
한 클래스의 생성자 내에서 다른 생성자를 this 호출하여 코드의 중복을 제거한다.
주의사항! 생성자this는 생성자의 제일 첫 문장에 적어야 한다.
보면 첫번째 생성자에 this( )는 생성자 this이고, this.kimchi는 멤버변수this이다.
첫번째 생성자에서 두번째 생성자를 부르는 코드.