이터레이터 패턴 행위 패턴 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해주는 방법을 제공해 주는 패턴 이터레이터 패턴을 사용하면 집합체 내에서 어떤 식으로 일이 처리되는지 몰라도 그 안에 들어있는 항목들에 대해서 반복작업을 수행할 수 있다. 보통 프로그래밍을 하면서 반복문을 돌리려면 for문을 사용한다. for (int i = 0; i < n; i++) { System.out.println(array[i]); } for 문의 초기화문에서 흔희 사용되는 변수 i는 배열이 주어질 때 각각의 요소에 차례대로 접근하기 위해 사용된다. 이렇게 사용되는 변수 i의 역할을 추상화한 것이 Iterator 패턴이다. 이터레이터 패턴 사용 예시 Iterator 집합체의 ..
오늘은 객체지향의 사실과 오해 마지막장인 7장의 내용을 정리하였다. 코드와 모델을 밀접하게 연관시키는 것은 코드에 의미를 부여하고 모델을 적절하게 한다.- 에릭 에반스 개념 관점 설계는 도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현 실제 도메인의 규칙과 제약을 최대한 유사하게 반영하는 것이 핵심 명세 관점 사용자의 영역인 도메인을 벗어나 개발자의 영역인 소프트웨어로 초점을 옮김 객체들의 책임에 초점을 맞추어 객체의 인터페이스를 바라보고 객체가 협력을 위해 '무엇'을 할 수 있는가를 생각 -> 명세 관점과 구현 관점을 명확하게 분리 구현 관점 프로그래머에게 가장 익숙한 관점, 실제 작업을 수행하는 코드와 연관 객체들이 책임을 수행하는데 필요로 하는 동작하는 코드 작성 인터페이스를 구현하는데 필요한..
다양한 가비지 컬렉션(Garbage Collection) 알고리즘 JVM이 메모리를 자동으로 관리해 주는 것은 개발자의 입장에서 상당한 메리트이다. 하지만 문제는 GC를 수행하기 위해 Stop The World에 의해 애플리케이션이 중지되는 것에 있다. Heap의 사이즈가 커지면서 애플리케이션의 지연(Suspend) 현상이 두드러지게 되었고, 이를 막기 위해 다양한 Garbage Collection(가비지 컬렉션) 알고리즘을 지원하고 있다. Serial GC Serial GC의 Young 영역은 앞서 설명한 알고리즘(Mark Sweep)대로 수행된다. 하지만 Old 영역에서는 Mark Sweep Compact 알고리즘이 사용되는데, 기존의 Mark Sweep에 Compact라는 작업이 추가되었다. Com..
Private 메소드를 테스트하는 방법 예를 들어 id를 만들때 해당 id의 길이가 2에서 10 사이가 아니라면 UUID를 생성하여 반환하는 다음과 같은 코드가 있다고 하자. @Service public class PrivateTestClass { public String makeID(String id) { if (isCollectID(id)) { return id; } return UUID.randomUUID().toString().substring(0,10); } private boolean isCollectID(String id) { return 2
https://school.programmers.co.kr/learn/courses/30/lessons/67257 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 이 문제는 각각의 연산자에 우선순위를 부여하여 각각의 우선순위대로 계산했을 때 절댓값이 가장 큰 경우를 찾는 것이다. 핵심 연산자가 +, -, * 3가지이기 때문에 연산자의 우선순위의 경우의 수는 6가지이다. 따라서 다소 빡구현을 통해 풀 수 도 있지만, 조합을 이용하면 더 간결하게 작성할 수 있다. 정답 코드 import java.util.ArrayList; import java.util.Lis..
가비지 컬렉션(Garbage Collection) 개발을 하다 보면 유효하지 않은 메모리인 가비지(Garbage)가 발생한다. C/C++에서는 메모리 누수(Memory Leak)를 막기 위해 객체를 생성한 후 사용하지 않는 객체의 메모리를 프로그래머가 직접 해제해주어야 한다. 하지만 JAVA는 JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해 주기 때문에 프로그래머가 직접 해제할 필요가 없다. 일반적으로 다음과 같은 경우에 GC의 대상이 된다. 객체가 NULL인 경우 (ex. String str = null) 블럭 실행 종료 후, 블럭 안에서 생성된 객체 부모 객체가 NULL인 경우, 포함하는 자식 객체 Java에서는 메모리 누수를 방지하기 위해 가비지 컬렉터(Garbage Collector, G..
JAVA 탄생 배경 JAVA는 썬 마이크로시스템즈의 제임스 고슬링이라는 사람과 다른 연구원들이 개발한 프로그래밍 언어이다. 1991년 그린 프로젝트라는 이름으로 시작해 1995년에 발표가 되었다. 제임스 고슬링은 가전제품 내에 탑재해 동작하는 프로그램을 개발하려고 하는 데 그 당시에는 유닉스 기반의 배경을 가지고 있었기 때문에 사용하던 프로그래밍 언어 C/C++의 특성상 여러 하드웨어를 커버하기에는 같은 기능의 소스를 각 하드웨어에 맞게 작성해야 하는 번거로움이 있었기에 JAVA를 개발하게 되었다. JAVA의 가장 큰 특징 중 하나가 컴파일된 코드가 플랫폼 독립적이라는 점이다. 즉 어느 플랫폼이든 작성한 소스를 변경할 필요 없이 다 실행시킬 수 있다. 이러한 특징을 구현하기 위해서는 JVM(JAVA Vi..
https://school.programmers.co.kr/learn/courses/30/lessons/67258 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 투 포인터를 사용하는 문제이다. 핵심 모든 종류의 보석을 갖는 경우를 알아야 하고 만약 모든 보석을 가지고 있다면 1칸씩 당기면서 보석을 버리고, 그때도 모든 종류의 보석을 가지고 있는지 체크하며 최소의 길이를 찾아야 한다. 정답 코드 import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.ut..
Spring은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 이번에는 그중에서 필터(Filter) vs 인터셉터(Interceptor)의 차이에 대해 알아보자 필터(Filter) 필터(Filter)는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다. 디스패처 서블릿은 스프링의 가장 앞단에 존재하는 프론트 컨트롤러이므로, 필터는 스프링 범위 밖에서 처리가 되는 것이다. 즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너(서블릿 컨테이너)에 의해 관리가 되는 것이고(스프링 빈으로 등록은 된다), 디스패처 서블릿 전/후..
Java 언어 설계자인 Brain Goetz는 Optional을 만든 의도를 아래와 같이 작성했다. API Note: Optional is primarily intended for use as a method return type where there is a clear need to represent "no result," and where using null is likely to cause errors. A variable whose type is Optional should never itself be null; it should always point to an Optional instance. 메소드가 반환할 결과 값이 '없음'을 명백하게 표현할 필요가 있고, null 을 반환하면 에러가 발생..