
Person 객체를 new해서 생성하면, heap에 만들어진다.
메인에 Person p1 = new Person(); 으로 생성했는데, 문제는 Person 클래스 안에서
이 객체를 가리키려면 p1이라고 부를 수 없다. 왜냐 p1이라고 부를 수 있는건 main 에서 뿐이라서!
Person 클래스 안에서 Person객체의 name같은 걸 가리키고 싶을때는
this를 사용한다. 그 부모의 요소를 가리키고 싶을때는 super를 사용한다.
Builder
package ex09;
public class Person {
// 클래스자료형 (객체가 아닌 데이터 덩어리. 상태와 행위 신경쓰지 말기)
// 데이터베이스의 테이블(엔티티)같은거
// VO(Value Object)같은거
// 엔티티를 만들때는 래퍼클래스(wrapper class)를 써라 (int -> Integer)
// 이렇게 래퍼클래스로 설정해주면
// 값이 없을때 0 이렇게 뜨지 않고 null 이렇게 뜬다. (값이 없음을 알 수 있음)
private Integer id;
private String name;
private Integer age;
private String email;
private Person(){}
public static Person builder(){
return new Person();
}
public Person id(Integer id){ // void 타입이면 return을 안하니 그냥 setter
this.id = id;
return this; // setter와 비슷하네. this가 heap. heap의 자기자신을 부를때 this로 부른다.
}
public Person name(String name){
this.name = name;
return this;
}
public Person age(Integer age){
this.age = age;
return this;
}
public Person email(String email){
this.email = email;
return this;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public String getEmail() {
return email;
}
}
heap의 자기자신을 부를때 this를 사용한다.
package ex09;
public class App {
public static void main(String[] args) {
// 생성자로 넣으면 실수를 하기 좋다.
// 더 좋은건 builder 패턴
// 이제 배울때 잘 이해할 수 있어야 한다 이해이해이해
// 1. 내가 넣고 싶은 것만 넣을 수 있다. (오버로딩 안해도 ok)
// 2. 순서가 상관없다
// 3. 실수할 일이 없어진다.
Person p1 = Person.builder().id(1).email("hgd@gmail.com"); // builder로 인스턴스 생성
System.out.println(p1.getName());
}
}
Person에 builder 패턴을 적용해주었다. (롬복 사용안하고 직접 만들어줌)
App에서 builder를 사용하면 필요한 값만 넣을 수 있게 된다.
기존에 생성자를 이용해서 매개변수로 값을 넣는방법은 좀 불편하고, 실수할 위험도 있는데
builder를 사용해서 넣어주면 오버로딩도 안해도 되고, 순서도 상관없이 넣으면 되고,
실수 할 일도 없어진다. ( age와 id 가 같은 int 인데 생성자로 넣으면 값을 실수로 바꿔서 넣어도 에러가 안나니까 실수할 수 있다.)
Share article