※ 이 포스팅은 주관적 해석을 포함하고 있습니다. compareTo() 구현 명세 자바 API 문서 Comparable compareTo() 구현 명세에 다음과 같은 지침이 있다. It is strongly recommended, but not strictly required that(x.compareTo(y)==0) == (x.equals(y)). compareTo()는 객체 간의 자연적 순서(natural order)를 정하기 위해서 주로 사용되고, equals()는 객체 간의 동치성을 비교하기 위해서 사용된다. 사용목적이 달라 보이는 두 메서드 간에 왜 위와 같은 구현 지침이 있는 걸까? 결론부터 말하자면 (일부) Set이나 Map 메서드의 동치성 확인은 equals()가 아닌 compreTo() ..
maven 저장소에 라이브러리를 올리는 방법에 대해서 알아보고 삽질내역을 공유하겠습니다. Java 프로젝트이며 빌드툴은 Gradle을 사용했고, 버전관리 사이트는 Github을 사용했습니다. Step 1. bintray 가입하기 - bintray는 라이브러리(jar파일) 파일들을 업로드 할 수 있는 저장소입니다. - 오픈소스소프트웨어(OSS)로 가입해야 무료로 이용가능합니다. (OSS이기 때문에 public 한 저장소만 사용가능) https://bintray.com/signup/oss (OSS 가입주소) Step 2. bintary에 Repository(저장소) 생성하기 - 삽질포인트 1. (bintray 웹사이트 주의사항~!) (20.09.12 현재) bintray가 페이지 레이아웃을 변경중이라, Ne..
요구사항 클라이언트가 서로 다른 2개의 클래스에 의존하고자 할 때, 하나의 추상화된 인터페이스로 의존되어야 한다. 클래스 다이어그램으로 나타내면 위와 같다. DoClass는 do()라는 퍼블릭 메서드를 갖고 있으며, RunClass는 run()이라는 퍼블릭 메서드를 갖고 있다. 메서드 명부터 다른 2개의 클래스를 하나의 추상화된 인터페이스로 의존하고자 한다면 어떻게 해야 할까? 방법 1 : 클래스를 수정한다. (전략 패턴) 간단하게 하는 방법은 클래스들의 코드를 수정하여서 인터페이스를 구현하도록 코드를 수정한다. 각기 다른 메서드 명도 통일시킨다면 클라이언트가 하나의 인터페이스를 통해 달라지는 (혹은 확장되는) 클래스들을 의존할 수 있게 된다. 추가 요구사항 만약 의존하는 클래스들의 코드를 수정할 수 없..
IntelliJ IDE에서 JUnit4를 JUnit5 테스트로 변환하는 방법을 알아보겠습니다. 이 포스팅은 https://www.youtube.com/watch?v=F8UTTTDtbH0&t=468s 영상을 참고하였습니다. 1. JUnit5 의존성 주입하기 org.junit.jupiter junit-jupiter 5.6.2 (아직 JUni4 의존성 삭제는 하지 않습니다.) 2. 리팩토링 설정 추가하기 (Inspection) IntelliJ - Preferences - Editor - Inspections JUnit으로 검색하여 JUnit 4 test can be JUnit 5 항목 체크[v] 후 OK 3. JUnit4 테스트를 JUnit5로 변환하기 이제 JUnit4 테스트 클래스는 IntelliJ가 경고..
자바스크립트의 중첩 함수 자바스크립트는 함수 안쪽에 또 다른 함수를 선언하는 중첩(nested) 함수가 가능하다. 이는 자바스크립트가 함수(function)를 변수와 같이 값(value)처럼 다루기 때문인데 일례로 자바스크립트에서는 같은 이름의 변수와 함수를 선언하는 것이 불가능하다. 자바스크립트의 이런 독특한 문법인 중첩 함수를 어떤 경우에 어떤 관점에서 사용해야 하는지 혹은 지양해야 하는지 생각해보았다. 1. 클린 코드적 관점 함수가 반복된 코드의 재사용을 위해서 사용되는 경우가 많지만 함수는 클린코드적 관점에서 충분한 의미가 있다. // 유저가 무직자인지 확인한다. if(user.job == null) { ... } if(user.isUnemployed()) { ... } 두 개의 코드 예제는 같은..
JDK 1.5 버전 이후부터, String의 + 연산은 컴파일시에 StringBuilder를 사용하도록 자동변환되어 성능 최적화가 이뤄진다고 알려져 있습니다. 그러나 String은 항상 StringBuilder로 변환되지 않습니다. String 연산을 수행하는 몇가지의 예제를 준비했습니다. String을 연산하는 소스코드를 컴파일하고, 다시 디컴파일하여 성능최적화가 이뤄졌는지 확인해보겠습니다. (디컴파일러는 JAD를 사용하였으며, 예제코드들은 "012"라는 문자열을 이어붙여서 만드는 작업을 수행합니다.) 예제1) 한줄로 모두 선언한 경우 //컴파일 전 소스파일 String str1 = "0" + "1" + "2"; //컴파일 이 후, 디컴파일 한 소스파일 String str1 = "012"; 한줄로 모두..
개발은 '데이터'를 할당하는 작업이다. 어떤 개발영역이든 '데이터'를 다루고 할당하는 작업을 한다. 여기서 말하는 '데이터'는 DB에 저장되는 값이 될 수도 있고, 사용자에게 적절하게 반환되어서 보여지는 값이 될 수도 있다. 우리가 만든 코드들은 결국 데이터를 할당하는 작업을 한다. 다시말해 (낯선)코드를 읽고 파악하는 과정은 데이터가 어떤식으로 다루어지고 변경되어지고 할당되어지는지 확인하는 과정이다. 코드를 읽어나가는 사람 입장에서 데이터들이 어떤방식으로 할당되어지는지 예측할 수 없다면 그 코드는 읽기 좋은 코드라고 말할 수 없다. 데이터가 예측되는 메서드를 만들자. DB 값을 변경하기 위한 데이터를 할당하는 작업. 사용자에게 보여주기 위한 데이터를 할당하는 작업. 이 정도 수준의 할당은 아주 낮은 추..
GoogleTechTalks의 "The Clean Code Talks -- Inheritance, Polymorphism, & Testing" 을 참고하여 정리하고 각색하였습니다. https://www.youtube.com/watch?v=4F72VULWFvc if문을 제거합시다. 왜 if문을 제거해야 할까요? (이 포스팅에서는 switch문을 포함한 모든 조건문을 if문이라고 칭하겠습니다.) if 문은 코드의 가독성을 저해시킵니다. if 문은 테스트를 불편하게 만듭니다. if 문은 유지보수하기 어렵게 만듭니다. 모든 if문을 제거할 수는 없습니다. 다만, 대부분의 if문은 다형성을 이용하여서 제거 될 수 있습니다. 다형성을 활용하여 제거 할 수 있는 if문은 2가지 경우가 있습니다. 객체가 다른 상태에 ..