본문 바로가기

Java

(24)
자바8 - 4장.스트림 소개 (Stream) 책을 읽기전에 나는 자바8 스트림 API 사용법만 찾아보고 제대로 된 이해를 하지 않았다. 그래서 책을 읽게 되었고 자세히 알아보려 한다. 자바에서 많이 사용되는 것 중 하나가 컬렉션이다. SQL WHERE 절과 같은 역할을 자바에서 한다면? 커다란 컬렉션을 자바에서 어떻게 효율적으로 처리할까? 1. 스트림이란 무엇인가? 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. List lowCaloricDishesName = menu.stream() .filter(d -> d.getCalories() 변하는 요구사항에..
Java 8 - stream 예제 모음 String list -> string 사이사이에 코마 넣기 return cjtoneOrderResponse.getCoupons().stream().map(OrderResponse.Coupon::getOrderSales) .collect(Collectors.joining(","));
ThreadLocal이란 사용자 별로 변수를 관리하고 싶은 경우가 있을 것이다. 아래와 같이 구현하면 컨트롤러는 빈 관리를 Singleton으로 하기 때문에 melon은 매번 재사용되며 요청때마다 증가하게 된다. @RestController public class ShoppingController { private int melon; @RequestMapping("/") private String test() { this.addMelon(); return String.valueOf(melon); } private void addMelon() { melon++; } } 그렇다면, 사용자별로 melon의 숫자가 증가하려면 어떻게 해야할까? ThreadLocal 사용하기 아래와 같이 사용하면 Thread별로 저장소가 생성된다. pub..
6. Enums and Annotations - Effective Java 3th 자바에는 enum과 annotation이라는 것이 있다. 이번 챕터에서는 이 두가지를 잘 사용하는 방법에 대해 살펴보자. Item 34 : int 상수 대신 enum을 사용하자 기본적인 상수만 있는 enum 말고 동작이 필요한 Enum을 만든다면? 가장 기본적인 구현방법은 아래와 같을 것이다. // Enum type that switches on its own value - questionable public enum Operation { PLUS, MINUS, TIMES, DIVIDE; // Do the arithmetic operation represented by this constant public double apply(double x, double y) { switch(this) { case ..
10. Exceptions ( 예외 처리 ) - Effective Java 3th 예외처리는 적절하게 사용하면 가독성, 안정성이 올라가지만, 적절하게 사용하지 않으면 오히려 잘못된 길로 가게 된다. Item 69. 예외 상황을 위해서만 예외처리를 하여라. // Horrible abuse of exceptions. Don't ever do this! try { int i = 0; while(true) range[i++].climb(); } catch (ArrayIndexOutOfBoundsException e) { } 위의 코드는 결국 range 범위를 넘어가면 exception을 발생시킬 것이다. 하지만 이 코드는 결국 아래와 같다. for (Mountain m : range) m.climb(); Exception은 이름 그대로, 예외 상황을 위해서만 사용되어야지 원래 control ..
Jaxb 하면서 있었던 이슈 Getter랑 변수랑 둘다 XmlAttribute로 인식해서 중복 https://codeday.me/ko/qa/20190428/403414.html java – 같은 이름을 가지는 Jaxb 객체 - 코드 로그 동일한 이름의 2 개의 다른 jaxb 객체를 비 정렬 화하는 것이 가능하게되는 것처럼 보입니다. Bar 클래스가 있습니다 … public abstract Bar { private @XmlElement String val; } .. 두 가지 구현 (생성자 등 생략) : @XmlRootElement(name="bar") public class BarA extends Bar { } @XmlRootElement(name="bar") public class Bar codeday.me https://coded..
디자인패턴8-전략 패턴/스트래티지 패턴(Strategy Pattern) 제목만 보면? 전략 패턴? 뭔가 전략이 자주 바뀌는 즉, 특정 행위가 바뀌는 상황에서 쓰면 좋은 패턴인 것 같다. 일을 하는 방식, 비즈니스 규칙, 문제를 해결하려는 알고리즘을 쉽게 바꿔주기 위한 규칙인 것 같다 요구 사항 여러가지 로봇이 있는데 각자 공격 방식과 이동 방식이 다르다. 이를 모델링 해달라! 기존의 나였다면? 나름 부모 클래스를 만들어서 move(), attack() 함수를 정의하고 구체적인 구현은 자식 클래스에게 맡겼을 것이다. 나의 개발 완벽하니? Atom과 TaekwonV는 move() 방식이 같은데 코드가 중복! ( 나중에 걷는 방식이 구체화되고 수정해야 된다면 2번 수정! ) 새로운 로봇을 구현하는데 move()나 attack() 방식이 같은 경우도 중복 발생! Atom을 걷는 방..
Java8 람다(Lambda) 제대로 쓰기 람다 왜 알아야되나? Java8 이상 버전을 사용하더라도 람다를 몰라도 된다. 하지만 이는 좋은 장비를 사놓고 좋은 기능을 쓰지 않는 것과 비슷하다. 아래의 예제를 먼저 살펴보자. 특정 조건을 만족하는 주문을 보여주는 프로그램이다. 처음에는 특정 가격보다 비싼 주문을 보여달라고 했다. 하지만 고객이 이름으로도 조회를 해달라고 한다면? 계속 해당 코드에 메소드를 추가하고 수정해야 한다. 동적 파라미터화 말그대로 파라미터로 어떤 행위를 전달하는 것이다. 위의 예제에 적용해보면 특정 조건을 만족하는지에 대해 체크 해주는 행위를 파라미터로 넘기는 것이다. ( 마치 전략 디자인 패턴과 같다. ) 아까 작성한 함수를 조금 리팩토링 해보자. 파라미터로 특정 조건을 체크해주는 행위를 받았다. 그럼 아래와 같이 coll..
디자인패턴7 - Proxy pattern(프록시 패턴) Proxy 뜻? proxy를 번역을 해보면 대리인,대리(권)이라 나온다. 대리로 무언가를 해줘야 할 때 필요한 패턴인 것 같다. 즉, 비즈니스 코드에 트랜잭션, 로깅, 인가처리 등과 같은 부가기능을 적용해야 할 때 쓰는 패턴이다. Proxy 패턴 예제 testService findAll() 이전과 이후에 어떤 기능을 적용하고 싶을 때 아래와 같이 코드를 작성하면 된다. 데코레이터 패턴과 유사하나, 데코레이터 패턴은 상속 없이 새로운 기능을 추가하기 위해 래핑하는 것이다.
디자인 패턴6 - 옵저버 패턴(Observer pattern) 옵저버 패턴(Observer pattern)뜻을 보면 뭔가 변화가 발생하면 어떠한 행위를 해야할 때 쓰는 패턴 같아 보인다. 즉, 한 객체의 변화에 따라 다른 객체의 상태도 연동되도록 1:다 객체 의존관계를 구성할 때 사용된다. 데이터 변경이 일어나면 어떠한 행위가 일어나야 한다. 만약에 생각없이 코딩을 한 경우 아래와 같이 짤 것이다. onChanged() { // 변경이 일어난 경우class1.function();class2.function();....} 이렇게 되면 1. class1의 function()이 변경된 경우 해당 클래스까지 수정해야 되므로 OCP에 위반된다.2. 변경이 일어난 경우 어떠한 행위를 추가해야 한다면??? 해당 클래스 전체가 바뀌어 버린다..... ( 말도 안되는 재사용성.....