아마존 면접 준비/OOD

빌더패턴 1.

호호잉 2022. 10. 3. 15:13
체를 만드는 두가지 방법

사용자 정보를 위한 USER 클래스가 있다고 해보자.

회원 가입을 위해 USER 객체를 만드는 방법은?

public class User {
      private String email;

      private String password;

      private String name;

}

//첫번쨰 setter 메서드 사용

public class User {
      private String email;

      private String password;

      private String name;

      public void setEmail(String email) {
        this.email = email;

      }
 
 
      public void setPassword(String password) {
        this.password = password;

      }
      public void setName(String name) {
        this.name = name;

      }

      User user = new User();

      user.setEmail("test@gmail.com");

      user.setPassword("1234");
     
      user.setName("test");



}

//두번쨰 생성자를만들어서 진행

public User(String email, String password, String name){

  this.email = email;

  this.password = password;

  this.name = name;
}

User user = new User("test@gmail.com", "1234", "test")

다 단점이존재 Setter의 문제점.

첫번째 : 일관성에 문제가 존재함.

회원가입을위해 이름, 비번, email 이 필수임.

근데 이 user.setName 이라는 메서드까지 온전하게 실행되어야만 "객체가 완성이됨"

set name 이 실행되지않거나 하면. user가 완성되지않음. 일관성이 무너진 상태에 놓이게됨.

예를 들어 3개 메서드가 주석처리되면. 실행에는 문제가 없는데

컴파일에서 오률르 잡을수없음. db에서. 이것들을 필수로 정해놨을때

고객들이 회원가입할떄 오류 겪음. 일관성이 불안정한 상태.

자바빈 규약에 따르면 "getter, setter" 메서드의 접근자는 public 으로 선언 되어야한다. - >언제 어디서든 객체의 값에 접근과 변경이 가능하다.
-> 정보의 일관성을 지키기 힘들다.

일관성 지키는 방법중 하나-> private에 final 키워드 사용함.

이걸 사용하면 해당 필드의 값이 초기에 설정되고 나면 변경을 하지 못하도록 강제

-> 초기 생성 후에 값을 변경할 수 없는 불변 객체.

하지만 setter 사용하면-> setter는 언제 어디서든값을 변경함. -> final과 의미가 상충

final 과 setter 메소드를 동시에 사용하면 컴파일 오류가 발생함.

setter 메서드를 사용하면 불변 객체를 만들수 없다.


setter의 두번째, 단점 의도를 파악하기 힘듬.

만약에  비밀번호 변경 구문(Setter)

  user.setPassword("1234");
 
->값을 초기 설정 하기 위한것인지? 비밀번호 변경하기 위한것인지? 알수가없다.

이러한 비즈니스 로직을 메서드로 따로 작성하면 어떻게되지?

public void changePassword(String password){

  this.password = password;
}
1.필요한 비즈니스 로직에 대한 메서드만 있기 때문에-> 변경이 불필요한 필드의 변경을 막을수 있음

2.-> 비밀번호 변경구문
-> user.changePassword("1234");

user 클래스를 사용하는 입장에서도 메서드의 의미를 명확하게 파악하고 사용이 가능함.

setter의 문제점.-> 그래서 결론은? setter 메서드의 사용을 지양하자?




생성자

생성자를 사용하면 하나의 메서드를 통해서 객체의 생성과 값 설정ㅇ을 통해서
완성된 객체를 반환해서 일관성 지키기가 가능.

클래스에 매개변수가 많아진다면?


House class에

벽, 지붕, 문, 굴뚝, 창문, 차고

public user( 다떄려박음)

this.wall = wall; ...


String walls= "벽돌"

String roof = "기와"
.. 등등

House house = new House("test@gmail", "1234", "test", null)

생성자의 첫번쨰 문제는-> 생성자에 설정하지 않는 값들을 null로 채워서 사용

두번째 문제는 -> 변수를 어느 위치에 세팅을 해야하는지 알기가 어렵다.

생성자를 사용한다면? 집을 짓기가 어렵다

예를들면 벽과 지붕만있어도 집이라고 생각하는경우?

public User(wall, roof)
{
  this.wall = wall; 이런식으로


}

근데 이렇게 창문까지도 있ㅇ야되고. 생성자매서드가 점점 많아져 코드량 늘어남

집에 굴뚝대신 창문만 넣고싶을때.

집에 벽, 지붕, 문, 굴뚝을 생성하고 싶을떄

집에 벽 지 붕 문 창문으로 생성하고 싶을떄

네번쨰 문제는-> 이 두개의 메서드는 오버로딩 기본원칙에 어긋나 생성할 수가 없다.

'아마존 면접 준비 > OOD' 카테고리의 다른 글

Builder 연계-> 리스트객체 이해하.  (0) 2022.10.03
빌더 패턴 작성 및 사용방법  (2) 2022.10.03
OOD 공부 현명하게  (0) 2022.10.03
Puppy hotel?  (0) 2022.10.03
주차장 설계?  (0) 2022.10.03