본문 바로가기

언어

Logback Logback이란? Logback is intended as a successor to the popular log4j project, picking up where log4j leaves off. -> 로그백이란 slf4j 프로젝트 구현체이며, log4j를 대체하는 역할을 한다. 재밌게도 logback의 창시자인 Ceki Gülcü는 log4j의 창시자이기도 하다. log4j를 만들 때의 노하우를 통해 보다 좋은 것을 만들어낸 것이다. Slf4j란? The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, log..
jenv 프로젝트마다 모두 같은 자바 버전을 사용하면 편하겠지만, 아닐 수도 있으니까.. 파트에 블루스께서 알려주셔서 써보니 편한 것 같다. 자바 버전을 여러개 설치해두고 바꿔가면서 사용할 수 있다. https://www.jenv.be/ jEnv - Manage your Java environment jEnv is a command line tool to help you forget how to set the JAVA_HOME environment variable www.jenv.be 혹시 사용에 문제가 있다면 여기 예시 솔루션이 몇가지 있다. https://github.com/jenv/jenv/issues/76 No such file or directory when adding a jdk on freshly i..
자바 클래스 구성 시 주의할 점. 정적 변수는 위에서 아래로 초기화가 진행된다. static class ClassVarTest { static ClassVarTest me = new ClassVarTest(); static int i1; static int i2 = 10; private ClassVarTest() { i1 = i2 -10; } } @Test public void test10() { System.out.println(ClassVarTest.i1); } 어떤 값이 출력될까? 얼핏보면 i1는 0이고 i2는 10이니 생성자의 연산을 통해서 i1에는 0이 저장되는 것으로 보인다. 0이 출력될까? 결과는 -10이 출력된다. 이유는 클래스의 정적 변수를 초기화 하는 순서는 아래와 같다. 1. 모든 정적 변수는 기본값으로 초기화 된다...
자바 자료형 사용 시 주의 1. 무한대 비교는 하지 마라. 아래 코드는 무한루프에 빠진다. public void test1() { double t = Double.POSITIVE_INFINITY; while(t == t+1) { } System.out.println("end"); } 이유는 무한대에 값을 더해도 무한대이기 때문에 == 이 true로 성립 2. NaN을 비교 하지마라. 아래 코드는 무한루프에 빠진다. public void test2() { double t = 0.0/0.0; while(t != t) { } System.out.println("end"); } 이유는 0.0/0.0은 NaN이 나오는데, 이 것은 숫자가 아니라는 뜻이다. 이 값은 본인을 비롯한 어떠한 수와도 일치하지 않는다. 3. 자료형 변환에 주의하라...
자바 표현식 몰랐던 사실 정리 참고: https://en.wikibooks.org/wiki/Java_Programming/Primitive_Types 참고 서적: 자바 퍼즐러 자바 개발자라고 하기에는 자바에 대한 기초 지식이 부족하다고 느낀다. char가 1바이트 일거라고 생각했는데 2바이트라니. 이 김에 정리하자 primitive type type size (bits) min value max value Precision example byte 8 -128 127 From +127 to -128 byte b = 65; char 16 0 2^16-1 All Unicode characters[1] char c = 'A'; char c = 65; short 16 -215 2^15-1 From +32,767 to -32,768 short ..
[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 패키지..