[Java] StringBuffer vs. StringBuilder
·
Java
우리가 기본적으로 문자열 덧셈을 하는 경우, 다음과 같이 사용할 것이다. String str = "hello"; str += "world"; 문자열을 쉽게 합할 수 있어 간단하지만, 덧셈 연산이 많아지게 되면 Garbage Collection이 발생할 수 있다. Java의 String은 불변 객체(Immutable Object)이기 때문에 덧셈 연산이 수행될 때마다 기존 문자열을 버리고 새로운 문자열을 생성해서 가리키기 때문이다. 따라서 다수의 연산이 필요할 경우, 가변 객체(Mutable Object)를 사용해야 한다. 문자열을 가변적으로 다루는 클래스에는 StringBuffer와 StringBuilder가 있다. 이 클래스들은 모두 추상 메소드인 AbstractStringBuiler를 상속받고 있다...
[Java] 동기(Synchronous) vs 비동기(Asynchronous)
·
Java
Java 언어는 동기적으로 코드를 실행한다. 하지만 CompletableFuture, ExecutorService, Future 등 비동기 처리를 유도하는 클래스를 사용하여 비동기 작업을 수행할 수 있다. 그렇다면 여기서 동기와 비동기의 차이가 무엇인지 의문점이 들 것이다. 둘의 차이에 대해 알아보도록 하자. 동기(Synchronous)와 비동기(Asynchronous)의 차이는 뭘까? 동기 (Synchronous) 동기는 작업이 순차적으로 실행되는 방식을 말한다. 하나의 작업이 완료되기 전까지 다음 작업이 실행되지 않는다. 일반적으로 Java의 코드는 한 메소드의 처리가 완료되어야 다음 메소드를 실행한다. 예시 코드를 함께 보자. public class SyncExample { public static..
[Java] 얕은 복사 vs 깊은 복사
·
Java
배열과 같은 객체를 복사하는 경우, 우리는 얕은 복사 또는 깊은 복사, 두 가지 복사 방법을 선택할 수 있다. 대표적으로 Object에서 제공하는 메소드인 clone()과 Arrays에서 제공하는 copyOf()를 통해 개념을 정리해보자. 얕은 복사 (Shallow Copy) 얕은 복사는 복사 대상의 객체를 새로운 객체에 복사하지만, 그 객체 내에 있는 참조 변수들은 원본 객체와 동일한 객체를 참조한다. 원본 객체와 복사본 객체는 동일한 하위 객체를 공유하기 때문에 복사본을 변경할 때 원본에도 영향을 미칠 수 있다. Object의 clone() 메소드는 얕은 복사를 수행한다. 예시를 통해 알아보자. class MyObject implements Cloneable { private int[] array; ..