객체를 생성하는 시점에 어떤 작업을 하고싶다면 생성자를 이용하면 된다.
생성자가 왜 필요한가?
객체를 생성하고 나면 변수에 초기값을 설정하게 된다.
package construct;
public class MethodInitMain1 {
public static void main(String[] args) {
MemberInit member1 = new MemberInit();
member1.name = "user1";
member1.age = 15;
member1.grade = 90;
MemberInit member2 = new MemberInit();
member2.name = "user2";
member2.age = 16;
member2.grade = 80;
MemberInit[] members = {member1, member2};
for (MemberInit s : members) {
System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
}
}
}
이 코드에는 회원의 초기값을 설정하는 부분이 계속 반복된다. 메서드를 사용해서 반복을 제거해봤다.
package construct;
public class MethodInitMain3 {
public static void main(String[] args) {
MemberInit member1 = new MemberInit();
member1.initMember("user1", 15, 90);
MemberInit member2 = new MemberInit();
member2.initMember("user2", 16, 80);
MemberInit[] members = {member1, member2};
for (MemberInit s : members) {
System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
}
}
}
Member에 초기값 설정을 하는 메서드를 추가해 코드 중복을 줄였다.
여기까지는 이전에 했던 내용을 복습하는 느낌이다.
생성자 도입
위 코드에서는 객체에 초기값을 설정해야하기 때문에 initMember( ) 메서드를 매번 만들어야 한다.
생성자를 사용하면 객체를 생성하자마자 즉시 필요한 기능을 좀 더 편리하게 수행할 수 있다.
package construct;
public class MemberConstruct {
String name;
int age;
int grade;
//추가
MemberConstruct(String name, int age) {
this(name, age, 50); //변경
}
MemberConstruct(String name, int age, int grade) {
System.out.println("생성자 호출 name=" + name + ",age=" + age + ",grade=" + grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
생성자를 생성한 코드이다.
생성자는 메서드와 비슷한 모습을 하고있는데, 조금 다른 특징이 있다.
1. 생성자 이름은 클래스 이름과 같아야 한다.
2. 생성자는 반환타입이 없다.
생성자는 인스턴스를 생성하고 난 후 즉시 호출된다.
MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
new 다음 생성자의 이름과 매개변수에 맞춰 전달하면 된다.
참고로 이전에 인스턴스를 생성했을 때도 위와 비슷한 형태로 코드가 작성되었는데,
new (); 처럼 괄호가 비어있는 상태에서는 우리가 data class에 생성자를 만들지 않았을 땐 자바가 기본 생성자를 자동으로 만들어준다.
반대로 생성자를 만들었을 때엔 기본 생성자가 만들어지지 않으므로 별도로 개발자가 기본 생성자를 만들어줘야한다.
생성자의 장점
생성자를 만들면 이 값을 매개변수와 맞춰 필수로 입력해야한다. 그렇지 않으면 컴파일에러가 나기 때문에 실행할 수 없다.
직접 정의한 생성자를 반드시 호출하자! 컴파일에러는 좋은 에러이다~
장점 부분은 이해가 되었으므로 생략하겠다.
생성자 - 오버로딩, this
생성자도 메서드 오버로딩처럼 사용할 수 있다.
package construct.ex;
public class Book {
String title; //제목
String author; //저자
int page; //페이지 수
//코드 완성
Book() {
this("", "", 0);
}
Book(String title, String author) {
this(title, author, 0);
}
Book(String title, String author, int page) {
this.title = title;
this.author = author;
this.page = page;
}
void displayInfo() {
System.out.println("제목: " + title + ", 저자: " +author+ ", 페이지: " + page);
}
}
위 코드에 this(title, author, 0) 부분은 this( ) 라는 기능을 사용하면 생성자 내부에서 자신의 생성자를 호출할 수 있다.
this는 인스턴스 자신의 참조값을 가리킨다.
*참고로 this( ) 는 생성자 코드 첫 줄에서만 사용이 가능하다.
package construct.ex;
public class BookMain {
public static void main(String[] args) {
// 기본 생성자 사용
Book book1 = new Book();
book1.displayInfo();
// title과 author만을 매개변수로 받는 생성자
Book book2 = new Book("Hello Java", "Seo");
book2.displayInfo();
// 모든 필드를 매개변수로 받는 생성자
Book book3 = new Book("JPA 프로그래밍", "kim", 700);
book3.displayInfo();
}
}
실행 결과
제목: , 저자: , 페이지: 0
제목: Hello Java, 저자: Seo, 페이지: 0
제목: JPA 프로그래밍, 저자: kim, 페이지: 700
한줄 요약: 생성자는 객체 생성 직후 객체를 초기화 하기 위한 특별한 메서드로 생각할 수 있다.
밤낮을 바꾸게 되어서 그런가 오늘 시간이 굉장히 널널했는데 공부에 집중하기 힘들었다.
내일부턴 좀 나아질 것 같으니 내일 좀 더 집중해서 해봐야겠다ㅏㅏ..
인스타 유튜브 등등,, 도파민 중독에서 벗어나고자 전부 삭제하고 웹도 차단시켰다.
아무도 나를 막을 수 없으셈