본문 바로가기

전체 글

(730)
[Java] Functional api (Jdk8 Version up) 자바8에서 사용되는 Funtional api이다. 자바8에서 람다랑 스트림이 추가되었는데, 왜 추가되었을까? 함수형 프로그래밍을 받아들이기 위해서이다. 1.람다 표현식 람다의 핵심은 지울수있는건 모두 지우자 이다. 모든걸 컴파일러의 추론에 의지하고, 코드로 표현하는 건 다 없애서, 간결하게 만드는 것을 목표로한다. 인터페이스 내 추상메서드가 한개로 정의가 되어있다면, 간략하게 람다식으로 구현을 할수 있다. 이런식으로 interface에 대한 추상메서드가 한개 존재할때, 해당 식을 람다로 간략하게 표현할 수 있다. 그런데 만약에 인터페이스 내 추상메서드가 2개 이상이라면? 이러한 람다식을 사용할 수 없다. 추후 운영 관리를 하다가 만약에 다른 사람이 인터페이스에서 메서드를 한개 추가하면, 해당 기존에 사용..
[Spring] initBinder initBinder는 컨트롤러 레벨에서 들어오는 요청에 다양한 설정이 가능하다 WebDataBinder를 파라미터로 받는 메소드를 사용하고, 특정 컨트롤러 단에서 바인딩이나, 검증 설정을 변경하고 싶을때 사용한다. @InitBinder(“Event”) 요로케 쓰면 Event객체에 대해서만 가능하다 추가로, webDataBinder를 통해서, 커스텀 에디터(특정 날짜필터)등록이 가능하다 만약에 , id에 대한 바인딩을 막고싶다면, 해당 과 같이 선언하게 되면 바인딩은 Null로 잡히게된다. 만약에 특정 객체에 대해서 검증에 대한 벨리데이션을 추가하고싶다면, support에 정의하고 validate에서 사용하면된다. 그리고 이닛바인더에서, event로 한정하고 벨리데이터를 추가하면된다. 벨리데이터를 빈으로 ..
[Spring] SessionLocaleResovler 다국어 처리에 대한 값을 지정할 수있다. 예를 들면, Session에 로케일 정보를 넣을수 있는데 이런식으로 사용할 수 있다. 스프링 5부터는 LocaleResolver이라는 인터페이스를 사용할 수 있다. 구현체로는 SessionLocaleResolver 가 있는데 이는 httpsession에 locale정보를 저장한다. 컨트롤러에서 직접 세션에 로케일 정보를 넣어줄 수도있지만 인터셉터로 이를 구현할 수 도있다. 단, 인터셉터로 이를 구현할때는, 파라미터로 언어값을 넘겨줘야한다. 이런식으로 인터셉터에 대한 빈 선언과, 인터셉터에 추가를 해준다. 메시지 파일은 이렇게 basenames라는 이름으로, message.messageSource로 하게되면, 기본 이름이 된다. 이는 다국어에 필요한 파일이 50개라..
[Effective Java] 3. 싱글톤 패턴 싱글턴이란 객체를 하나만 생성하는 것이다. 인터페이스를 구현한 싱글턴 객체가 아니라면 , mock을 사용하여 테스트 하기 어렵다. 내부 인스턴스를 static final로 두고, private 생성자로서 사용한다면, 내부 static 인스턴스가 초기화 될떄 딱 한번만 privatee 생성자가 돌고, 이 인자는 하나뿐임을 보장한다. 유일하게 인스턴스 get 부분만 public 인경우, instance를 하나만 가지고 있고 이를 return 하는 것을 보장할 수있다. (final) 장점 향후 확장성이 있다. 다른 인스턴스(새로운 인스턴스)가 필요하다면 언제든지 신규 메소드를 추가해서 사용할 수 있다 리플렉션 방어가 된다. setAccessible 를 사용해 private 생성자에 접근 할 수 있는데 이떄 i..
[Effective Java] 2.점층적 생성자 패턴 -> 빌더 패턴 자바 빈즈 패턴 - 생성자를 파라미터 없이 생성하고, setter를 사용해서 관리 하나의 객체를 생성하고 여러개의 메서드를 사용해야한다. 점층적 생성자 - 속성이 늘어날떄마다 생성자 인수를 하나씩 늘려서 사용 인자가 늘어날떄마다 추가 해줘야하는 값이 계속 늘어난다. 빌더 패턴 -빌더 패턴은 넘기는 매게 변수에 따라 자동으로 다른 객체를 생성할 수도 있고 메서드 체이닝으로 어떤 변수에 어떤값을 넣을지를 명시적으로 선언하여 확실하게 객체를 생성할 수있다. 빌더 생성비용때문에, 인자가 4개 이상부터 값어치를 하고, 인자가 많은 객체나 대부분의 인자가 선택적일때 사용하면 유용하다
[Effective Java] 1.생성자 대신 정적 팩토리 메소드를 사용 장점 1. 이름을 가질 수 있다. 2. 같은 파라미터를 가지는 생성자를 여러개 만들수 있다. 3.호출 할떄마다 인스턴스를 새로 생성하지 않아도된다. (미리 만들어놓은 객체를 반환할 수 있다.) 4. 리턴타입의 하위 타입 객체를 반환할 수 있다. 5.입력 매게 변수에 따라 매번 다른 타입의 클래스를 반환할 수 있다. 단점 -상속이 불가 -일반 메서드와 차이가 없기 때문에 찾는데 어려움이 있다 (명명 규칙 of,From, valueof 를 관례상 사용하긴 함)
[Java] 리플렉션, 인터페이스 리플렉션 class객체를 가져온다.생성자를 가져온다.메소드를 가져온다필드를 가져온다. 장점 -프로그램에서 임의의 클래스에 접근 할 수 있다. 생성자,메서드,필드를 조작할 수 있다. 컴파일 당시 존재하지 않던 클래스도 이용할 수 있다. 단점 컴파일 타임 타입 검사를 이용할 수 없다 코드가 지저분 해지고 장황해준다. 성능이 떨어진다. 일반 메서드 호출보다, 리플렉션을 이용한 메서드 호출이 훨씬 느리다. 즉, 속도가 느리고 컴파일 때 잡을수없고, 지저분 해져서 잘 안쓴다 인터페이스는 다중구현이 가능하고, 개발시간 단축(여러명이서할때, 인터페이스를 주고 해당 각자 별도로 구현가능) 인터페이스는 구현을 강제화 하기 때문에, 구현체들의 통일성을 맞출수도있다. 클래스간 결합도를 낮춘다. 단순히 인터페이스만 갈아끼우면 끝
equals와 hashcode차이 String은 new를 사용해서 새롭게 인스턴스를 만들고, 메모리에 올리기 때문에 다른 주소값을 참조하기에 == 연관시에 false가 리턴된다. 예를 들어서 String a. = "3" String b = "4" String c = new String("7") 이면 a == b 이지만 a !=c 이다. String 은 wrapper class이지만, 같은 내용에 대해서는 같은 주소를 바라보게 끔 한다 String constant pool에 등록되기 때문이고 다른 주소값을 보는 c와는 같지 않다는 것을 알 수 있다. hashcode는 해당 주소값을 hashFunction한 값을 출력한다. object에 있는 equals는 해시코드에 대한 비교를 하고 결과를 return한다. 만약에 사용자가 임의로 만든 o..