에이콘 아카데미 JAVA 복습 2주차 정리 -2
1. 생성자와 생성자 오버로드
생성자란 객체가 생성될때 실행되는 구문입니다.
왜 생성자가 필요할까요?
저는 사실 초기화에 대한 잘못된 생각을 가지고 있었습니다.
변수 초기화의 의미는 변수에 초기값을 대입해주는 의미입니다.
대입해주지 않으면 자료형에 맞춰서 기본값을 세팅해줍니다.
객체 초기화의 의미는 객체 속성에 초기값을 대입하는 의미입니다.
사실 오해를 불러일으킬만한 요소는 객체를 초기화한 적이 없는데 자바에서는 객체의 속성을 모두 0 (참조 변수 일 경우에는 NULL)로 초기화해주는 함수를 가지고 있습니다. 다음 사진을 보면 이해가 됩니다.

즉 kor이라는 속성에 초기값을 입력해주지 않았는데 자동적으로 0이라는 값이 출력됩니다.
그럼 모든 변수는 메모리에 할당될 때 무조건 0 , null로 설정되는 것은 아닐까??라는 생각을 했었습니다.
하지만 실제로는 그렇지 않습니다.
예시를 들어보면

이렇게 오류가 생성됩니다.
처음에 객체를 출력하도록 했을 땐 누군가가 객체의 속성을 0으로 초기화를 해주었기 때문입니다.
그 누군가가 바로 생성자입니다.
사실 우리는 객체를 생성할 때 Exam exam = new Exam();이라는 소괄호를 사용했는데 이 함수가 바로 초기화를 시켜주는 디폴트 생성자입니다. 이 함수는 특이하게 이름이 존재하지 않습니다. 이름으로 호출할 수없고 오로지 객체를 생성할 때만 호출할 수 있습니다.
그렇다면 0이아닌 우리가 직접 생성자를 이용해서 초기값을 대입해 줄 수 도있습니다.
이런식으로 말이죠

이렇게 초기값을 정해주게되면 모든 Exam 객체는 초기값을 3으로 가지게됩니다.
그렇다면 객체를 생성할때마다 다른 값으로 초기화 해주는 방법은 없을까요 ?
당연히 있는데 그것이바로 오버로드입니다. 일반적인 함수도 오버로드가 가능하기때문에 함수인 생성자도 매개변수를 가지는 오버로드 생성자를 추가할 수 있습니다

이렇게 매개변수를 가진 생성자를 추가하면 Exam형식의 객체를 추가할때 매개변수값을 입력함으로써 초기값을 설정해줄 수 있습니다.
생성자를 오버로드 하게되면 동일한 코드가 중복되는데 코드를 하나로 집중화를 해야합니다.
그렇지않으면 수정을 하게될때 반복적으로 수정해야하는 불편함을 가질 수 있습니다.
오버로드 함수의 중복된 코드를 하나로 집중화하는 방법은 매개변수가 가장많은 오버로드 함수를 하나만 구현한뒤
나머지 함수는 그함수를 재호출하게 하도록 하는것입니다.

이렇게 기본값을 가지고 호출할때에는 매개변수를 전달해주지않고 생성하고 만약 초기값을 바꾸고 싶을때에는 매개변수로 초기값을 입력해주는 식으로 사용하면 됩니다 코드의 중복이 삭제되었습니다. 생성자를 사용하는 객체의 키워드인 this를 사용하여 매개변수3개를 가진 생성자를 재호출해서 코드중복을 줄였습니다.
주의할점은 생성자가 하나라도 만들어줬다면 컴파일러는 디폴드생성자를 추가적으로 만들어주지 않기때문에 오버로드를 할때 디폴트 생성자를 우리가 추가해줘야한다는 것입니다. 그렇지 않으면 객체를 생성할때 디폴트 생성자를 호출할 수 없습니다.