Backend/☕️ Java(32)
-
함수형 인터페이스를 사용하여 if 문 제거하기
before 리팩토링 _ EventController.transactReview() 클라이언트 단에서 넘어오는 reviewDto 객체는 action 필드를 가집니다. 그리고 이 action 필드는 ADD, MOD, DELETE 3가지 값을 가지며, 값에 따라 수행되는 메서드가 달라집니다. 즉 DTO 필드 값에 따라 Controller layer 에서 호출해야하는 Service layer 의 메서드가 분기됩니다. public class EventDTO { public static class REVIEW { private String type; private String action; ... } } @PostMapping public ReviewDto transactReview( @Valid @Request..
2022.07.10 -
[Java] toString() 메서드
Object 클래스 자바의 모든 클래스들은 가장 최상위 클래스인 Object 클래스를 상속받는다. 일반적으로 상속은 extends 키워드를 사용하지만, 자바 컴파일러 덕분에 extedns 없이 자동으로 Object 클래스를 자동 상속받게 된다. 즉, 우리가 개발하는 모든 클래스는 자동으로 Object 클래스에 미리 정의된 메서드나 변수를 상속받아 사용할 수 있게 된다. Object.toString() 메서드 Object 클래스에 정의된 메서드로, 객체의 문자정보를 Class(이름)@16진수의 해시 코드로 출력하는 기능을 가진다. public static void main(String[] args) { Sample sample = new Sample(); System.out.println(sample.to..
2022.07.03 -
로컬의 JVM 이 여러 개일 때 발생한 문제 및 해결 (feat. gradle build 에러)
에러 메시지 >>> Could not find tools.jar. Please check that /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home contains a valid JDK installation. 너무 너무 너무 너무 오래 걸린 에러 였다. 자바 환경변수도 다시 고치고 jvm 도 새로 깔아봤는데, 결과적으로 해결방법은 위 에러메시지의 JVM 을 삭제하는 것이다. 상황 ./gradlew build 혹은 ./gradlew clean build 시 발생한 에러였다. $ ./gradlew clean build JAVA_HOME 환경변수에 매칭된 JDK 목록을 확인해본다. $ /usr/libexec/java_home -V | grep..
2022.04.25 -
[Java] split(".") 이 안되는 이유
String[] splitted = "ABC.DEFU".split("."); // 예상 [ABC, DEFU] // 실제 [] suspicious regex expression "." in call to split() 이라는 경고 메시지가 뜬다. 직역하면 "의심스러운 정규 표현식" 이란 말인데, 정규 표현식 자리에 들어간 "." 이 의미가 개발자의 의도와 다르기 때문이다. 정규 표현식에서 comma (.) 는 임의의 문자열을 의미한다. 정규식에서는 특수문자를 대괄호 [] 로 감싸거나, \\ 를 앞에 붙여주어야만 한다. // wrong String[] splitted = "ABC.DEFU".split("."); // right String[] splitted = "ABC.DEFU".split("\\."); ..
2022.04.18 -
[Java] String, StringBuilder 모르고 지나쳤던 점
출처 : https://medium.com/@KosteRico/5-inadequate-java-interview-questions-35390256c79d 5 inadequate Java job interview questions Would you like to work for the company after such questions? medium.com Q. line 1, 2, 3번 줄 중 어느 것이 false 가 나오는가? A. * 처음에는 1번 라인만 false 가 나올 것이라 생각했다. == 동등 연산자 비교는 값의 주소를 비교하기 때문에, new StringBuilder() 객체로 생성된 주소는 String s 와 당연히 다를 것이라 생각했다. 2, 3번 라인은 equals() 메서드로 값 비교..
2022.03.30 -
[Java] Stream과 iterable 의 forEach
우선 자바의 forEach() 메서드는 2가지로 Stream 과 iterable 인터페이스에 각각 정의돼 있습니다. stream 의 forEach() 메서드는 아래 코드처럼 사용할 수 있습니다. for 문을 사용하는 것에 비해 간결하고 가독성있는 코드를 작성할 수 있습니다. Stream 의 forEach() public void streamExample() { String[] numberOfStatus = new String[]{"0", "1", "2", "3"}; Arrays.stream(numberOfStatus).forEach(item -> System.out.println(item)); } 다만 위 처럼 단순 반복을 위해 Stream 의 forEach() 를 사용하면 Stream 생성 비용이 낭비..
2022.02.06 -
[Java] BiConsumer
BiConsumer 란? BiConsumer 는 이름에서 추론할 수 있듯이, 2개(Bi)의 인자를 받고 리턴 값이 없는 함수형 인터페이스를 뜻합니다. 함수형 인터페이스란? 1 개의 추상 메소드를 갖는 인터페이스를 의미합니다. Java8 부터 인터페이스는 디폴트 메서드 (default method) 를 포함할 수 있는데, 다수의 디폴트 메서드가 있더라도, 추상 메서드가 하나라면 함수형 인터페이스라 할 수 있습니다. 왜 함수형 인터페이스 일까요? 구현해야할 추상 메서드가 하나 뿐이기에, 곧 바로 람다식을 만들어 사용할 수 있습니다. BiConsumer 선언부를 보면 1개의 추상메서드(=accept) 가 선언돼 있음을 볼 수 있습니다. 1. 람다식 BiConsumer 는 함수형 인터페이스라 했습니다. 즉 직접..
2022.02.03 -
[Java] String, StringBuilder, StringBuffer 총 정리 (feat. String 의 Stringbuilder 변환)
String vs StringBuffer/StringBuilder 자바에서 문자열을 다룰 때 사용하는 대표적인 클래스로 String, StringBuffer, StringBuilder 가 있습니다. 문자열을 다루는데 서로 다른 3개의 클래스가 존재하는 이유가 무엇일까요? String 의 불변성 String 과 StringBuilder/Buffer 클래스의 가장 큰 차이점은 불변성에 있습니다. 불변성은 이름 그대로 변하지 않는 성질을 의미합니다. 그럼 String 클래스가 불변성을 띈다는 의미는 무엇일까요? String str = "java"; str = str + "chip"; >>> str >>> "javachip" String 클래스는 불변성을 띄기 때문에 변하지 않는다고 했습니다. 그런데 strin..
2022.01.14 -
[Java] 스레드와 멀티스레드 프로그래밍
목차 Thread 클래스와 Runnable 인터페이스 쓰레드의 상태 쓰레드의 우선순위 Main 쓰레드 동기화 데드락 짚고 가야할 개념 프로세스 프로세스는 프로그램이 실행되어 메인 메모리(RAM) 에 로드된 상태를 일컫는 말로, OS 입장에서는 관리해야할 하나의 작업 단위입니다. 스레드 OS 가 관리하는 작업 단위인 프로세스 내부에서(작업공간) 실제로 작업을 처리하는 단위(일꾼)입니다. 프로세스는 메인 메모리에 로드 된다고 하였는데, CPU 로 부터 메모리의 일정 부분을 할당받는 것이라 이해해도 좋습니다. 스레드는 이 할당받은 메모리를 자원으로 삼아 작업을 수행하며 모든 프로세스는 최소 하나 이상의 스레드가 존재한다. 멀티스레딩이란 하나의 프로세스에서 여러 스레드가 동시에 작업을 수행하는 것입니다. CPU..
2021.12.04