다이아몬드 문제 다중 상속을 지원하게 되면 하나의 클래스가 여러 상위 클래스를 상속 받을 수 있습니다. 이런 특징 때문에 발생하게 되는 문제가 있는데, 바로 '다이아몬드 문제' 입니다. 위의 클래스 다이어그램과 같은 상속 구조에서 발생되는 문제가 다이아몬드 문제입니다. 마치 모양이 다이아몬드 모양이라서 붙여진 이름 같습니다. 예를들어 GrandFather이라는 클래스가 myMethod() 라는 이름의 메소드를 가지고 있다고 가정해봅시다. 그리고 FatherA와 FatherB가 각각 오버라이딩하여 구현하였다면, FatherA와 FatherB를 모두 상속받은 Son 클래스 입장에서는 어떤 부모의 myMethod()를 사용해야 할까요? 이로 인하여 충돌이 생기게 됩니다. 코드로 나타내면 아래와 같은 모습입니다..
자바(JVM)의 메모리 사용 방식 프로그램을 실행시킬 때 CPU와 조화로운(?) 작업을 위해서 저장장치에 있던 내용들이 메모리에 올리가기 시작합니다. 메모리에 데이터들이 어떤 방식으로 올라가는지 이해하는 것은 더 나은 개발자가 되기 위한 필수 과정이라고 생각합니다. 메모리 구조를 알게 된다면, 클래스 멤버, GC(가비지 컬렉터), 쓰레드가 어떤식으로 독립적으로 운영되면서 공유하는 자원이 있는지에 대한 이해를 훨씬 더 쉽고 깊게 알 수 있습니다. 메모리는 크게 4가지 영역으로 나눌 수 있습니다. 로우레벨 개발자가 아니라면 주로 우측에 static 영역, stack 영역, heap 영역을 위주로 알고 있으면 됩니다. 이 세가지 영역을 간단히 T메모리라고 부르겠습니다. static 영역패키지나 클래스 정보가 ..
코딜리티(Codility) - GenomicRangeQuery ☞ 문제링크 문제 설명 주어진 문자열(S)의 각 문자 A,C,G,T는 각각 'impact factor'라는 이름의 값으로 1,2,3,4를 갖고 있습니다. P배열과 Q배열은 주어진 문자열(S)인덱스를 말합니다. 예를들어, P[0] = 2 / Q[0] = 4 인 경우는 CAGCCTA 문자열의 2번째 4번째 문자열을 가르키는 것이고, CAGCCTA 그 사이에 존재하는 문자열의 'impact facotr' 값 중에 가장 작은 값을 찾아야 합니다. CAGCCTA 에서 G C C 중 가장 작은 값은 C의 값인 2가 됩니다. 같은 방법으로 P[1] = 5 / Q[1] = 5 인 경우는 CAGCCTA 4가 되고, P[2] = 0 / Q[2] = 6 인 경우..
의존관계 DI를 알아보기 이전에 의존(Dependency)이라는 키워드에 대해서 알아봅시다. 예를들어, A라는 클래스가 B라는 클래스를 내부적으로 사용하게 되면 A는 B에게 의존하는 관계입니다. UML으로 표시하면 아래와 같습니다. 출처 : http://www.cs.utsa.edu/~cs3443/uml/uml.html 위의 UML을 보면 Person이라는 클래스가 Book이라는 클래스를 내부적으로 사용합니다. 그리고 Book이라는 클래스를 점선 화살표로 가르키게 되는데 이러한 관계를 Person이 Book에게 '의존'한다 라고 합니다. (추가적으로, DI를 처음 배울 때 이상한 점이 있었습니다. 스프링의 DI관계를 자세히 보면, 의존보다는 엄밀히 말해 '연관'이 맞다고 생각했습니다. 근데 왜 의존이라고 ..
책 목차 트리구조로 구현하기 책 목차는 하위 목차와 상위 목차가 있기 때문에, 이를 트리구조로 보여준다면 좀 더 직관적인 UI를 만들 수 있다. 근데, 트리구조 구현을 하는 과정이 생각보다 쉽지 않았다. (정확히는 경험이 없기 때문에 어려웠다.) 트리구조를 구현하기 위해서는 재귀적인 과정으로 자신의 하위 목차들을 불러와야 했다. 알고리즘 문제 이외에 처음으로 재귀를 써본 경험이었다. 실무에서 재귀구조를 잘 안쓴다고 하던데 좋은 경험이었다. 다행히 책 목차의 도메인 구조가 셀프참조로 설계가 되어있어서 설계도 잘 진행 되었던 것 같아 기분이 좋았다. 타임리프에서 트리 구조를 하기 위해서 다음과 같이 작성하였다. . . .(생략) . . . 핵심이 되는 곳은 강조된 곳이다. bookContentTree라는 이..
POJO 자바나 스프링 프레임워크를 조금이라도 공부 해본 개발자 (혹은 학생)이라면 POJO 라는 단어를 한번쯤 듣게됩니다. POJO의 정의는 사실 그렇게 어렵지 않습니다. 아래 내용은 위키 백과에 나와있는 POJO에 대한 설명입니다. Plain Old Java Object, 간단히 POJO는 말 그대로 해석을 하면 오래된 방식의 간단한 자바 오브젝트라는 말로서 Java EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용되게 된 용어이다. 2000년 9월에 마틴 파울러, 레베카 파슨, 조쉬 맥킨지 등이 사용하기 시작한 용어로서 마틴 파울러는 다음과 같이 그 기원을 밝히고 있다. [1] “ 우리는 사람들이 자기네 시스템에 보통의 객체를 사..
프로그래머스 알고리즘 - 더 맵게 ☞ 프로그래머스 '더 맵게' 문제링크 음식 중에 가장 덜 매운 2가지의 음식을 반복적으로 선택해야 합니다. 우선순위 큐(Priority Queue)를 사용하면 가장 덜 매운 2가지 음식을 찾기 편합니다. 우선순위 큐에 대한 내용은 이전 포스팅에 있습니다. ☞ 우선순위 큐 - Java에서 다루기 풀이코드 (java) class Solution { public int solution(int[] scoville, int K) { int answer = 0; PriorityQueue priorityQueue = new PriorityQueue(); //우선순위 큐에 음식 담아주기 for (int i : scoville) { priorityQueue.add(i); } //가장 덜..
우선순위 큐(Priority Queue) 일반적인 큐는 제일 먼저 들어간 데이터가 가장 먼저 나오게 되는 자료구조 입니다. 대표적인 예로는 은행업무를 기다리는 손님들의 대기열 입니다. 이런 큐의 특성과 달린 우선순위 큐(Priority Queue)는 들어간 순서에 상관없이 일정한 규칙에 따라 우선순위를 선정하고, 우선순위가 가장 높은 데이터가 가장 먼저 나오게 됩니다. 대표적인 예로는 병원의 응급환자를 생각하면 됩니다. 은행과 달리 위급한 우선순위에 따라 먼저 처리되기 때문입니다. 우선순위 큐 사용하기 우선순위 큐도 Java내부적으로 구현이 되어 있습니다. 일반적인 큐를 사용하는 것처럼 add(); peek(); poll(); 등의 메소드를 사용할 수 있습니다. PriorityQueue priorityQ..