본문 바로가기

분류 전체보기

(175)
의존 역전 원칙 - DIP (Dependency Inversion Principle) 의존 역전 원칙이란 의존 관계를 맺을 때 변화하기 쉬운 것 보다 변화하기 어려운 것에 의존하라는 원칙을 의미한다. DIP를 만족하는 설계는 변화에 유연한 시스템이 된다. 변하기 쉬운 것과 변하기 어려운 것은 어떻게 구분 할 수 있을까? 정책, 전략과 같은 어떤 큰 흐름이나 개념같은 추상적인 것은 변하기 어려운 것이고, 구체적인 방식, 사물 등과 같은 것은 변하기 쉬운 것으로 구분한다. 위 클래스 다이어그램을 보면 Weapon은 변하기 어려운 것이고, Sword, Axe, Spear는 변하기 쉬운 것이다. 인터페이스 = 변하지 않는 것 구체 클래스 = 변하기 쉬운 것 DIP를 만족하면 여러가지 타입의 클래스를 인터페이스를 통해 쉽게 저장이 가능하다. public class Person { private W..
단일 책임의 원칙 - SRP(Single Responsibility Principle) 단일 책임의 원칙이란 객체는 단 하나의 책임을 가져야한다는 원칙을 말한다. 객체지향적으로 설계 할 때는 응집도를 높게, 결합도는 낮게 설계하는 것이 좋다. SRP에 만족하는 설계를 하면 응집도를 높게, 결합도는 낮게 설계 할 수 있다. 한 객체에 책임이 많아질수록 클래스 내부에서 서로 다른 역할을 수행하는 코드끼리 강하게 결합될 가능성이 높아진다. 즉, 객체마다 책임을 나누지 않는다면 시스템은 매우 복잡해진다. 그리고 시스템에 수정이 생기면, 수정과 관련 없는 기능에 영향이 생길 수 있고, 모두 테스트 해주어야 한다. 단일 책임의 원칙, 하나의 객체에 하나의 책임을 갖게 설계하면, 위와 같은 문제점에서 벗어날 수 있고, 소스의 재사용 및 가독성이 좋아진다. 하지만 각 객체마다 책임을 적절히 분배하는 것은..
개방 폐쇄 원칙 - OCP(Open Close Principal) 개방폐쇄원칙이란 확장에 대해 개방되어 있고, 수정에 대해 폐쇄되어 있는 원칙을 의미한다. OCP에 만족되는 설계를 하려면 변경되는 소스를 파악하고, 수정 시 영향 받지 않게 해야한다. 이를 만족하기 위해서는 인터페이스를 이용해 기능의 추상화가 이루어져야한다. 다음 소스는 OCP를 위배하는 잘못된 예이다. public class Sword { public void attack() { System.out.println("검으로 휘두르다."); } } public class Person { private Sword sword; public void setSword(Sword sword) { this.sword = sword; } public void attack() { sword.attack(); } } pu..
[Java] 쉘 정렬 (Shell Sort) 쉘 정렬이란 배열을 특정 간격(gap)으로 묶어서 gap의 자리수 특정 자리수끼리 삽입 정렬 로직을 수행하는 정렬이다. [9, 4, 1, 7, 3, 2, 1, 5, 0, 6, 8] gap : 4 [0, 2, 1, 5, 3, 4, 1, 7, 9, 6, 8] gap : 2 [0, 2, 1, 4, 1, 5, 3, 6, 8, 7, 9] gap : 1 [0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9] 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.util.Arrays; public class ShellSort { public ..
[Java] 버블 정렬 (Bubble Sort) 버블 정렬이란 n번째 값과 n+1 번째 값을 비교하여 Swap한다. 마지막 인덱스부터 정렬된 값이 저장된다. [5, 4, 3, 2, 1] [4, 3, 2, 1, 5] (1회) [3, 2, 1, 4, 5] (2회) [2, 1, 3, 4, 5] (3회) [1, 2, 3, 4, 5] (4회) 정렬 속도 순 : 삽입정렬 > 선택정렬 > 버블정렬 속도 : O(n^2) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import java.util.Arrays; public class BubbleSort { public static void main(String[] args) { int[] arr = {5, 4, 3, 2, 1}; int len = ar..
[Java] 삽입 정렬 (Insertion Sort) [9, 4, 1, 7, 3, 2, 1] [4, 9, 1, 7, 3, 2, 1] (1회) [1, 4, 9, 7, 3, 2, 1] (2회) [1, 4, 7, 9, 3, 2, 1] (3회) [1, 3, 4, 7, 9, 2, 1] (4회) [1, 2, 3, 4, 7, 9, 1] (5회) [1, 1, 2, 3, 4, 7, 9] (6회) 속도 : O(n^2) 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 import java.util.Arrays; public class InsertionSort { public static void main(String[] args) { int[] arr = {9, 4, 1, 7, 3, 2, 1}; int le..
[Java] 선택 정렬 (Selection Sort) 선택 정렬이란 n번째 인덱스를 기준으로 가장 작은 인덱스를 찾아 기억해두었다가 마지막 인덱스에 도달하면 n번째 인덱스와 가장 작은 인덱스를 Swap하는 방식이다. 속도 : O(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 import java.util.Arrays; public class SelectionSort { public static void main(String[] args) { int[] arr = {9, 4, 1, 7, 3, 2, 1}; int len = arr.length; int min = 0; int temp = 0; for (int i = 0; i

반응형