J.Y.S
¿ whats my interest ?
J.Y.S
전체 방문자
오늘
어제
  • 분류 전체보기 (59)
    • 트러블슈팅 기록 (7)
    • Java&Kotlin (5)
    • Server (22)
    • 데이터 엔지니어링 (3)
    • Architecture& Design Patter.. (1)
    • Daily (11)
    • 알고리즘 공부 (9)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
J.Y.S

¿ whats my interest ?

Daily

코테 풀다가 SRP 원칙에 맞게 함수를 바꿔봄.

2022. 1. 25. 22:00

코테 대비용 문제를 풀면서 srp 원칙에 맞게 함수명에 맞는 작업만 하도록 코드를 바꿔보았다.

 

코딩테스트 연습 - 소수 만들기

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때

programmers.co.kr

기존 방식:
문제를 풀 때 makeCombi 라는 함수에서

  1. 소수를 만들기 위한 3개의 숫자를 뽑고,
  2. 뽑은 후에는 소수인지 확인
  3. 소수인 경우 1을 리턴
    하도록 구현했었다.

이는 객체지향 5원칙 중 단일 책임 원칙에 위배된다.
단일 책임 원칙이 지겨지기 위해서는 클래스는 단 한개의 책임을 가져야한다.

문제 푸는 데에는 어떻게 하든 정답이지만.. 바꾼 결과:

import java.util.*;

class Combination {
    int[] nums;

    public Combination(int[] nums) {
        this.nums = nums;
    }

    void makeCombi(List<Integer> combi, int lv, int idx, List< List<Integer> > combinations) {
        int ret = 0;
        if (idx + (3-lv) > nums.length) {
            return;
        }
        if (lv == 3) {
            combinations.add(combi);
            return;
        }
        List<Integer> newCombi = new ArrayList<>(combi);
        newCombi.add(nums[idx]);
        makeCombi(newCombi, lv+1, idx+1, combinations);

        makeCombi(combi, lv, idx+1, combinations);
    }
}
class Solution {
    int[] nums;
    boolean isPrime(int num) {
        boolean ret = true;
        int number = num/2;
        for (int i=2; i <= number; i++) {
            if (num % i == 0) {
                ret = false;
                break;
            }
        }
        return ret;
    }

    public int solution(int[] nums) {
        int answer = 0;
        this.nums = nums;

        List< List<Integer> > combis = new ArrayList<>();
        new Combination(nums).makeCombi(new ArrayList<>(), 0, 0, combis);
        int list_size = combis.size();
        for (int i=0; i < list_size; i++) {
            int sum = 0;
            for (int num: combis.get(i).stream().mapToInt(n->n).toArray()) {
                sum += num;
            }
            if (isPrime(sum)) answer++;
        }

        return answer;
    }
}

SOLID : 객체지향 5원칙

1. SRP (Single Responsibility Principle) 단일 책임의 원칙

한 클래스는 하나의 책임(기능)만을 가져야한다.

하나의 속성은 하나의 의미를 가져야 하며, 경우에 따라 다르게 쓰이면 안된다. 즉 반대로 srp가 안지켜진다면...

  • 변수/메소드가 여러 기능을 함.
  • 메소드에 분기처리를 위한 if 문이 많음.
  • 수정이 필요할 경우 수정되는 이유는 하나 때문이어야 함.

2. OCP (Open Close Principle)

수정에는 닫히고 확장에는 열 것.

  • 기존의 코드는 변경하지 않으면서 기능은 추가가 될 수 있도록 설계되어야 함.

3. LSP (Listov Substitution Principle) 리스코프 치환 원칙

자식 클래스는 부모클래스를 언제나 대체할 수 있어야함.

4. ISP (Inteface Segregation Principle) 인터페이스 분리 원칙

클래스에서 사용하지 않는 인터페이스는 구현하지 말아야함. ⇒ 여러 구체적인 인터페이스를 설계하는 것이 좋음.

5. DIP (Dependency Injection Principle)

의존 관계를 맺을 때 자주 변화하는 것보다 거의 변화가 없는 것에 의존해야함.

⇒ 인터페이스나 추상클래스와 관계가 맺어져야함.

저작자표시 (새창열림)

'Daily' 카테고리의 다른 글

한줄 정리 단어장  (0) 2022.05.19
AWS로 인프라 구축하는 과정 (요약)  (0) 2022.01.26
M1 Ruby 설치 중 에러(Build FAILED)  (0) 2021.12.11
[IntelliJ] Junit 시 메소드 실행 결과가 안뜨는 경우  (0) 2021.11.26
[어렵다어려워] 맥북 IntelliJ 단축키 정리 (ing)  (0) 2021.11.26
    'Daily' 카테고리의 다른 글
    • 한줄 정리 단어장
    • AWS로 인프라 구축하는 과정 (요약)
    • M1 Ruby 설치 중 에러(Build FAILED)
    • [IntelliJ] Junit 시 메소드 실행 결과가 안뜨는 경우
    J.Y.S
    J.Y.S

    티스토리툴바