본문 바로가기

[Effective java] equals를 재정의하려거든 hashCode도 재정의하라 equals를 재정의 하면 반드시 hashCode도 재정의하라 여러 컬렉션이 hashCode를 사용하기 때문에 논리적으로 동일한 객체를 사용할 때 hashCode를 재정의 하지 않으면 예상치 못한 결과가 나올 수 있다. - 두 객체가 논리적으로 동일(equals가 true)이면 hashCode는 반드시 같아야한다. - 두 객체가 논리적으로 다르면 hashCode는 가급적 달라야한다. - Equals 비교에서 사용하지 않는 필드는 hashCode 생성시 반드시 제외해야한다. - 요즘은 IDE가 좋으니 가급적 IDE에서 제공하는 자동 생성 기능을 사용하자. hashCode생성 시에 전통적으로 31을 곱해가면서 연산한다. 이유는 잘 모르겠다. 홀수이고 소수이기 때문이라고 하는데.. 짝수를 하면 오버플로우가 나..
[Effective java] equals는 일반 규약을 지켜 재정의하라. 1. 반사성: x.equals(x)는 true 2. 대칭성: x.equals(y) 의 결과는 y.equals(x)와 같아야한다. 3. 추이성: x.equals(y)가 true이고 y.equals(z)가 true이면 x.equals(z)도 true 4. 일관성: 한번 true면 계속 true여야한다. 5. null이 아님: null이 아닌 x에 대해 x.equals(null)은 false여야한다. * 클래스를 상속받아 확장하면서 value를 추가하면 equals를 재정의하면서 일반규약을 지킬 순 없다. : 다시 말해 구체 클래스를 확장해 새로운 값을 추가하면서 equals규약을 지킬 수 있는 방법은 없다. (instanceOf 대신 getClass로 비교해도 되지만 이는 리스코프 원칙을 위반한다) 올바른 ..
java.util.Date와 LocalDateTime java에서는 jdk 1.0부터 지원해오는 시간관련 클래스가 있다. 바로 Date 클래스이다. 오늘날 jdk 버전이 12까지 올라왔고 이 Date 클래스는 여전히 많이 사용되고 있다. 하지만 이 Date 클래스에는 여러 문제점이 있다. 1. 가변적이다. (== not immutable) 2. 포맷이 없다. 3. calendar system이 없다. 4. 월이 1~12가 아니라 0~11이다. (헷갈릴 수 있음) 이런 문제점을 안고 있는 Date 를 보완하기 위해 Calendar 라는 클래스가 추가됐다. 하지만 이 마저 시원치않아 joda와 같은 라이브러리를 사용하기도 했다고 한다. (사용해본적 없음) jdk 8에 이르러서야 비로소 새로운 시간, 날짜 관리 클래스가 선보여졌다. 바로 java.time 패키지..
[Effective java] 생성자 대신 정적 팩터리 메소드를 고려하라 일반적으로 객체 생성은 클래스의 생성자를 활용한다. 이 외에 정적 팩터리 메소드를 사용해서 객체를 반환할 수도 있다. 정적 팩토리 메서드의 장점 1. 이름을 가질 수 있다 어떠한 객체를 생성하는지, 설명해줄 수 있다. 2. 호출될 때 마다 인스턴스를 새로 생성하지는 않아도 된다. 불필요한 객체 생성을 매번 할 필요 없다면 미리 만들어둔 인스턴스를 재활용할 수 있다. 3. 반환 타입의 하위 타입 객체를 반환할 수 있다. 즉, 다형성을 응용할 수 있다. 4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다. 3의 장점을 기반으로 매개변수가 어떤 값이 들어오느냐에 따라 다른 클래스의 객체를 반환할 수 있다. 5. 정적 팩터리 메소드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된..
kotlin & Spring MVC & embeded tomcat으로 서버구성(without xml) github repository: https://github.com/SonEunHo/simple_webapp_with_spring_and_tomcat kotlin으로 Spring MVC+ embeded tomcat 로 구성된 서버를 띄워보겠습니다. 사용할 ide는 intellij, 빌드툴은 gradle입니다. 이걸로 간단히 프로젝트를 만들고 이름은 대충 넣고 설정도 기본설정으로 했습니다. 프로젝트 내부 구성은 이렇게 되어 있는데 코틀린으로 할거닌까 main과 test밑의 java 디렉토리는 제거하겠습니다. 역시 시작은 hello world부터 여기까지 하고 일단 커밋 (https://github.com/SonEunHo/simple_webapp_with_spring_and_tomcat/commit/2a4c..
Autoboxing And Unboxing reference: https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html What it Autoboxing and unboxing? Autoboxing is the automatic conversion that the Java compiler makes between the primitive types and their corresponding object wrapper classes. For example, converting an int to an Integer, a double to a Double, and so on. If the conversion goes the other way, this is called unboxing. 자바..
내가 허리디스크라니 허리디스크 판정을 받았는데 좀 멍하다. 죽을병도 안니고 엄청 심한편은 아니고 어느정도 예상도 하고 있었지만 막상 마주하니 멍하다. 한쪽 판의 신경이 정상 판에 비해 많이 닫혀서 1/10이 남았다고 한다. 운동도 열심히 했고 건강하게 살거라고 생각했는데 자만이었나 ㅋ 수술을 할 지 말 지도 고민이고 어느 하나 정확한, 신뢰할 수 있는 정보가 없다. 답답하다.
Regular Expression ^[a-zA-Z0-9]+@[a-zA-Z0-9].[a-zA-Z]$ 테스트 사이트: https://regex101.com/ 테스트하면서 공부하기 좋다. 정규표현식이란? 정규표현식은 특정 규칙을 갖는 문자열의 집합을 표현하는데 사용되는 형식을 갖춘 문자열이다. A regular expression, regex or regexp (sometimes called a rational expression) is a sequence of characters that define a search pattern. 정규표현식의 각 문자는 meta character(메타 문자)와 regular character(정규 문자)로 나뉜다. 우리가 알고있는 일반적인 문자는 정규 문자에 속한다. 예를 들어 알파벳, 숫자, 독일어 (ä..