5월, 2018의 게시물 표시

[JAVA / Design Pattern] 생성자 인자가 많을 때는 Builder 패턴을 적용해보자

이미지
정적 팩터리나 생성자는 같은 문제를 갖고 있다. 선택적 인자가 많은 상황에 잘 적응하지 못한다는 것이다. 포장 판매되는 음식에 붙어있는 영양 성분표를 나타내는 클래스로 예를 들어보면, 이 성분표에 반드시 포함되어야 하는 항목은 몇 가지 되지 않는다. 총 제공량(serving size), 1회 제공량(servings per container),  1회 제공량당 칼로리(calories per servings) 등이 그런 항목이다. 그러나 선택적인 항목은 무려 20개가 넘는다.  총 지방 함량(total fat), 포화 지방 함량(saturated fat), 트랜스 지방 함량(trans fat)  콜레스테롤 함량(cholesterol) 등이 그런 항목이다. 보통 프로그래머들은 이런 상황에 점층적 생성자 패턴을 적용한다. 필수 인자만 받는 생성자를 하나 정의하고, 선택적 인자를 하나 받는 생성자를 추가하고, 거기에 두 개의 선택적 인자를 받는 생성자를 추가하는 식으로, 생성자들을 쌓아 올리듯 추가하는 것이다. 결국 모든 선택적 인자를 다 받는 생성자를 추가하면 정의는 끝나게 된다. 첫번 째 방법은 점층적 생성자 패턴이다. 실제코드가 어떻게 작성되는지 살펴보자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 public   class  NutritionFacts {      private   final   int  servingSize;  //필수 인자       private   final   int  servings;  //필수 인자           private   final   int  calories;  //선택 인자     

백준 2839

설탕 배달   성공 한국어     시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율 1 초 128 MB 49148 12194 9979 27.295% 문제 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다. 상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다. 상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000) 출력 상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다. 예제 입력 1  복사 18 예제 출력 1  복사 4 예제 입력 2  복사 4 예제 출력 2  복사 -1 예제 입력 3  복사 6 예제 출력 3  복사 2 예제 입력 4  복사 9 예제 출력 4  복사 3 예제 입력 5  복사 11 예제 출력 5  복사 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

[JAVA / Design Pattern] 정적 팩토리 메서드 이름 짓기

정적 팩토리 메서드 이름 짓기 정적 팩토리 메서드의 단점 중 하나는 생성자는 다른 메서드와 뚜렷이 구분이 되지만, 정적 팩토리 메서드는 구분이 되지 않다는 점이다. 그래서 정적 팩토리 메서드라는 걸 알려주기위해서 이름을 잘 지어야 하는데, 널리 알려진 이름을 알아볼 것이다. - valueOf : 단순하게 말하자면, 인자로 주어진 값과 같은 값을 갖는 객체를 반환한다는 뜻이다. 따라서 이런 정적 팩터리 메서드는 형변환 메서드이다. - of : ValueOf를 더 간단하게 쓴 것이다. EnumSet 덕분에 인기를 모은 이름이다. - getInstance : 인자에 기술된 객체를 반환하지만, 인자와 같은 값을 갖지 않을 수 있다. 싱글톤(singleton) 패턴을 따를 경우, 이 메서드는 인자 없이 항상 같은 객체를 반환한다. - newInstance : getInstance와 같지만 호출할 때마다 다른 객체를 반환한다. - getType : getInstance와 같지만 반환될 객체의 클래스와 다른 다른 클래스에 팩터리 메서드가 있을 때  사용한다. Type은 팩터리 메서드가 반환할 객체의 자료형이다. - newType : newInstance와 같지만, 반환될 객체의 클래스와 다른 클래스에 팩터리 메서드가 있을 때 사 용한다. Type은 팩터리 메서드가 반환할 객체의 자료형 이다.

[JAVA / Design Pattern] 생성자 대신 사용하는 정적 팩토리 메서드

이미지
클래스는 기본적으로 객체를 생성할 때, 자동적으로 생성자를 호출하게 되어있다. 예를 들어 Person p = new Person() 에서 new는 객체를 동적할당 시키고, Person()은 매개변수가 없는 생성자 이다. 생성자는 여러개 만들 수 있다. 하지만 매개변수의 갯수는 달라야 한다. 이런것을 오버로딩(Overloading) 이라고 한다. 생성자는 클래스의 이름과 똑같아야 되므로 항상 클래스이름() 이다. 그래서 사용자가 생성자를 호출할 때 이 생성자가 무슨동작을 하는지 알 수 없다. 그래서 나온 것이 정적 팩토리 메서드인데, 정적 팩토리 메서드를 사용함으로써 생성자에게 이름을 지어줄 수 있는 기타 등등으로 사용한다. 한번 알아보자. 1. 생성자와는 달리 정적 팩터리 메서드에는 이름이 있다. 위에서 얘기했듯이 생성자에게 이름을 지어줄 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public   class  Person {      private  Person() {          }           public   static   class  Programmer {      private  Programmer() {                      }     }           public   static  Programmer getProgrammer() {          return   new  Programmer();     } } Colored by Color Scripter cs 1 2 3 4 5 6 7 8 9 public   class  StaticFactoryClass {      public   static   void  main( String []