본문 바로가기

Programming Language 이해하기/Java 이해하기25

#2 스터디 할래 - 2주차 목표 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다. 학습할 것 프리미티브 타입 종류와 값의 범위 그리고 기본 값 프리미티브 타입과 레퍼런스 타입 리터럴 변수 선언 및 초기화하는 방법 변수의 스코프와 라이프타임 타입 변환, 캐스팅 그리고 타입 프로모션 1차 및 2차 배열 선언하기 타입 추론, var --- 프리미티브 타입 종류와 값의 범위 그리고 기본 값 자바는 사용할 수는 자료형을 크게 2가지로 나눕니다. 1. Primitive Type 2. Referance Type 1. Primitive Type 은 쉽게 우리가 알고 있는 int, long, double, boolean, byte 등이 있습니다. 각각의 타입에 대한 범위는 어떻게 될까? 아니 이 범위를 왜 알아야할까부터 고민.. 2021. 11. 14.
Java LocalDateTime.toString()은 JavaScript에서 어떻게 호환될까? 폴리글랏으로 프로그래밍하며, 여러 언어로된 도메인끼리 메세지를 보내다보니 파일 포맷에 대한 이슈가 있었다. LocalDateTime.now() 를 외부에 전송하게 되면 "2021-11-02T00:05:03.128" 이런식의 String 으로 발송된다. Javascript 에서 이를 호환된 포맷으로 전송하기 위해서는 moment 를 사용할 경우에는 아래와 같은 포맷으로 작성하면 된다. moment.tz('Asia/Seoul').format('YYYY-MM-DD[T]HH:mm:ss.SSS') 참고자료 https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns DateTimeFormatter (Java Pl.. 2021. 11. 2.
#1 스터디 할래 - 1주차 1. JVM이란 무엇인가? JVM 은 Java Virtual Machine 의 약자로서, Java 가 동작될 때 동작될 수 있는 플랫폼을 제공해준다. 이는 즉 다시 말하면 Java로 개발한 프로그램을 컴파일하여 만들어지는 바이트코드를 실행시킬 수 있는 가상머신이다. JVM 의 가장 큰 특징으로는 Write one, Run anywhere 라는 모토이다. 이는 어떤 OS의 제약에도 해당되지 않는 것과 같다. JVM의 컴파일러가 .java 소스파일을 컴파일하면 .class 클래스 파일을 JVM에게 건네주게 되면 JVM이 클래스파일을 메모리에 로드하여 실행할 수 있다. 여기서 컴파일러는 프론트엔드에 속하고, JVM은 백엔드에 속한다. 이말은 위에서 말한것과같이 .java 를 Compiler 를 통해 Compi.. 2021. 10. 30.
객체지향의 재사용성과 다이나믹 디스패치, 더블 디스패치에 관한 이야기 토비의 스프링 저자 이일민님의 유튜브 강의 내용입니다. Dependency 란 무엇인가? - 의존 관계(dependency relationship) - Supplier의 변화가 Client에 영향을 주는 경우 우리는 어떤 것을 보고 의존관계라고 말할 수 있을까? - Supplier가 Client의 빌드일때, - Supplier가 Client 메소드의 파라미터 - Supplier가 Client 로컬 변수 - Supplier로 메세지를 보낼때 Dependency는 재사용가능한 객체지향 설계/개발에 대해서 - Client는 재사용이 어렵다. - Client는 컴포넌트/서비스가 될 수 없다. "컴포넌트란 이를 만든 개발자의 손이 미치지 않는 곳에서도 아무 변경 없이, 필요에 따라 확장해서 사용될 수 있는 소프트.. 2021. 3. 6.
replaceFirst()과 정규표현식의 실수 @Test public void korean_possible_replace() { String target = "다우\\\"기술\" OR\t_xxx:[10 TO 100]"; String regEx = "다우\\\"기술"; // 정규식(regEx)을 패턴으로 만들고, Pattern pat = Pattern.compile(regEx); // 패턴을 타겟 스트링(target)과 매치시킨다. Matcher match = pat.matcher(target); // System.out.println(match.find()); String s = target.replaceFirst(regEx, ""); System.out.println(s); } pat.matcher(target) 은 false가 나옵니다. 이유는 .. 2021. 2. 26.
Character.isDigit() 의 반란...! 사내 서비스를 유지보수하던 중에 있었던 황당한 일이였습니다. Solr 쿼리에 쿼리로서 q를 보내는 중에 숫자 -999 는 자꾸 잘못된 값이라는 버그가 발생. 해당 함수는 아래와 같다. private Literal scanNumber() { StringBuffer sb = new StringBuffer(); while (scanner.hasNext()) { char ch = scanner.next(); if (!Character.isDigit(ch)) { scanner.backward(); break; } sb.append(ch); } if (sb.length() 2021. 2. 26.
예외를 처리하는 Best Practice는 무엇일까?(with. 토비 스프링, 이펙티브 자바) 들어가기 예외를 어떻게 하면 우아하게 처리할 수 있을까? 위 질문의 답을 찾기 위해- 이제부터 토비 스프링의 책 내용과 이펙티브 자바의 내용을 소개하고자 한다. 예외 블랙홀 예외를 잡고 아무 행위도 하지 않는다. 이것은 굉장히 위험한 행위이다. 이런 코드도 마찬가지로 위험한 코드이다 그렇다면? 어떻게 해야될까? 예외를 처리할 때는 모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보돼야 한다. 또한 Throws 는 무의하고 무책임하다. 바로 아래와 같은 코드를 말한다. 위 두 가지 나쁜 습관은 어떤 경우에도 용납하지 않아야 한다. Item77. 예외를 무시하지 말라. - 이펙티브 자바 왜 우리는 예외를 명시하는 이유가 무엇인가? API 설계자에게 메서드 선언에 예.. 2021. 1. 4.
마틴 파울러의 UnitTest 이해하기 - 번역본 원본 사이트 - martinfowler.com/bliki/UnitTest.html bliki: UnitTest Unit Tests are focused on small parts of a code-base, defined in regular programming tools, and fast. There is disagreement on whether units should be solitary or sociable. martinfowler.com 단위 테스트는 소프트웨어 개발에서 자주 언급되며 프로그램을 작성하는 동안 제가 익숙한 용어입니다. 그러나 대부분의 소프트웨어 개발 용어와 마찬가지로 매우 잘못 정의되어 있으며 사람들이 실제보다 더 엄격하게 정의되었다고 생각할 때 종종 혼동이 발생할 수 있습니다... 2020. 10. 18.
기본 타입에 대한 강박관념(primitive Obsession) 에 대한 이해 Photo by Miguel Bruna on Unsplash 리팩토링에 있는 책의 일부분을 저의 의견과 함께 발췌하여 적었습니다. 들어가기 "기본타입에 대한 강박관념" 이라는 개념은 객체를 처음 접하는 경우, 작은 특정 객체를 사용하는 것을 피하고 Primitive Type 만을 사용하려 하는 경향을 말합니다. 여기서 말하는 작은 특정 객체의 사용의 주요 장점은 기본 타입 클래스와 응용 클래스 간의 경계를 허문다는 점 에 있습니다. 그럼 작은 특정 객체라는 것은 어떻게 만드는 걸까? 우리는 이를 더 명시적이고 정확하게 표현하기 위해 행해져야 합니다. 가장 먼저 볼 것은, 데이터 값을 객체로 전환(Replace Data Value With Object) 데이터 항목에 데이터나 기능을 더 추가해야 할 때는 .. 2020. 9. 27.
알아야만 하는 Java.time API 총 정리[실무&고급편] 1. 날짜와 시간 조작하기 1.1. 날짜와 시간을 더하거나 빼는 메소드 LocalDate, LocalDateTime, ZonedDateTime 클래스는 각각 년, 월, 일, 주를 더하거나 뺄 수 있습니다. LocalDateTime currentDateTime = LocalDateTime.now(); LocalDateTime targetDateTime = currentDateTime .plusYears(long) // 년도 더하기 .minusYears(long) // 년도 빼기 .plusMonths(long) // 월 더하기 .minusMonths(long) // 월 빼기 .plusDays(long) // 일 더하기 .minusDays(long) // 일 빼기 .plusWeeks(long) // 주 더하기.. 2020. 9. 20.
알아야만 하는 Java.time API 총 정리[기본편] 들어가기 개발을 하다보면, 언젠간 마주치게 되는 날짜 관련 API. 자바의 경우 날짜 관련된 검색(ex, 7월의 한달은 몃일까?)을 하면 이전에 자바8 이전의 데이터가 비교적 많이 검색됩니다. 또한 Java 8에서 제공해주는 LocalDateTime 관련 API 를 사용하더라고, 그 라이브러리를 잘 모르니까 때문에 언젠간 한번 쯤 정리가 필요하다고 느꼈습니다. 이 포스팅 시리즈는 LocalDate, LocalTime 다 쓸 수 있다고 자부하더라도, Temporal 이 무엇인지 몰라서 헤매는 저같은 사람에게 꼭 필요합니다. 다음 포스팅으로 알아야만 하는 Java.time API 총 정리[실무&고급편] 추가했습니다. 0.LoadMap 기본편에서는 LocalDate, LocalTime, Instant, Dur.. 2020. 9. 20.
자바의 리플렉션(Reflection)을 코드와 함께 이해하기 Photo by Maria Teneva on Unsplash 리플렉션 이해하기 해당 세미나는 외부교육으로 들은 더자바를 수강하고 시작하는 강의입니다. 우리의 최종 목표는 Spring에서 사용되는 DI의 동작원리를 이해하는 것입니다. 내용에 나오는 코드는 여기에서 좀 더 자세히 보실 수 있습니다. 1. 스프링의 Depedency Injection은 어떻게 동작할까? spring init 으로 프로젝트 만들기 book, bookSerivce, bookRepository 생성후 DI 하기. 2. 리플렉션 API - 클래스 정보 조회 Branch> 01-reflection-api-클래스-정보-조회 리플렉션의 시작은 Class https://docs.oracle.com/javase/8/docs/api/java/l.. 2020. 9. 16.
자바의 직렬화(serialization)를 코드와 함께 이해하기 Photo by Casey Horner on Unsplash 회사 사내세미나를 했던 자료를 옮겨왔습니다. 자세한 소스코드는 여기를 참고해주세요. 1. 직렬화란 무엇일까요? serialization (or serialisation) is the process of translating data structures or object state into a format that can be stored (for example, in a file or memory buffer) or transmitted (for example, across a network connection link) and reconstructed later (possibly in a different computer environment.. 2020. 9. 16.
build.gradle 에서 다양한 방식으로 변수 사용하기. 들어가기 다양한 방법들 build.gradle 에서 변수를 사용하는 방식은 아래와 같습니다. 사실 위 System.xxx 의 경우 gradle에서 제공하기 보다는 Java에서 제공한다는 말이 맞습니다. 그러나 제목과 같이 build.gradle 에서 사용하는 방법이므로, 포함시키겠습니다. task printTask(){ println(System.getenv("X_USER")) println(project.getProperties()["X_USER"]) println(System.getProperty("X_USER")) } > "xxx" ./gradlew printTask "xxx" 여기서 xxx 하는 것에 따라서 변수를 다르게 넣을 수 있습니다. System.getenv("X-USER") // 시스템의.. 2020. 9. 4.
Java에서 Jar 와 War 와 의 차이는 무엇일까? 1. 들어가기 스프링 이니셜라이저를 통해 생성하기 위한 선택사항으로 중간에 package 에 Jar, War 가 있다. 여기서 Jar 와 War의 차이를 이해해보려 한다. 2. Jar? War? Jar(Java Archive) / War(Web Application Archive) 위키의 내용을 참고하면 JAR(Java Archive, 자바 아카이브)는 여러개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스(텍스트, 그림 등) 및 메타데이터를 하나의 파일로 모아서 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷이다. ... JAR 파일은 자바 런타임이 효율적으로 애플리케이션을 배치(디플로이)할 수 있는 수단으로 설계되었다. 자바 애플리케이션을 구성하는 클래스.. 2020. 8. 24.
Spring5 를 왜 사용해야되는건가?(with Tody Lee) 우연히 재미있는 유튜브 동영상을 시청했습니다. 구글 알고리즘에 의해서 노출되었는데, 제목에 이끌러 재생 버튼을 눌렀습니다. "자바9와 Spring5로 바라보는 Java의 변화와 도전" youtu.be/BFjrmj4p3_Y 해당 동영상에서 말하는 내용에 제가 느낀바 추가해서 중요하다고 생각되는 부분만 정리했습니다. 그리고 실제로 코드로 작성하는 행위까지 이어질 예정입니다. Spring 5 가 2017년 9월 27일출시됐는데, 지금이 2020년이니까, 3년이 지난 시점에서 여전히 Spring5는 사용하는 곳보다 사용하지 않는 곳이 더 많습니다. 이 글을 쓰는 저 또한 Spring5를 사용해본 경험이 없습니다. 애노테이션 기반의 스프링 버전 4.x 를 베이스로 하는 SpringBoot만 사용해왔습니다. 스프.. 2020. 8. 23.
자바8 inAction - [12] 새로운날짜와시간API 새로운 날짜와 시간 API 자바8에서 새로운 날짜와 시간 라이브러리를 제공하는 이유 사람이나 기계가 이해할 수 있는 날짜와 시간 표현 방법 시간의 양 정의하기 날짜 조작, 포매팅, 파싱 시간대와 캘린더 다루기 자바 1.0 에서는 java.util.Data 클래스 하나로 날짜와 시간 관련 기능을 제공 Date date = new Date(114, 2, 18); > Tue Mar 18 00:00:00 CET 2014 Date 는 JVM 기본시간대인 CET, 즉 중앙 유럽시간대를 사용, 그렇다고 Data클래스가 자체적으로 시간대 정보를 알고 있는 것도 아니다. Data 대신 Calendar 클래스가 등장 했지만, 역시 쉽게 에러를 일으키는 설계 문제를 갖고 있었다. 예를 들어 Calendar에서는 1900년도.. 2019. 8. 31.
자바8 inAction - [10] Null 대신 Optioanl null 대신 Optioanl null 래퍼런스의 문제점과 null을 멀리해야 하는 이유 null 대신 Optioanl: null로부터 안전한 도메인 모델 재구현하기. Optioanl 활용: null 확인 코드 제거하기. Optional에 저장된 값을 확인하는 방법 값이 없을 수 있는 상황을 고려하는 프로그래밍 null은 구현하기 쉬웠기 때문에 존재했던 것이지, 의도했던 것은 아니다. 00. 값이 없는 상황을 어떻게 처리할까? public String getCarInsuranceName(Person person){ if(persion != null) { Car car = person.getCar(); if(car != null) { Insurance insurance = car.getInsurance().. 2019. 8. 31.
자바8 inAction - [9] Default method 이해하기 디폴트 메서드 디폴트 메서드란 무엇인가? 진화하는 API가 호환성을 유지하는 방법 디폴트 메서드의 활용 패턴 해결 규칙 자바8에서는 기본 구현을 포함하는 인터페이스를 정의하는 두 가지 방법을 제공한다. 첫 번째는 인터페이스 내부에 정적 메서드(static mathod)를 사용하는 것 두 번째는 인터페이스의 기본 구현을 제공할 수 있도록 디폴트 메서드 라는 기능을 사용하는 것 즉, 자바8 에서는 메서드 구현을 포함하는 인터페이스를 정의할 수 있다. 결과적으로 기존 인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메소드의 디폴트 메서드를 상속받게 된다. 이렇게 하면 기존의 코드 구현을 바꾸도록 강요하지 않으면서도 인터페이스를 바꿀 수 있다. 결국 인터페이스가 아니라 추상 클래스 아닌가? 인.. 2019. 8. 31.
자바8 inAction - [8] 리펙토링/테스팅/디버깅 - 자바8 더 잘 사용하기 리팩토링 / 테스팅 / 디버깅 람다 표현식으로 코드 리펙토링하기 람다 표현식으로 객체지향 설계 패턴에 미치는 영향 람다 표현식 테스팅 람다 표현식과 스트림 API 사용 코드 디버깅 람다표현식으로 전략 / 템플릿 메서드 / 옵저버 / 의무 체인 / 팩토리 등의 객체 지향 디자인 패턴을 어떻게 간소화할 수 있는지 살펴보기. 코드 가독성이 좋다는 것은 추상적인 표현이므로 이를 정확하게 정의하기 어렵다. 일반적으로 코드 가독성이 좋다는 것은 '어떤 코드를 다른 사람도 쉽게 이해할 수 있음'을 의미, 즉 코드 가독성을 개선한다는 것은 우리가 구현한 코드를 다른 사람이 쉽게 이해하고 유지보수 할 수 있게 만드는 것. 1. 익명 클래스를 람다 표현식으로 리팩토링 하기 Runnable r1 = new R.. 2019. 8. 31.