lombok에 빌더 어노테이션에 대해 생각해 보다가, 문득 builder를 왜 쓰는지가 궁금했습니다. 디자인 패턴에 대해서 하나도 모르는 저는 빌더 패턴을 3편에서 4편 정도를 쓸 듯 싶습니다. 먼저, '완전한 상태'에 대해서 생각해 보겠습니다. age와 name으로 이루어진 모델이 하나 있습니다. 그리고, 이 오브젝트는 생성이 되면 값이 변경되지 않습니다. getter와 setter가 있습니다. 그리고 Main 함수를 보겠습니다. 모델의 나이를 set하고, name을 set 합니다. Model 클래스에서 이름과 age가 필수 항목이라고 할 때, 모델 객체만 만든 상태는 완전한 상태인지 생각해 보겠습니다. 그렇지 않습니다. 이 상태에서 뭔가 작업을 한다고 하면 문제가 생길 듯 해 보입니다. 그래서 4번째..
Java 검색 결과
안녕하세요. 조경완입니다. 이펙티브 자바를 보면 notify 대신에 notifyAll을 쓰라고 되어 있습니다. 사실 더 중요한 것은 Concurrent를 쓰라는 것이지만요. 왜 그런지는 아이템 81에 나와 있으니, deadlock이 발생하는 시나리오에 대해서만 짚고 넘어가 보도록 하겠습니다. 먼저 notify 메서드에 대한 설명을 보겠습니다. 깨우는데, a single thread라 되어 있습니다. 하나의 스레드를 깨웁니다. Object의 모니터에 대해서? Common의 get이나 put에는 wait가 있었는데요. main 클래스에 보면 이런 것이 있었습니다. 저는 Common 객체를 c 하나만 선언했고, put이나 get은 Common 클래스 안에 있었으니, c에 걸리는 무언가 정도로 보시면 됩니다. ..
오늘은 String에서, Object의 valueOf는 어떤 식으로 동작하는지 알아보겠습니다. lombok을 쓰시다 보면, ToString 어노테이션을 잘못 쓰다가 stackoverflow 에러가 났다는 글을 보실 수 있습니다.이는 왜 그런 것일까요? 어떤 메서드 때문에 사이클이 문제가 된 것일까요? 결론부터 말하면 toString이 모든 필드에 대한 정보를 출력하게 만들었습니다. 그리고, 이들에 대한 정보를 출력하기 위해 호출하는 valueOf 메서드 때문입니다. 그래서, 이 메서드에 대해서 작성을 하였습니다. 문제 상황을 재현해 보면 아래와 같습니다. A.java입니다. A 안에는 필드 b가 들어 있습니다. A 객체 a를 하나 생성했다고 해 보겠습니다. 생성자가 호출이 되면, b에는 새로 생성한 B ..
상속과 구성은 많이 들어봤을 법한 주제입니다. A is a B일 때 상속을 쓰라고 합니다. 예를 들자면, 개와 동물은 그러한 관계의 한 예입니다. 몇 레퍼런스를 더 찾아보던 중에, 이 질문글을 보게 되었습니다. 그리고 좋은 답변글들을 보면서, 정사각형과 직사각형, 그리고 타원과 원도 A is a B의 관계에 있다는 것을 알게 되었습니다. 그리고 이 문제와 리스코프 원칙과 관련이 있다는 것도 알게 되었습니다. 아래 예제를 보겠습니다. 정사각형은 직사각형을 상속합니다. square 생성자는 부모 rect의 생성자를 호출하는데, 넘기는 변수는 h, h입니다. 높이와 너비가 같기 때문입니다. rect 클래스입니다. 여기에는 getArea 메서드만 있습니다. 이 프로그램의 출력 결과는 25입니다. 그런데, 사실 ..
이펙티브 자바 3편을 보면 for each에 대한 설명이 나와 있습니다. 거기에서도 언급했다 시피, for each문을 도는 동안에 이터를 돌고 있는 자료구조에 변형이 오면 안 됩니다. (item 58) 만약에 변형이 오면 어떻게 될까요? 사실 저는 null Exception이 뜨거나 (Linked인 경우에), 아니면 정상적으로 수행이 될 거라고 생각했습니다만.. 예상과는 다른 것이 출력되었습니다. 그 이유는 modCount 필드와 관련이 있습니다. 아래 코드를 보겠습니다. 0부터 4까지 차례대로 LinkedList에 넣습니다. 그리고, List를 순회합니다. 이는 향상된 for loop를 써서 할 수 있습니다. 그런데, 이 코드에서는 단순히 '순회'만 하지 않습니다. list에 있는 첫 번째 원소를 도..
최근댓글