분류 전체보기: 2105개의 글
[Java] StartsWith/EndWith : 문자열의 시작/끝 부분과 특정 문자열이 일치하는지 확인하기 String.StartsWith 메서드 - 문자열 인스턴스의 시작 부분과 지정한 문자열이 일치하는지를 확인한다. String str = "오늘은 날씨가 추워요, 따뜻하게 입어야해요"; String value1 = "오늘"; String value2 = "날씨"; boolean bool1 = str.StartsWith(value1);// true boolean bool2 = str.StartWith(value2);// false 매개변수(value) - String : 인스턴스의 시작 부분에 있는 부분 문자열과 비교할 문자열 반환 - Boolean : 인스턴스의 시작과 일치하면 true, 그러지 않..
Java는 C언어처럼 포인터가 없어 메모리의 주소와 해당 값을 함께 볼 수 없는 단점이 너무 너무 너무~ 크다 ! Java 문서나 많은 글을 읽어도 메모리의 구조가 어떻게 어떤 흐름으로 돌아가는 지 내가 알고 있는 이 답이 확실한가에 대한 의문도 많이 든다. StringBuffer의 append 메소드를 사용할 때, 어떤 식으로 값이 메모리에 할당되고 흘러가는 지 내가 이해한 바를 정리하고자 한다. StringBuffer sb = nes StringBuffer(); sb.append("a"); sb.append("b"); 단순 참조를 위한 문자열은 String 클래스, 연산이 많은 경우는 가변적으로 문자열을 저장하고 관리하는 StringBuffer 클래스를 사용한다. 위 코드와 같은 경우, 다음과 같은 ..
차이점 String 과 StringBuffer(StringBuilder), 두 클래스 모두 문자열을 담고 연산하는 것인데 차이가 뭐지? 성능이 어떻게 다르지? 궁금했던 분들에게 그 차이점을 스윽 정리해드리고자 한다! 아래 표를 보면 된다 ! String StringBuffer StringBuilder 문자열을 저장하고 관리하는 클래스 immutable (불변) mutable (가변) new 연산을 통해 생성되면 그 인스턴스의 메모리 공간은 절대 변하지 않는다. 문자열 연산을 했을 때, 메모리 공간이 변하는 것이 아닌 새로운 String 객체를 만드는 것이다. 문자열 연산에 있어서 new로 객체 생성을 한번 한 후, 연산이 필요할 때 크기를 변경시켜 문자열을 변경한다 동기화(Synchronized)를 지원..
String 문자열 생성 방식 String str1 = new String("Hello"); String str2 = "Hello"; String str3 = "Hello"; 1. new 이용한 문자열 생성 2. 문자열 리터럴 생성 두 방식의 차이점 두 방식의 가장 큰 차이점은 메모리 영역에 있다. new 연산자를 통해 String을 생성하면 Heap 영역에 존재하게 되고, 리터럴을 이용할 경우 string constant pool이라는 영역에 존재하게 된다. (아래 그림 참고) 똑같은 "Hello" 문자열을 사용하는 데 변수 str2 와 str3은 같은 객체를 바라보지만 new String으로 생성한 str1은 다른 메모리 주소의 객체를 바라보는 것이다. 문자열을 비교해보면, String str1 = ..
Java 버전별 특징들을 찾아보면서 좋은 글이 있어 해당 글을 정리한 포스팅입니다. 따라서 잘못된 내용이 존재할 수 있습니다! 어떤 자바 버전을 사용해야 할까? 최신 Java 버전은 이제 6개월마다 따른다. 수많은 새로운 버전이 출시됨에 따라 기본적으로 다음과 같은 사용 시나리오가 존재 기업의 기존 프로젝트에서는 Java 8을 사용해야 하는 경우가 많음 일부 레거시 프로젝트는 Java 1.5(2004년 출시) 또는 1.6(2006년 출시)에서 중단되기도 함 최신 IDE, 프레임워크 및 빌드 도구를 사용하고 그린 필드 프로젝트를 시작하는 경우 Java 11(LTS) 또는 최신 Java 17 LTS를 망설임 없이 사용할 수 있다. 안드로이드 개발의 특별한 분야가 있는데, 자바 버전은 기본적으로 자바 7에 고..
Spring + Webflux Webflux (Reactive) 를 이해하기 위해 sync, async, blocking, non-blocking 차이를 이해해야 했고, async 한 코딩을 위해 CoroutineScope 를 사용하면 편리하다는 점을 알게 되었습니다. Webflux 를 이해하기 위해 일반 sync + blocking 코드를 async + non-blocking 코드로 변환해가며 이해하고자 노력하였습니다. #1 Sync 코드 아래 코드를 보면, 1~3 까지 출력을 두번 합니다. 첫번째 loop문이 끝나야 두번째 loop문을 실행합니다. 순서대로 코드가 실행되며 (sync), 앞의 loop문은 뒤의 loop문을 blocking 한다고 볼 수 있습니다. (1..3).forEach {..
Scouter 신버전 (2.10.0) 에서 WebFlux 를 지원한다고 한다. 다음에 써봐야지! --- 많은 팀, 회사에서 Webflux 를 도입, 테스트, 실패(?) 등을 겪는 이야기를 많이 듣고 있다. 왜 도입을 시도하고, 어떤 이유로 실패를 하는지 등에 대해 정리해보고자 한다. 이론과 실전은 다르기에, 직접 스트레스 테스트를 진행해 보았고, Thread 구조, CPU 사용량, Memory 사용량, 응답시간 등을 보며 이해하고자 노력했다. 알아보고자 하는 내용 1. Webflux (nio) 는 MVC (bio) 보다 빠를까? 2. webflux 에 blocking 로직이 들어가더라도 MVC 보다 빠를까? (blocking: JDBC query 실행 같은 Async 를 지원하지 않는 로직을 의미..
자바 8의 함수형을 이용하면 가독성 있는 한 줄의 코드로 그룹화를 구현할 수 있다. 예를 들어 고기를 포함하는 그룹, 생선을 포함하는 그룹, 나머지 그룹으로 메뉴를 그룹화할 수 있다. 팩토리 메서드 Collectors.groupingBy를 이용하자. Map dishesByType = menu.stream().collect(groupingBy(Dish::getType)); {FISH=[parawns, salmon], OTHER=[french fries, rice, season fruit, pizza], MEAT=[pork, beef, chicken]} Dish.Type과 일치하는 모든 요리를 추출하는 함수를 groupingBy 메서드로 전달. 이 함수를 기준으로 스트림이 그룹화되므로 이를 분류 함수(cla..
컬렉터란 무엇인가? Collector 인터페이스 구현은 스트림의 요소를 어떤 식으로 도출할지 지정한다. 명령형 코드에서는 문제 해결하는 과정에서 다중 루프와 조건문을 추가하며 가독성과 유지보수성이 크게 떨어진다. 반면 함수형 프로그래밍에서는 필요한 컬렉터를 쉽게 추가할 수 있다. 고급 리듀싱 기능을 수행하는 컬렉터 collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의할 수 있다는 점이 컬렉터의 최대 장점이다. 스트림에 collect를 호출하면 스트림의 요소에 (컬렉터로 파라미터화된) 리듀싱 연산이 수행된다. 내부적으로 리듀싱 연산이 일어나는 모습 명령형 프로그래밍에서는 우리가 직접 구현해야 했던 작업이 자동으로 수행된다. collect에서는 리듀싱 연산을 이용해서 스트림의 각 요소를 ..
메뉴의 칼로리 합계를 reduce로 구할 수 있다. int calories = menu.stream() .map(Dish::getCalories) .reduce(0, Integer::sum); 사실 위 코드에는 박싱 비용이 숨어 있다. 내부적으로 합계를 계산하기 전에 Integer를 기본형으로 언박싱해야 한다. int calories = menu.stream() .map(Dish::getCalories) .sum(); 위와 같이 sum 메소드를 호출 할 수 없을까? map 메서드가 Stream를 생성하기 때문에 불가능 하다. 스트림의 요소 형식은 Integer 지만 (Stream) 인터페이스에는 sum 메서드가 없다. 다행히 스트리 API 숫자 스트림을 효율적으로 처리할 수 있도록 기본형 특화 스트림(p..