Java Stack/Java
[Effective Java] 7장 람다와 스트림
[Effective Java] 7장 람다와 스트림
2020.02.16[Java] lambda 기본 개념 [Java] Stream API 노트 아이템 42. 익명 클래스보다는 람다를 사용하라 람다의 모든 매개변수 타입은 생략한다. 타입을 명시해야 코드가 더 명확한 경우만 명시 컴파일러가 "타입을 알 수 없다"는 오류를 낼 때만 명시 단, 람다 코드로 명확히 동작을 알 수 없거나 코드 줄 수가 많아지면 람다를 쓰지 않는게 좋다. 람다는 이름도 없고 문서화도 못하기 때문. 함수 객체가 자기 자신을 참조해야 한다면 반드시 익명 클래스를 써야 한다. 람다에서의 `` this``는 바깥 인스턴스를 가리키는 반면, 익명 클래스에서의 `` this``는 인스턴스 자신을 가리킨다. 아이템 43. 람다보다는 메서드 참조를 사용하라 가독성 측면에서 하는 얘기인데, 꼭 메서드 참조가 깔끔하리..
[Effective Java] 6장 enum 타입과 애너테이션 (Annotation)
[Effective Java] 6장 enum 타입과 애너테이션 (Annotation)
2019.12.31[Languages & Frameworks/Kotlin Java] - [Java] Enum 아이템 34. int 상수 대신 enum 타입을 사용하라 Planet.java 자바에서 enum을 뒷받침하는 아이디어는 다음과 같다. enum 타입 자체는 클래스이며, 상수 하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개한다. ```java public enum Planet { MERCURY(3.3, 2.4); 이는 곧 public enum Planet { public static final Planet MERCURY = new Planet(3.3, 2.4); ``` enum 상수는 값 뿐만 아니라 로직도 가지고 있을 수 있다! abstract를 이용해서. Operation...
[Effective Java] 5장 제네릭
[Effective Java] 5장 제네릭
2019.12.11제네릭의 본질은, 런타임에 ClassCastException이 발생하는 것을 막아주어 타입 안전성을 높이는데 있다. 아이템 26. raw 타입은 사용하지 마라 (제네릭 쓸 때 를 빼먹지 않도록 주의해라) raw타입이란 ``java List``가 아니라 그냥 ``List``로, 제네릭을 타입 지정 없이 쓰는 것을 말한다. 이걸로 받으면 아무 타입이나 담을 수 있게 된다. 이는 타입 안전성을 해치게 된다. 예를 들어 List로 캐스팅해서 쓰면, List에 Integer를 넣을 수 있다! ```java List a = new ArrayList(); a.add("qwer"); List b = a; b.add(Integer.valueOf(333)); System.out.println(b.get(0)); Syste..
[Effective Java] 4장 클래스와 인터페이스
[Effective Java] 4장 클래스와 인터페이스
2019.12.05아이템 15. 클래스와 멤버의 접근 권한을 최소화하라 잘 설계된 컴포넌트는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 완벽히 숨긴다. 필요한 것만 public으로 공개한다. 즉, 구현과 API를 깔끔히 분리하고 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 개의치 않는다. 정보 은닉(=캡슐화) 개념. 메서드를 public으로 한다는건, 다른 컴포넌트가 이 메서드를 사용할 여지가 있다는 것이다. 이는 즉, 바꾸고 싶을 때 의존성 때문에 바꾸지 못하는 경우가 생기고, 지속적으로 관리해줘야 된다는 의미가 된다. 그래서 접근성은 가능한 한 낮게 할당하는 것이 좋다. private이라면 내부에서 언제든 변경 가능하기 때문에. 아이템 16. public 클래스에서는 pu..
[Effective Java] 3장 모든 객체의 공통 메서드
[Effective Java] 3장 모든 객체의 공통 메서드
2019.12.04아이템 10. equals는 일반 규약을 지켜 재정의하라 자바에서는 `` ==``의 동작이 두 가지다. 원시 타입에 사용할 경우, 두 피연산자의 값이 같은지 비교 (동등성, equality) 참조 타입에 사용할 경우, 두 피연산자의 주소가 같은지 비교 (참조 비교, reference comparision) equals는 두 객체가 물리적으로 같은가가 아니라 논리적 동치성을 확인해야 할 때 재정의 한다. equals 메서드를 재정의 할 때는 반드시 일반 규약을 따라야 한다. equals 메서드는 동치관계(equivalence relation)를 구현하며, 다음을 만족한다. ```java // x, y, z는 null이 아닌 참조 값이어야 함. Objects.requireNonNull() 사용 권장. 반사성..
[Effective Java] 2장 객체 생성과 파괴
[Effective Java] 2장 객체 생성과 파괴
2019.12.02아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라 GoF에 나오는 팩터리 메서드와는 다르다. public 생성자에 `` new``를 써서 객체를 만드는게 아니라, 아래 처럼 팩터리 메서드를 사용하는 것을 말함. public 생성자와 static factory 메서드는 각자 장단이 있지만, 후자가 유리한 경우가 더 많다. public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 장점0. 같은 메서드 시그니처를 가진 목적이 다른 생성자를 만들 수 있다. 책에는 나와있지 않지만 실제로 이런 경우에도 유용하다. @Data public static class DataArea { private final Strin..
[Java] LocalDateTime : 날짜 시간 처리 관련
[Java] LocalDateTime : 날짜 시간 처리 관련
2019.07.10Date ? Calendar? java.time? 뭘 써야 하나? : LocalDateTime http://tcpschool.com/java/java_time_javaTime https://d2.naver.com/helloworld/645609 LocalDateTime -> String ```java LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) ``` LocalDateTime Json, Spring mapping ```java // spring Controller에서 DATE_FORMAT형식->LocalDate로 받고 싶을 때 @DateTimeFormat(pattern = DATE_FORMAT) private..
[Java] Enum
[Java] Enum
2019.06.06[Effective Java] 6장 열거 타입과 애너테이션 [Java] Enum to Json / Enum to Object https://woowabros.github.io/tools/2017/07/10/java-enum-uses.html enum의 장점은? https://medium.com/@nikitashahu/enum-vs-hashmaps-for-storing-constants-204ef4a1a8d7 code navigator의 도움을 받을 수도 있고, 없는 enum value를 잘못 참조했을 경우 compile time에 잡아낼 수도 있다는 장점도 있음. enum의 단점은? code를 찾아내기 위해 복합키를 사용해야 하는 경우 vs DB) 코드테이블을 사용한다면 PK를 복합키로 지정하여 cons..
[Java] Jackson ObjectMapper Serialization
[Java] Jackson ObjectMapper Serialization
2019.05.15ObjectMapper Configuration SpringBoot가 생성 및 제공하는 ObjectMapper Bean / configuration Spring Boot가 default ObjectMapper Bean 생성 할 때 관여하는 클래스는 `` JacksonAutoConfiguration, Jackson2ObjectMapperBuilder``이므로, 이 두 클래스를 참고하면 기본 설정을 알아낼 수 있다. 역할 org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration -> application.yml의 spring.jackson... 설정 적용. org.springframework.http.converter.json.Jacks..
JVM 관련
JVM 관련
2017.05.05JVM 전체 구조 Class Loader 런타임(최초 호출 시점)에 .class(바이트코드) 읽어 class load Execution Engine Interpreter, JIT 둘 다 사용 Memory Layout PC register JVM level에서 현재 실행하고 있는 instruction의 주소 보관. CPU level의 PC와 기능은 같지만 추상화 수준이 다름. thread 별로 각각 가지고 있음. (CPU register가 thread local 한 것 처럼 당연히) Method Area Memory layout 상 PermGen, MetaSpace 안에 속하는 일부 영역. OS의 text segment와 유사함. (결국 실행 대상 code, instructions를 보관하는 영역이라는 뜻..
[Java] Stream API 노트
[Java] Stream API 노트
2017.03.09Stream API [Languages & Frameworks/Kotlin Java] - [Effective Java] 7장 람다와 스트림 생성, 중개 연산, 최종 연산까지 정리가 잘 되어 있으니 넘기면서 볼 것. 10 subtle mistakes when using the streams api http://iloveulhj.github.io/posts/java/java-stream-api.html 항상 stream이 나이스한건 아니다. for가 더 나이스한 경우가 분명히 존재한다. 구구절절 적기는 좀 애매한데... 아무튼 코드 짜다 보면 느껴질 때가 있음. stream API의 최종 연산 1. 요소의 출력 : forEach(), forEachOrdered() {병렬연산으로 순서 틀어질 때} 2. 요소의..
[Java] lambda 기본 개념
[Java] lambda 기본 개념
2017.02.07Lambda ```java // 기본 형식. 2줄 이상일 때 ( parameters ) -> { expression body } // 별다른 내용 없이 바로 return할 수 있는 경우 ( parameters ) -> expression ``` Lambda를 활용한 Thread 보통 자바에서 Thread는 다음과 같이 Thread로 사용할 class에 Runnable interface를 implements하여 Thread객체에 파라미터로 전달하여 사용한다. ```java class TestThread implements Runnable { @Override public void run() { System.out.println("newTHread"); } } ``` ```java Thread t = new..