java
-
[mac] java 터미널 버전 변경하기java 2022. 3. 27. 12:20
들어가며 사내에서 사용하는 java 버전은 1.8과 11이다. 각 프로젝트마다 java 버전을 설정해 컴파일할 수 있도록 intellij가 옵션을 제공해서 큰 불편함 없이 사용할 수 있다. 최근에 이러한 걸 크게 신경쓰지 않고 개발하다가 운영환경에서 빌드 할 때 에러를 맛보았다. 바로 프로젝트 빌드 결과물을 외부 저장소에 올릴 때 생긴 문제였다. 로컬에서 컴파일한 .jar파일을 외부에 올리는데 이때 컴파일하는 건 터미널에 설정된 java버전으로 하게 된다. 1.8로 빌드해야할 프로젝트를 11버전으로 빌드한 후 외부저장소에 올리고 그걸 다운받아 사용하는 프로젝트에서 버전이 맞지 않아 컴파일 오류가 발생하게 된 것이다. 서론이 길었는데 시스템의 java 버전을 확인하고 바꾸는 방법을 남겨보자. 버전 확인하기..
-
[java] 슈퍼타입토큰(super type token)java 2022. 1. 1. 16:25
모든 글은 토비의 봄 채널을 보며 작성하였습니다. https://www.youtube.com/watch?v=01sdXvZSjcI&t=1973s&ab_channel=TobyLee 배경 RestTemplate를 사용하다보면 파라미터바인딩을 위한 타입토큰을 넘겨주는 부분에서 생소한 ParameterizedTypeReference를 사용한 걸 볼 수 있다. 클래스 이름과 생김새를 보면 대충 아 바인딩 되길 원하는 타입을 저 안에 넣고 요청을 날리면 되겠구나 싶다. 근데 이상한 건 생성자로 성성했는데 왜 마지막에 {}가 붙냐는 것이다. 이번 기회에 파헤쳐보자. 타입토큰(Type Token) RestTemplate을 통해 요청을 보낼 때 그 반환 타입을 타입토큰 형식으로 넘겨주는 걸 볼 수 있다. RestTempl..
-
Future 클래스 정리java 2021. 6. 3. 10:49
배경 Java concurrent 패키지에 Future라는 클래스가 있다. 한 스레드에서 non-blocking방식으로 메서드롤 수행할 때 그 결과값을 받아올 수 있는 방식을 정의한다. 실습하며 자세히 이해해보자. Non-blocking으로 실행 main스레드에서 먼저 start를 찍고 새 스레드1을 이용해 new Thread를 찍도록 작업한다. 이후 다시 main스레드에서 end를 찍으며 작업을 마무리하는데 결과를 확인하면 end가 new Thread보다 먼저 찍혀 non-blocking으로 작업이 수행되었음을 확인할 수 있다. Future를 이용해 결과 받아오기 이번엔 submit()함수를 사용해 반환값을 지정할 수 있는 Callable을 람다로 넘겨 Future객체를 리턴받았다. (Callable은..
-
Generics와 wildcardjava 2021. 6. 1. 10:42
배경 Java 5부터 나온 Generics는 매우 빈번하게 사용하는 문법이다. Spring코드를 좀만 들여다봐도 Generics를 사용하지 않은 클래스를 찾는 게 더 어려울 정도다. 기초적인 부분은 생략하고 복잡한 문법이나 주의사항에 대해 짚고 넘어가보자. 토비님의 유튜브를 보며 정리했다. https://www.youtube.com/watch?v=ipT2XG1SHtQ&list=PLv-xDnFD-nnmof-yoZQN8Fs2kVljIuFyC&index=12 https://docs.oracle.com/javase/tutorial/extra/generics/morefun.html Generics를 사용하는 이유 컬렉션에 데이터를 보관할 때 클래스 단위로 작업을 하는 경우가 많다. 위 예시의 경우 머릿속에서 St..
-
Stream 정리 및 예제java 2021. 5. 29. 10:50
배경 https://stackify.com/streams-guide-java-8/ 위 글 변역하며 공부 Introduction stream은 datasource의 래퍼클래스이며 대용량 처리를 간편하고 빠르게 작업하도록 도와준다. stream은 데이터를 저장하지 않으므로 자료구조라고 보는 건 부적절하며 원본datasource를 변경하지 않는다. Stream Creation of() 외에도 스트림을 만드는 다양한 방법이 있고 배열이 아니더라도 컬렉션을 통해 스트림을 만들 수 있다. Stream Operation forEach forEach()는 하나의 스트림을 소모하면서 그에 맞는 action을 수행하므로 Cunsumer 콜백을 전달하면 된다. forEach()는 종결스트림함수로 호출하면 더이상 새로운 연산..
-
Optional 정리java 2021. 5. 28. 20:23
배경 https://stackify.com/optional-java/ 위 글 번역하며 정리 Overview Optional이 설계된 주된 이슈는 자바에서 매우 중요한 NullPointerException을 안전하게 다루기 위함이다. 우선, Optional은 값을 래핑하는 클래스다. 값이 비어 있거나 객체로 채워져 있을 수 있다. Optional은 함수형 프로그래밍과 밀접하게 연관되어 있다. Optional 객체 만들기 빈 객체 empty() static 메서드를 통해 미리 만들어둔 불변 객체를 반환한다. empty인 상태에서 get()을 호출하면 NoSuchElementException이 발생함을 알 수 있다. 또한 Optional의 value는 final이 붙은 불변객체이므로 미리 만들어둔 empty(..
-
Inner class와 static 조합java 2021. 5. 27. 10:41
배경 HashMap 내부를 공부하다보면 수많은 inner class가 정의된 걸 볼 수 있다. Effective Java 아이템 24에서도 inner class에 대한 조언을 주는데 왜 inner class를 사용하며 적절한 사용을 위해 어떤 걸 알아야 하는지 공부해보자! 왜 쓰지? 돌고돌아 공식문서까지 왔다. 내용을 확인해보자. - 어떤 클래스가 한 클래스에서만 유용하게 쓰인다면 물리적으로 하나의 클래스로 묶을 수 있다. - private수준에서도 내부클래스는 외부클래스 맴버 또는 메서드에 접근할 수 있기 때문에 캡슐화에 용이하다. - 가독성이 좋고 유지보수가 쉬운 코드를 작성할 수 있다. Map은 key와 value를 논리적으로 하나의 쌍으로 묶은 자료구조다. 상황에 따라 key만 다루고 싶은 경우가..
-
Effective Java 모든 객체의 공통 메서드java 2021. 5. 25. 12:01
equals()는 일반 규약을 지켜 재정의하라 equals()를 오버라이딩하지 않는다면 위처럼 모든 클래스가 위 equals()를 상속받는다. == 비교로써 두 객체 인스턴스가 물리적으로 동일한 객체인 경우만 true를 반환한다. equals()를 오버라이딩할 때는 사이드이팩트가 많아서 주의를 기울이거나 아예 오버라이딩하지 않길 권장한다. 그래도 물리적인 비교가 아닌 논리적 비교가 필요한 경우가 있으니 주의사항을 알아보자. 반사성(reflexivity) x.equals(x)는 반드시 true를 반환하여야 함을 말한다. 의도적으로 false를 반환하지 않는 한 이 규약은 지켜질 거고 직관적으로 이해해기 어렵지 않다. 대칭성(symmetry) 객체를 비교할 때 교환법칙이 성립해야함을 의미한다. 즉, x.eq..