전체 글 152

AppConfig

https://salmon16.tistory.com/75 OCP, DIP 원칙이 위배되는 역할과 구현 분리 역할과 구현을 분리하고 다형성을 이용하여 잘 설계를 해도 OCP, DIP 원칙을 위반할 수 있다 . 아래 예시를 보자 OrderServiceImpl은 DiscountPolicy라는 인터페이스에 의존하면서 DIP를 잘 지킨 것 같지만 salmon16.tistory.com 위 링크 문제를 해결하기 위해 구현 객체를 생성하고 연결하는 AppConfig클래스를 만들자. Appconfig는 구현 객체를 생성하여 return 해 준다. 이렇게 작성을 하고 각 Impl클래스의 생성자를 추가하면 OCP, DIP를 위배하지 않게 만들 수 있다. 예로 MemberServiceImpl 코드를 보면 더 이상 구현에 의존..

스프링 2023.07.06

OCP, DIP 원칙이 위배되는 역할과 구현 분리

역할과 구현을 분리하고 다형성을 이용하여 잘 설계를 해도 OCP, DIP 원칙을 위반할 수 있다 . 아래 예시를 보자 OrderServiceImpl은 DiscountPolicy라는 인터페이스에 의존하면서 DIP를 잘 지킨 것 같지만 구현 클래스(Fix, Rate DiscountPolicy)에도 의존하고 있다 그러므로 FixDiscount에서 RateDiscount로 변경하려면 OberServiceImpl 코드를 변경 해야한다 (FixDiscountPolicy주석 처리하고 RateDiscountPolicy 할당) 기대했던 의존관계는 OrderServiceImpl는 DiscountPolicy인터페이스만 의존하기를 원했다 그렇다고 코드를 아래와 같이 수정을 하면 구현체가 없어서 null point except..

스프링 2023.07.06

함수 작성 중 테스트 코드 작성하기

비율에 따른 할인 함수코드를 작성 중 10% 비율로 잘 할인이 되는지 궁금해져서 테스트를 해 보려고 한다 할인 정책에는 VIP 등급인 경우 10% BASIC 등급인 경우에는 할인이 되지 않는다. VIP 등급일 때 과연 10% 할인이 잘 되는지 확인을 하기 위해 윈도우에서 ctrl + shift + t를 누르면 자동으로 테스트 class를 만들어 준다. 테스트 코드를 작성할 때 VIP인 등급만을 테스트를 하는 것이 아닌 반대 경우도 해 주어야 한다. 여기서 코드를 좀 더 간결하기 위해 자바의 static import를 사용하면 좋다. Assertions 코드에 커서를 위치 시키고 윈도우에선 alt + enter를 누르면 된다. 출처 : 인프런 스프링 핵심 원리 - 기본 편 김영한

스프링 2023.07.06

JUnit 테스트 코드 작성하기

회원을 가입하고 아이디를 통해 조회할 수 있는 프로그램에서 테스트 코트를 작성해 보자 이렇게 그냥 일반적인 자바 코드를 통해 new member와 findMember가 같은지를 print 된 것을 직접 보며 findMemer 함수가 잘 작동하는지 가입이 잘 되었는지 확인을 할 수 있지만 이는 좀 더 복잡한 테스트 코드를 작성하게 되면 복잡하고 개발자가 직접 print 문을 확인해야 한다는 단점이 있다 인텔리제이에서 테스트를 하고 싶으면 테스트하고 싶은 클래스에서 ctrl + shift+ v를 누르면 쉽게 테스트 코드를 작성할 수 있다. 그래서 JUnit을 활용한 테스트 코드를 작성해 보자 JUint을 활용하기 위해서 import를 해주어야 한다. import org.junit.jupiter.api.Tes..

스프링 2023.07.05

좋은 객체 지향의 설계 SOLID

SRP 단일 책임 원칙 (Single responsibility principle) 한 클래스는 하나의 책임만 가져야 한다. 중요한 기준은 변경이다 . 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것이라고 할 수 있다. OCP 개방-폐쇄 원칙(Open/Closed principle) 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다 이 코드에서 MemoryMemberRepository. 에서 jdbcMemberRepository로 변경할 때 클라이언트(MemberService)가 구현 클레스를 직접 선택하는데 이는 ocp 원칙을 지키지 못 한 경우이다. 이를 해결하기 위해 스프링이 도와준다. LSP 리스코프 치환 원칙(Liskov substitution principle..

스프링 2023.07.04

객체지향의 다형성

객체 지향의 특징 중 다형성에 주목하자 다형성을 쉽게 이해하기 위해 무대 공연을 예시로 들어보자 다형성은 역할과 구현을 구분해야 한다. 위 그림에서 로미오 역할은 장동건, 원빈 중 누가 하더라도 상관이 없다 줄리엣도 김태희, 송혜교 중 누가 하더라도 동일하게 줄리엣의 역할을 수행할 수 있다 이것이 다형성이다 역할만 잘 만든다면 장동건으로 로미오를 구현하든 원빈으로 구현하든 로미오의 역할을 수정 없이 구현 부분을 교체할 수 있다는 장점이 있다. 이제 이를 자바에 적용시켜 보자 MemberService라는 클라이언트가 있고 MemberRepository라는 interface와 Memory, jdbc로 각각 구현한 MemberRepository가 있다. MemberService는 MemberRepository..

스프링 2023.07.04

[백준] 동물원 1309번 (c++)

출처 : https://www.acmicpc.net/problem/1309 1309번: 동물원 첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다. www.acmicpc.net 풀이 방법 가로로도 세로로도 붙어 있으면 안되기 때문에 경우의 수를 3가지로 나누었다. dp_l[i] = i 번째 줄에 왼쪽에 사자가 있고 오른엔 사자가 없는 경우 dp_r[i] = i 번째 줄에 오른쪽에 사자가 있고 왼쪽엔 사자가 없는 경우 dp_z[i] = i 번째 줄에 왼쪽 오른쪽 둘다 사자가 없는 경우 점화식 은 dp_l[i] = dp_z[i] + dp_r[i]; dp_r[i] = dp_z[i] + dp_l[i]; dp_z[i] = dp_z[i] + dp_l[i] + dp_r[i] 로 포현하면 가로로 세로로 붙어 ..

Algorithm 2022.11.23

[백준] 양 3184번 (c++)

출처 : 3184번: 양 (acmicpc.net) 3184번: 양 첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다. www.acmicpc.net 풀이 방법 조건 몇 가지만 추가해서 bfs로 풀이할 수 있다. board전체를 for 문을 통해 돌며 #이 아니며 방문한 적이 없다면 bfs를 호출 한다. board[y][x]가 양이면 sheep변수에 +1 board[y][x]가 늑대이면 wolf변수에 +1을 해주고 bfs가 종료되기 전에 sheep의 변수 값이 큰지 wolf의 변수 값이 큰지 비교해서 sheep이 크면 n_sheep(전체 양이 몇 ..

Algorithm 2022.11.02

[백준] 이동하기 11048번 (c++)

출처 : https://www.acmicpc.net/problem/11048 11048번: 이동하기 준규는 N×M 크기의 미로에 갇혀있다. 미로는 1×1크기의 방으로 나누어져 있고, 각 방에는 사탕이 놓여져 있다. 미로의 가장 왼쪽 윗 방은 (1, 1)이고, 가장 오른쪽 아랫 방은 (N, M)이다. 준규는 www.acmicpc.net 풀이 방법 동적 계획법으로 재귀 함수를 사용해 해결했다. 재귀 함수의 기저 조건으로 1. y, x 좌표가 모두 0이면 return board[0][0] 2. y, x 좌표가 범위를 넘어가면 return 0 을 해서 선택되지 않도록 설정 3. dp[y][x] 가 -1 이 아닌 다른 값으로 설정되어 있으면 그 값을 리턴 3가지를 설정 했다. 위 3가지가 아닌 경우 재귀 함수를 ..

Algorithm 2022.10.06

[백준] 그림 1926번 (c++)

출처 : 1926번: 그림 (acmicpc.net) 1926번: 그림 어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로 www.acmicpc.net 풀이 방법 bfs 문제로 맵 전체를 for 문을 돌며 board[y][x] 가 1이고 visited[y][x]가 -1 인 점을 bfs(y, x)를 호출하여 그 점과 연결된 점들을 방문하여 넓이를 구하고 가장 큰 곳이면 답을 변수 ans에 저장한다. 그리고 bfs가 호출 될 때마다 그림의 개수 카운터를 증가시킨 후 출력한다. #include using namespace std; int n, m, ans = 0, cnt..

Algorithm 2022.08.23