11651번: 좌표 정렬하기 2

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

 

Language: Java

 

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
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int num = Integer.parseInt(br.readLine());
 
        int[][] intArrXY = new int[num][2];
 
        for (int i = 0; i < num; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
 
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
 
            intArrXY[i][0= a;
            intArrXY[i][1= b;
 
        }
 
        Arrays.sort(intArrXY, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[1!= o2[1] ? o1[1- o2[1] : o1[0- o2[0];
            }
        });
 
        for (int i = 0; i < num; i++) {
            bw.write(intArrXY[i][0+ " " + intArrXY[i][1+ "\n");
        }
 
        bw.flush();
        bw.close();
    }
 
}
 
 
 

🤔 해설

1. sort()

    - 이중 배열의 경우, 기존 sort 메서드를 통해 정렬할 수 없으므로 정렬 기준을 오버라이딩하여 이차원 배열 정렬

2. @Override

    - Comparator 클래스에서 compare 메서드 Override

    - 배열의 두번째 요소가 다르면 두번째 요소로 정렬, 같으면 첫 번째 요소로 정렬

    - 예시

        - 입력값: (3, 4), (1, 1), (1, -1)

        - intArr[0][0] = 3, intArr[0][1] = 4

        - intArr[1][0] = 1, intArr[1][1] = 1

        - intArr[2][0] = 1, intArr[2][1] = -1

        - intArr = {{3, 4}, {1, 1}, {1, -1}}

        - int[] o1 = {3, 4}, int[] o2 = {1, 1}

        - int[0] o1 = 3, int[0] o2 = 1

        - int[0] o1 - int[0] o2 : 0번째 요소를 기준으로 오름 차순으로 정렬

 

😮 이 외의 풀이

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.StringTokenizer;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int num = Integer.parseInt(br.readLine());
 
        int[][] intArrXY = new int[num][2];
 
        for (int i = 0; i < num; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
 
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
 
            intArrXY[i][0= a;
            intArrXY[i][1= b;
 
        }
 
        Arrays.sort(intArrXY, (arr1, arr2) -> {
            if (arr1[1== arr2[1]) {
                return arr1[0- arr2[0];
            } else {
                return arr1[1- arr2[1];
            }
        });
 
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < num; i++) {
            sb.append(intArrXY[i][0+ " " + intArrXY[i][1+ "\n");
        }
 
        bw.write(sb + "");
        bw.flush();
        bw.close();
    }
 
}
 
 
 

1. 람다식(익명 클래스)를 Comparator 클래스 대신 사용

2. StringBuffer 사용

 

⭐ 메서드 사용 방법을 자세히 알고 싶으면, Eclipse 기준 ctrl + method 클릭

1
2
3
4
5
6
7
8
9
10
11
    public static <T> void sort(T[] a, Comparator<super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null00);
        }
    }
 
 
 

- sort 사용 시, 첫 번째 인자가 T[]이므로 T는 int[]

 

 

 

🔗 소스 코드
HJ0216/TIL/BOJ

 

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

 

Language: Java

 

🚨 고민해보다 푸는 방법을 도저히 모르겠어서, 풀이를 찾아 봄

 

😮 찾아본 풀이

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
37
38
39
40
41
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int N = Integer.parseInt(br.readLine());
 
        int i = 0;
        for (i = 0; i < N; i++) {
            int num = i;
            int sum = 0;
 
            while (num != 0) {
                sum += num % 10;
                num /= 10;
            }
 
            if ((sum + i) == N) {
                bw.write(i + "");
                break;
            }
        }
 
        if (i == N) {
            bw.write("0");
        }
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

1. while 반복문

    - num: 생성자

    - sum: 생성자 각 자리의 합

  ⭐ sum을 구하기 위해 생성자 역할을 하는 i 이외에도 i와 동일한 값을 갖는 num 선언

2. if 조건문

    - 분해합이 입력된 수와 동일한 경우가 없을 때, i는 for문을 다 돌고, i==N일 때 마무리되므로 조건식을 다음과 같이 선언

 

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
37
38
39
40
41
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        String s = br.readLine();
        int N = Integer.parseInt(s);
 
        int i = 0;
        for (i = N - s.length() * 9; i < N; i++) {
            int num = i;
            int sum = 0;
 
            while (num != 0) {
                sum += num % 10;
                num /= 10;
            }
 
            if ((sum + i) == N) {
                bw.write(i + "");
                break;
            }
        }
 
        if (i == N) {
            bw.write("0");
        }
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

⭐ 생성자의 범위

    - 생성자 + 자리수의 합 == 입력값

    - 생성자 == 입력값 - 자리수의 합

    - 자리수의 합이 최대일 경우, 생성자는 최소

    - 만일 생성자 후보가 자리수 합이 최대일 때의 생성자보다 작다면 입력값을 만들 수 없음

 

🤔 추가

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
37
38
39
40
41
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        String s = br.readLine();
        int N = Integer.parseInt(s);
 
        int i = 1;
        for (i = N - s.length() * 9>=1 ? N - s.length() * 9 : 0; i < N; i++) {
            int num = i;
            int sum = 0;
 
            while (num != 0) {
                sum += num % 10;
                num /= 10;
            }
 
            if ((sum + i) == N) {
                bw.write(i + "");
                break;
            }
        }
 
        if (i == N) {
            bw.write("0");
        }
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

- 생성자는 자연수이므로 i의 최소값을 1로 변경

 

 

 

🔗 소스 코드
HJ0216/TIL/BOJ

 

📚 참고 자료

 

[백준] 2231번 : 분해합 - JAVA [자바]

www.acmicpc.net/problem/2231 2231번: 분해합 문제 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다

st-lab.tistory.com

 

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

 

Language: Java

 

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
37
38
39
40
41
42
43
44
45
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int T = Integer.parseInt(br.readLine());
 
        while (T-- > 0) {
            String s = br.readLine();
 
            Stack<Character> stack = new Stack<>();
            int i = 0;
            for (i = 0; i < s.length(); i++) {
                if (s.charAt(i) == '(') {
                    stack.push(s.charAt(i));
                } else {
                    if (stack.size() != 0) {
                        stack.pop();
                    } else {
                        break;
                    }
                }
            }
            if (i == s.length() && stack.size() == 0) {
                bw.write("YES\n");
            } else {
                bw.write("NO\n");
            }
        }
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

🤔 해설

1. 내부 if 조건문

    - 괄호의 시작이 '('여야 하므로, '(' 기준으로 push

2. 외부 if 조건문

    - stack이 완전히 비었을 때 뿐만 아니라, 전체 for을 순회해서 break가 있었는지도 함께 검사

 

⭐ push와 pop 순서가 중요해서 단순히 괄호의 개수를 구해서 여는 괄호==닫는 괄호로 계산하면 안됨

 

😮 이 외의 풀이

1. size() 대신 empty() 사용 가능

1
2
3
4
5
6
            if (i == s.length() && stack.empty()) {
                bw.write("YES\n");
            } else {
                bw.write("NO\n");
            }
 
 
 

 

2. 괄호의 개수를 counting

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
37
38
39
40
41
42
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int T = Integer.parseInt(br.readLine());
 
        while (T-- > 0) {
            String s = br.readLine();
 
            int num = 0;
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) == '(') {
                    num++;
                } else {
                    num--;
                if(num<0break;
                }
                
           }
 
            if (num == 0) {
                bw.write("YES\n");
            } else {
                bw.write("NO\n");
            }
        }
 
        bw.flush();
        bw.close();
 
    }
 
}
 
 
 

1. 내부 if 조건문

    - 닫는 괄호가 먼저 입력되어 -가 될 경우(=stack에서 더이상 pop 할 요소가 없는 경우) break를 통해서 NO 출력

    - num이 감소할 때만, -가 나타날 수 있으므로 break문도 else안에 입력

 

 

🔗 소스 코드
HJ0216/TIL/BOJ

 

 

10773번: 제로

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경

www.acmicpc.net

 

Language: Java

 

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
37
38
39
40
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int num = Integer.parseInt(br.readLine());
 
        Stack<Integer> stack = new Stack<>();
        while(num-->0) {
            int i = Integer.parseInt(br.readLine());
            if(i!=0) {
                stack.add(i);
            } else {
                stack.remove(stack.size()-1);
            }
        }
        
        br.close();
        
        int sum = 0;
        
        for(int i=0; i<stack.size(); i++) {
            sum += stack.get(i);
        }
        
        bw.write(sum+"");
        bw.flush();
        bw.close();
    }
 
}
 
 
 

🤔 해설

1. if 조건문

    - 0이 아닌 값이 입력될 때, stack remove 시, stack.size를 활용하여 가장 최근에 입력된 수부터 제거

    (0이 입력될 경우, 지울 수 있는 수가 있다고 보장되어있음)

 

😮 이 외의 풀이

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
37
38
39
40
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int num = Integer.parseInt(br.readLine());
 
        Stack<Integer> stack = new Stack<>();
        while (num-- > 0) {
            int i = Integer.parseInt(br.readLine());
            if (i != 0) {
                stack.push(i);
            } else {
                stack.pop();
            }
        }
 
        br.close();
 
        int sum = 0;
 
        for (int i : stack) {
            sum += i;
        }
 
        bw.write(sum + "");
        bw.flush();
        bw.close();
    }
 
}
 
 
 

1. Stack 내장 메서드 활용: push(), pop()

2. 향상된 for 반복문

 

 

 

🔗 소스 코드
HJ0216/TIL/BOJ

 

📚 참고 자료

 

[백준] 10773번 : 제로 - JAVA [자바]

www.acmicpc.net/problem/10773 10773번: 제로 첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는

st-lab.tistory.com

 

Design Pattern

개념

  • 특정 상황에서 공통적으로 발생하는 문제에 쓰이는 재사용 가능한 해결책
  • 장점
    • 소프트웨어의 구조를 파악하기 용이
    • 재사용을 통한 개발 시간 단축
    • 설계 변경 시, 비교적 원활한 조치 가능
  • 단점
    • 객체 지향 언어에서 사용할 경우, 객체 지향적 설계를 추가로 고려해야 함
    • 초기 투자 비용이 큼

종류

  • 생성 패턴
    • 객체 생성과 관련된 패턴
    • 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공
  • 구조 패턴
    • 프로그램 구조를 설계하는데 사용되는 패턴
    • 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
  • 행위 패턴
    • 객체나 클래스 사이의 알고리즘 또는 책임 분배에 관련된 패턴
    • 결합도를 최소화하는 것이 주 목적

대표적인 생성 패턴

  • Singleton Pattern
      • 단 하나의 객체를 생성하고 생성된 객체를 어디서든 참조할 수 있도록 하는 패턴
      • 클래스를 static으로 선언하는 것이 아닌, 동적으로 생성하고 heap 영역에서 GC로 관리되도록 하되, 단 하나의 객체를 생성
      • 예시
    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
    37
    38
    39
    40
    41
    42
    43
    44
    class StudentBuilder {
        private int id;
        private String name;
        private String grade;
        private String phoneNumber;
     
        public StudentBuilder id(int id) {
            this.id = id;
            return this;
        }
     
        public StudentBuilder name(String name) {
            this.name = name;
            return this;
        }
     
        public StudentBuilder grade(String grade) {
            this.grade = grade;
            return this;
        }
     
        public StudentBuilder phoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
            return this;
        }
     
        public Student build() {
            // Student 생성자 호출
            return new Student(id, name, grade, phoneNumber);
        }
    }
     
    public static void main(String[] args) {
     
        Student student = new StudentBuilder()
                    .id(2016120091)
                    .name("임꺽정")
                    .grade("Senior")
                    .phoneNumber("010-5555-5555")
                    .build();
     
        System.out.println(student);
    }
     
     
     
    • 사용 예시: DB Connection, Thread Pool
  • Builder Pattern
      • 인스턴스를 생성자를 통해 직접 생성하지 않고, 빌더라는 내부 클래스를 통해 간접적으로 생성하게 하는 패턴
      • 예시
    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
    37
    38
    39
    40
    41
    42
    43
    44
    class StudentBuilder {
        private int id;
        private String name;
        private String grade;
        private String phoneNumber;
     
        public StudentBuilder id(int id) {
            this.id = id;
            return this;
        }
     
        public StudentBuilder name(String name) {
            this.name = name;
            return this;
        }
     
        public StudentBuilder grade(String grade) {
            this.grade = grade;
            return this;
        }
     
        public StudentBuilder phoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
            return this;
        }
     
        public Student build() {
            // Student 생성자 호출
            return new Student(id, name, grade, phoneNumber);
        }
    }
     
    public static void main(String[] args) {
     
        Student student = new StudentBuilder()
                    .id(2016120091)
                    .name("임꺽정")
                    .grade("Senior")
                    .phoneNumber("010-5555-5555")
                    .build();
     
        System.out.println(student);
    }
     
     
     
  • Factory Method
    • 추상 클래스에는 객체를 생성하는 추상 메서드를 정의하고, 이를 하위 클래스에서 구현하여 원하는 타입의 객체를 생성
    • 의존성과 결합도를 낮출 수 있음
    • 예시
      • 슈퍼 클래스, AnimalFactory - 추상 메서드 createAnimal() 보유
      • 하위 클래스, (DogFactory, CatFactory) - createAnimal()을 오버라이드 ▶ Dog와 Cat 인스턴스 생성
  • Abstract Factory Method
    • 슈퍼 클래스에서 기본적인 알고리즘의 흐름을 정의하고, 하위 클래스에서 특정 단계를 구현하는 방법
    • 예시
      • 슈퍼 클래스, Algorithm
        • 추상 메서드 step1(), step2(), step3() ...
        • algorithm(): 추상 메서드 step1(), step2(), step3()로 구성된 메서드
      • 하위 클래스, (AlgorithmA, AlgorithmB)
        • step1(), step2(), step3()을 구현하여 algorithm()을 사용

대표적인 구조 패턴

  • Adapter Pattern
      • 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들을 함께 작동해주도록 변환 역할을 해주는 행동 패턴
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Adapter implements Target {
        // 호환성이 없어 직접 사용 불가능한 클래스
        Service adaptee;
     
        Adapter(Service adaptee) {
            this.adaptee = adaptee;
        }
     
        //Adapter method 호출 시, 기존 서비스인 adaptee medthod로 사용 가능
        public void method(int data) {
            adaptee.specificMethod(data);
        }
    }
     
     
     

대표적인 행위 패턴

  • Observer Pattern
    • 일대다 의존성을 가지며, 분산 이벤트 핸들링 시스템에 주로 사용
    • 한 객체의 상태가 변경되었을 때, 그 객체에 의존하는 다른 객체들에게 자동으로 알림을 보내고 갱신을 요청
  • Template Method Pattern
    • 여러 클래스에서 공통으로 사용하는 메서드를 템플릿화 하여 상위 클래스에서 정의하고, 하위 클래스마다 세부 동작 사항을 다르게 구현하는 패턴
    • 사용 예시: Abstract Map
  • Strategy Pattern
      • 비슷한 동작을 하지만 다르게 구현되어 있는 행위(전략)들을 공통의 인터페이스를 구현하는 각각의 클래스로 구현하고, 동적으로 바꿀 수 있도록 하는 패턴
      • 코드의 결합도를 낮춰 유지 보수성을 높일 수 있음
      • 예시
    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
    37
    38
    39
    40
    41
    // 전략 인터페이스 (Strategy Interface)
    interface Strategy {
        int execute(int a, int b);
    }
     
    // 전략 구현 클래스 (Concrete Strategies)
    class AddOperation implements Strategy {
        public int execute(int a, int b) {
            return a + b;
        }
    }
     
    // 컨텍스트 클래스 (Context)
    class Context {
        private Strategy strategy;
     
        // 전략 교체 메소드
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
     
        // 전략 실행 메소드
        public int executeStrategy(int a, int b) {
            return strategy.execute(a, b);
        }
    }
     
    // 사용 예시
    public class Main {
        public static void main(String[] args) {
            int a = 10, b = 5;
     
            // 전략 설정
            Strategy addStrategy = new AddOperation();
            Context context = new Context(addStrategy);
     
            // 전략 실행
            int result = context.executeStrategy(a, b);
        }
    }
     
     
     
  • Iterator Pattern
    • 일련의 데이터 집합에 대하여 순차적인 접근(순회)을 지원하는 패턴
    • 자바에서 제공하는 Iterator Interface는 ArrayList, TreeSet, HashMap 등 컬렉션 클래스의 요소들을 순회하는 데 사용

MVC Pattern

  • Model-View-Controller의 약자로 애플리케이션을 세 가지 역할로 구분한 개발 방법론
    • Model
      • 데이터 관리 및 비즈니스 로직을 처리하는 부분
      • DAO, DTO, Service 등
    • View
      • 비즈니스 로직의 처리 결과를 통해 유저 인터페이스가 표현되는 구간
      • html, jsp, thymeleaf 등의 화면 구성
    • Controller
      • 사용자의 요청을 처리하고 Model과 View를 중개하는 역할
  • 종류model1 * Model1: Controller 영역에 View 영역을 같이 구현하는 방식이며, 사용자의 요청을 JSP가 전부 처리 model2 * Model2: 웹브라우저 사용자의 요청을 서블릿이 받고 서블릿은 해당 요청으로 View로 보여줄 것인지 Model로 보낼 것인지를 판단하여 전송

객체 지향 설계 원칙: SOLID

  • SRP (Single Responsibility Principle) 단일 책임 원칙
    • 하나의 클래스는 하나의 책임만 가져야한다는 원칙
    • SRP를 잘 따르면 응집도(cohesion)는 높이고 결합도(coupling)은 낮출 수 있음
  • OCP (Open Closed Principle) 개방 폐쇄 원칙
    • 요구사항의 변경이 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야하며 쉽게 확장이 가능하여 재사용할 수 있어야 한다는 원칙
    • 추상화(Abstraction)와 다형성(Polymorphism)을 통해 실현할 수 있음
  • LSP (Liskov Substitution Principle) 리스코프 치환 원칙
    • 상속 관계에 있는 클래스들이 서로를 대체할 수 있어야 함
    • 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 대체해도 프로그램의 정확성을 보장해야 한다는 원칙
    • 다형성을 지원하기 위한 원칙
  • ISP (Interface Segregation Principle) 인터페이스 분리 원칙
    • 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다는 원칙
    • 인터페이스의 단일 책임을 강조
  • DIP (Dependency Inversion Principle) 의존 역전 원칙
    • 구체적인 구현 클래스에 의존하지 말고, 추상적인 인터페이스의 의존할 것을 강조

 

📚 참고 자료

https://gmlwjd9405.github.io/2018/07/06/design-pattern.htm
https://velog.io/@sunhwa508/GOF-%EB%8C%80%ED%91%9C%EC%A0%81%EC%9D%B8-10-%EA%B0%80%EC%A7%80-Design-patterns
https://github.com/GimunLee/tech-refrigerator/tree/master/Design%20Pattern
https://inpa.tistory.com/category/%EB%94%94%EC%9E%90%EC%9D%B8%20%ED%8C%A8%ED%84%B4/GOF?page=2
https://cocoon1787.tistory.com/733
https://flower0.tistory.com/416
https://velog.io/@falling_star3/Java-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84%EC%9D%98-5%EA%B0%80%EC%A7%80-%EC%9B%90%EC%B9%99-SOLID
https://dev-coco.tistory.com/163

'Computer > CS_Knowledge' 카테고리의 다른 글

[CS] Database  (0) 2023.07.28
[CS] Network  (0) 2023.07.12
[CS] Operating System  (0) 2023.07.12
[CS] Spring  (0) 2023.07.06
[CS] Java  (0) 2023.07.06