728x90
반응형

Backend/Java 26

자바 String vs StringBuilder 비교: 불변성과 JDK 버전별 동작 원리

자바를 처음 배울 때 "String은 불변(Immutable) 객체라 + 연산자로 문자열을 더하면 메모리 낭비가 심하니 무조건 StringBuilder를 쓰세요!"라는 말을 많이 들어보셨을 거예요.저 역시 신입 시절에는 이 규칙에 강박을 가져서, 가벼운 문자열 두세 개를 합칠 때도 코드를 길게 늘여가며 StringBuilder를 썼던 기억이 납니다. 하지만 실무에서 코드를 까보고 여러 레퍼런스를 찾아보면서, 자바 컴파일러가 JDK 버전에 따라 이 + 연산을 꽤 똑똑하게 최적화해주고 있다는 사실을 알게 되었어요.오늘은 String과 StringBuilder의 근본적인 차이를 짚어보고, JDK 버전별로 문자열 더하기 연산이 내부적으로 어떻게 동작하는지 저의 경험과 함께 공유해 드릴게요!1. String과 S..

Backend/Java 2026.03.19

[Java] Stream vs For 문, 무엇을 써야 할까? - 성능, 메모리, 그리고 Clean Code

지난 글에서는 Java Stream의 개념과 동작 원리에 대해 알아보았습니다.스트림은 코드를 우아하게 만들어주는 강력한 도구지만, 현업에서 코드를 짜다 보면 항상 이런 고민에 부딪힙니다."이거 그냥 For 문 돌리는 게 더 빠르지 않나?" "Stream을 남발하면 메모리 문제가 없을까?" 오늘은 개발자들 사이의 영원한 논쟁 주제인 [For 문(Enhanced For Loop) vs Stream API]를 성능, 메모리 구조(Stack/Heap), 그리고 유지보수성 관점에서 깊이 있게 비교해 보겠습니다.1. 성능: 속도는 누가 더 빠를까?결론부터 말씀드리면, 단순 반복 처리 속도는 For 문이 더 빠릅니다.왜 For 문이 더 빠를까?컴파일러 최적화: For 문은 자바 언어 탄생부터 존재한 가장 기본적인 문..

Backend/Java 2026.02.05

[Java] 자바 스트림(Stream) - 스트림의 정체와 핵심 원리

Java 8이 등장하면서 자바 생태계에는 큰 변화가 있었습니다.(물론 지금은 20번대가 등장하지만...)람다(Lambda)와 함께 등장한 스트림(Stream API)은 우리가 코드를 작성하는 스타일을 완전히 뒤바꿔 놓았죠.하지만 막상 스트림을 쓰다 보면 "이게 그냥 for문보다 편해서 쓰는 건가?", "내부적으로 어떻게 돌아가는 거지?"라는 의문이 들 때가 있습니다.이번 시리즈에서는 총 2편에 걸쳐 자바 스트림을 깊이 있게 파헤쳐 보려 합니다.1편: Stream이 무엇이며, 어떤 원리로 동작하는가? (현재 글)2편: Stream vs For 문, 성능과 Clean Code 관점에서의 비교그럼, 스트림의 세계로 들어가 보겠습니다.1. 스트림(Stream)이란 무엇인가?스트림은 자바 8부터 추가된 기능으로,..

Backend/Java 2026.02.05

[Java] 가장 효율적인 List 초기화 방법과 상황별 패턴 정리 (불변 vs 가변)

Spring 프로젝트(특히 Spring Security) 코드를 작성하다 보면 다음과 같은 형태의 코드를 자주 마주치게 됩니다.return Collections.singleton(new SimpleGrantedAuthority("ROLE_USER")); "그냥 new ArrayList를 쓰면 되지, 왜 굳이 Collections.singleton을 사용할까?"라는 의문이 드실 수 있습니다.게다가 이 반환값을 받아서 무심코 .add()를 호출했다가는 UnsupportedOperationException이라는 런타임 에러를 만나게 됩니다.오늘은 실무에서 자주 헷갈리는 Java List의 가장 효율적인 초기화 방법들과 '수정 가능(Mutable)' 여부를 명확하게 정리해 드리겠습니다.1. 불변(Immutabl..

Backend/Java 2026.02.02

[SMTP] 메일에서 base64 이미지 깨지는 현상 CID로 해결해보기

개요사내 메일 서비스 내에서 태그에 base64로 이루어진 이미지들이 깨지는 현상이 발견되었다.원인을 찾아보고자 사내 메일 서비스 담당자에게 연락을 취했으나"base64를 사용하는 이미지는 지원하지 않으며 https로 되어있는 url을 직접 걸어 이미지를 붙이면 됩니다." 라는 답변을 받았다하지만 현재 MSA의 서비스 구성상 https로 열려있는 파일 서비스가 없었으며, gateway를 제외한 서비스는 모두 내부망으로 되어있다.gateway를 통해 파일 서비스의 특정 디렉토리의 파일만 접근 가능하게 구현은 할 수 있으나 이런 방식은 올바른 형식이 아니라 판단되어 다른 방법을 고민했다.해결 방안메일 서비스에서는 CID(Content ID)라는 기능이 있었다.메일 본문 내에 포함된 이미지에 고유 식별자를 ..

Backend/Java 2025.11.11

[java] 한/영 타자 전환 클래스 만들기

최근 보안팀에서 Password에 개인 정보가 포함될 경우에는 패스워드 변경이 불가하게 해 달라는 지적사항이 들어왔다.2025년에 아직까지도 안막아둔게 이상하긴 하지만... 부랴부랴 로직을 짜기 시작했다.근데 개인 정보가 포함되지 않게 하려면 사람 이름도 포함이 되면 안 되는데, DB에 이름은 한글로 저장이 되어있으니 이것을 판단하려면 한/영 타자 전환 클래스를 만들어서 판단해야 했다.그래서 한글 -> 영어 변환 클래스를 만들었다.구현 public class KoreanToEnglishHelper { final static char[] initialConsonantList = {'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', '..

Backend/Java 2025.09.30

[java] assert vs Exception 차이를 알고 쓰자

java에서는 에러처리를 할 때 보통 위 두 가지 방법을 사용한다.이 두 가지는 모르고 쓰면 비슷해 보일 수 있지만 사실 전혀 다른 목적을 가지고 사용한다.이 차이를 알고 둘다 활용해야 좋은 코드를 짤 수 있다고 생각한다.- ExceptionException은 java에서 대표적으로 에러를 처리해 예외를 발생시키는 방법이다.특정 상황에 따른 여러가지 Exception 종류들이 있으며 예를 들면 SQL 에러가 발생 시엔 SQLException, Null에 대한 처리가 불가능하면 NullPointException 등.. 여러 가지 종류가 있다.- assertassert는 표현식의 값이 참인지 거짓인지를 판단해 거짓이면 에러를 발생시킨다. assert와 Exception 차이점 if (example == nu..

Backend/Java 2025.09.29

15. [java] 클래스(class),객체(Object)

객체(Object) 어떠한 사물을 속성으로 나타내거나, 행동이나 동작, 등을 단순화 시킨것을 객체 라고한다. 이해하기 힘드니 한 사람을 객체로 나타낸다고 하면 사람의 이름,나이,성별 같은것을 속성값으로 나타내주고, 사람이 자거나 밥먹는것 똥싸는것을 동작으로 나타내어서 만들어 주는것이다. 속성은 필드(field) 동작은 메소드(method) 라고 불러준다. 클래스(Class) 클래스는 자바에서 설계도와 같다. 클래스에서는 객체를 생성하기 위한 필드와 메소드를 정의하고, 클래스로 만든 객체를 인스턴스 라고한다. 인스턴스는 힙 영역에 저장된다. 클래스를 선언하는 방법은 public class 이름{ } 이런식으로 main을 선언하는것과 비슷하게 만들어준다. 이름은 첫문자는 대문자를 사용해주는게 관례이고, 클래..

Backend/Java 2021.06.22

14. [java] 열거 타입

열거 상수 프로그래밍 언어에서는 상수란 값이 변하지 않는 수이다. 상수를 선언하는 방법은 static final int a = 10; 위처럼 선언하게 된다면 a는 상수로 만들어지고, 이럴경우 a의 값은 어떠한 일이 있어도 변형이 불가능하다. 예를들어 a = 0; 혹은 a += a; 이러한 명령을 실행하면 바로 에러가 날것이다. 이러한 상수들을 편하게 관리해주는 방법이 열거 상수이다. 예를들면 요일은 월화수목금토일이 고정이니, 열거를 해두어서 사용하기 편하게 하는것이다. 만드는 방법은 코드를 생성할 때 패키지에서 New -> enum으로 파일을 생성해주면 만들어 줄 수 있다. public enum Week{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,..

Backend/Java 2021.06.21

13. [java] 배열 (Array), 2차원 배열

저번시간엔 참조타입에 대해서배웠다. 이번시간엔 배열에 대해서 배울것인데 우선 이 배열은 참조타입에 속한다. 기본적으로 기본형 타입 변수들은 한 변수에 하나의 값만을 저장할 수 있다. 예를들어 생각해보자 학생 100명의 키와 몸무게를 저장해야 한다고 하자. 그렇다면 저 데이터들을 모두 저장해주기 위해선 총 200개의 변수를 선언해주어야한다. 200개의 변수를 선언해주고 그 변수에 다 값을 넣어줄수 있는가? 해줄수는 있겠지만 매우 비효율적인 작업이 될것이다. 이런것을 도와주기 위해서 배열이란 개념이 존재한다. 위의 핵생 100명의 키와 몸무게를 저장할 변수도 int[][] student = new int[2][100]; 이렇게 선언하면 변수가 만들어진다. 값을 넣는것 또한 for(i=0;i

Backend/Java 2021.06.18