템플릿 메서드 패턴 정의 부모 클래스에서 알고리즘의 골격을 정의하지만, 해당 알고리즘의 구조를 변경하지 않고 자식 클래스들이 알고리즘의 특정 단계들을 오버라이드(재정의)할 수 있도록 하는 행동 디자인 패턴이다. 전체적으로는 동일하면서 부분적으로는 다른 구문으로 구성된 메서드의 코드 중복을 최소화할때 유용하다. 또한 동일한 기능을 상위 클래스에서 정의하면서 확장/변화가 필요한 부분만 서브 클래스에서 구현할 수 있도록 한다. 예시로 커피와 홍차를 만들때 2개다 물을 끓여야한다고 하면 boiWater을 템플릿 메서드로 정의할 수 있다 장점 알고리즘 구조의 재사용성: 템플릿 메서드는 알고리즘의 일반적인 구조를 부모 클래스에 정의하므로, 여러 하위 클래스에서 이 구조를 재사용할 수 있습니다. 유연성과 확장성: 부..
데커레이터 패턴 정의 데커레이터는 어떤 기능에 추가적으로 기능을 덧붙이고 싶은 경우, 그 기능들을 Decorator로 만들어서 덧붙이는 방식입니다. 예시 토스트를 만들때 일반빵, 밀빵, 버터빵, 우유빵 선택사항이 존재하고 토핑으로 햄, 야채, 치즈, 달걀, 새우 그리고 마지막으로 소스로 마요네즈, 케찹, 칠리가 존재한다고 할때 토핑과 소스가 데커레이터가 됩니다. 왜냐면 보통 토스트는 빵(1개)+토핑(여러개)+소스(여러종류) 로 이루어지기 때문에 빵을 제외한 토핑과 소스를 더 추가 할 수 있는 데커레이터로 표현합니다. 장점 확장성(Extensibility): 데커레이터 패턴은 기존 클래스를 수정하지 않고도 새로운 기능을 추가할 수 있다. 즉 코드의 확정성을 향상시켜 새로운 동작을 간단하게 추가한다. 유연성..
인텔리제이에서 실행(문제 없음) 스프링으로 프로젝트 생성 후에 인텔리제이에서 실행시킨모습이다. 정상적으로 잘 작동하였고 localhost도 잘 띄워진다 터미널에서 실행(문제 생김) 문제 발생 문제는 터미널에서 실행시켰을때 문제가 발생한다. 참고로 윈도우 기준이다 Spring프로젝트 폴더인 hello-spring디렉터리 안에서 gradlew.bat 파일을 명령어 ./gradlew.bat build 를 통해서 실행할려는 순간 오류가 발생한다(참고로 맥은 gradlew파일을 빌드하면 되는걸로 안다) 오류 내용 쉽게 얘기하면, 실행할려는 파일의 자바 버전은 17인데 컴퓨터가 빌드하는데 사용하는 자바 버전은 8이라는 내용이다. 문제는 여기부터다. 버전 관련 내용들 자바 버전이 알맞게 17로 설정되어있는것을 알 수..
문제 n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다. 입력 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어질 수도 있다. 출력 첫째 줄에 사용한 동전의 최소 개수를 출력한다. 불가능한 경우에는 -1을 출력한다. 풀이 시간복잡도를 보면 가치의 합 최대가 10,000 , 그리고 동전의 갯수 최대가 100개이다. 따라서 복잡도는 O(n*k), 즉 100만번이 최대이다. 새로운 동전이 들..
문제 LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. 입력 첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다. 출력 첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다. 풀이 첫번째 문자열과 비교해서 두번째 문자열의 문자가 들어올때마다 lcs값을 측정해줘야하고 첫번째 문자열의 문자와 새로들어온 문자가 같을때는 해당칸의 lcs와 앞선 문자의 max lcs를 비교해서 수정해줘야한다 그리고 수정한 문자의 위치는 방문체크를 해줘서 이후..
제네릭 정의 JDK 1.5에 처음 도입, 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크해주는 기능이다. 추가로 에러는 언제나 런타임보다 컴파일 타임에 잡는것이 좋다(런타임 에러는 프로그램이 실행되는 동안 발생하는데 이는 프로그램 실행 중단으로 이어질 수 있다) 제네릭의 장점 타입 안정성을 제공 리스트의 형을 정함으로써 컴파일러가 들어오는 데이터의 타입을 자동으로 체크해준다(리스트에 타입이 다른 데이터가 못들어오게함 = 안정성) 타입체크와 형변환을 생략 할 수 있으므로 코드가 간결해진다 ex. 원래는 list의 객체를 가져올때 object()형으로 반환되서(String)list.get(0)이런식으로 문자열을 가져와야하는게 이제는 쓸 필요가 없다 예시 //제네릭 미사용 Lis..
옵저버 패턴 정의 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 다른 객체의 상태 변화를 별도의 함수 호출 없이 즉각적으로 알 수 있기 때문에 이벤트에 대한 처리를 자주해야 하는 프로그램에 매우 효율적이다. 장점 실시간으로 한 객체의 변경사항을 다른 객체에 전파할 수 있다. 느슨한 결합으로 시스템이 유여하고 객체간의 의존성을 제거할 수 있다. 단점 너무 많이 사용할 경우 상태 관리가 힘들 수 있다. 데이터 배분에 문제가 발생하면 큰 문제로 발전할 수 있다. 옵저버 패턴 적용전 Client public class Client { public static void main(String[] args) { Scor..
Computer OS를 사용하는 이유(개발자 입장) 주요 구성 요소 요소 역할 CPU Central Processing Unit(중앙 처리 장치): 연산 Memory(주 기억 장치, RAM) 데이터 저장(휘발성) (SSD,HDD,…)보조 기억 장치 데이터 저장 I/O 장치 모니터, 키보드, 마우스 등 OS가 위에 언급된 구성 요소를 관리한다 프로세스 관리 및 CPU스케줄링 메모리 관리 보조 기억 장치 데이터(파일)관리 I/O처리 개발자가 OS를 알고있어야 하는 이유 추후 AWS서버에서 램, CPU를 설정할때 사용량에 관련해서 지나치게 비용지불을 하지 않아도 된다 Process/Thread Process(프로그램 실행 단위) 프로그램을 실행 → 하나의 프로세스가 생성 → CPU할당과 메모리에 적재 응용 프..
커맨드 패턴 정의 이벤트가 발생했을 때 실행될 기능이 다양하면서 변경이 필요한 경 우 이벤트를 발생시키는 클래스의 변경없이 재사용하고자 할 때 기술적정의: 실행될 기능을 캡슐화 함으로써 기능의 실행 요구하는 호출자 클래스(Invoker)와 실제 기능을 실행하는 수신자 클래스(Receiver, ex.Lamp)사이의 의존서을 제거한다. 따라서 기능의 변경에도 호출자 클래스를 수정없이 사용 가능 버튼이 눌렸을때 수행 될 기능을 캡슐화 기존의 코드는 OCP를 위배함 따라서 Command라는 인터페이스를 생성해서 새로운 기능이 추가되도 버튼에는 코드가 추가되지않는다. 커팬드 패턴 예시 이미지 출처 실습 인보커 로딩 순서 클라이언트 커맨드 객체 생성 SetCommand() 호출 클라이언트에서 인보커에서 명령 요청 ..