[Java] 자바 생성자의 초기화 방법
·
JAVA
자바 생성자는 어떻게 초기화될까?  1. 생성자에서 모든 필드를 초기화할 필요가 없는 이유자바에서 생성자는 객체가 생성될 때 특정 필드를 초기화하기 위해 사용된다. 그러나 모든 필드를 반드시 생성자에서 초기화해야 하는 것은 아니다.  다음과 같은 이유로 일부 필드는 생성자에서 초기화하지 않아도 된다.선택적 초기화일부 필드는 기본값으로 초기화해도 문제가 없는 경우가 있다. 예를 들면 숫자형 필드는 기본적으로 0, 객체형 필드는 null로 초기화된다.다중 생성자여러 생성자를 정의하여 다양한 방식으로 객체를 생성할 수 있다.각 생성자에서 초기화할 필드를 선택적으로 지정할 수 있다.필드 초기화 블록 또는 선언 시 초기화필드를 선언할 때 기본값을 지정할 수 있다.초기화 블록을 사용하여 공통적으로 초기화할 수도 있..
[Java] 자바의 약한 복사(Shallow Copy)란?
·
JAVA
자바의 약한 복사를 정리해 봤다. 1. 약한 복사(Shallow Copy)란?약한 복사란?약한 복사(Shallow Copy)는 객체를 복사할 때 원본 객체의 필드 값들을 그대로 새로운 객체에 복사하는 방식이다. 여기서 중요한 점은 객체 내에 포함된 참조형 필드, 즉 다른 객체를 참조하는 필드들이 원본과 복사된 객체 모두 동일한 메모리 주소를 가리킨다는 것이다.즉, 단순히 필드의 값이나 참조를 복사할 뿐, 참조된 객체 자체는 복제하지 않는다. 따라서 원본 객체와 복사된 객체는 동일한 참조형 필드를 공유하게 되며, 한쪽에서 참조된 객체를 변경하면 다른 쪽에도 그 변경이 영향을 미칠 수 있다.예를 들어, 사람이 주소(Address)라는 필드를 가지고 있는 객체라고 가정해 보자. 약한 복사를 통해 사람 객체를 ..
[Java] 스트림(Stream)에서 가변 변수 사용 시 발생하는 문제 및 해결 방법
·
JAVA
스트림에서 가변 변수를 사용하면 문제가 발생한다. 1. 스트림에서 가변 변수 사용의 문제점스트림 내부에서 가변 변수를 사용하는 것은 여러 가지 문제를 초래할 수 있다.동시성 문제스트림은 내부적으로 병렬 처리를 지원한다. 만약 가변 변수를 공유하게 되면 여러 스레드가 동시에 접근하여 데이터 무결성을 해칠 수 있다.예측 불가능한 동작스트림의 연산은 지연(lazy) 실행되거나 최적화될 수 있어, 가변 상태는 연산의 결과를 예측하기 어렵게 만든다.가독성 및 유지보수성 저하가변 상태를 사용하면 코드의 흐름을 추적하기 어려워져 버그를 유발하기 쉽다.스트림의 설계 철학스트림의 설계 철학은 함수형 프로그래밍에 기반을 두고 있다. 함수형 프로그래밍은 상태를 변경하지 않는 순수 함수를 중심으로 작동하며, 이는 코드의 예측..
[Java] 스택 프레임과 변수의 생명 주기 이해하기
·
JAVA
자바의 스택 프레임과 변수의 생명 주기를 알아보자. 1. 스택 프레임스택 프레임이란?컴퓨터가 프로그램을 실행할 때, 메모리를 사용하는 방법 중 하나가 스택(stack)이다. 스택은 책을 쌓아 올리는 것처럼 데이터를 차곡차곡 쌓았다가, 마지막에 넣은 것부터 꺼내는 구조다.지금부터 알아볼 스택 프레임은 메서드(함수)를 호출할 때마다 생성되는 작은 상자라고 생각하면 된다. 이 상자 안에는 그 메서드에서 사용하는 지역 변수와 매개변수가 들어 있다. 메서드가 끝나면 그 상자는 스택에서 사라지게 된다.전체 메모리 구조 그림스택 프레임을 이해하기 위해 먼저 자바의 메모리 구조를 알아보자.[메모리 구조]+--------------------------+| Method Area |  메모리 구조 ..
[Java] 객체지향(OOP)의 특징: 캡슐화
·
JAVA
객체지향(OOP)의 특징 중 캡슐화에 대해 알아보자📌 서론객체지향 언어인 Java를 사용하다 보면 캡슐화에 대해 다양한 생각을 가지게 된다.나는 처음 캡슐화라는 말을 들었을 때 근본적으로 왜 "캡슐"이라고 부르는지는 생각하지 않고 진짜 알약 캡슐만을 생각하면서 개발하다 보니 대체 왜 이게 캡슐화라고 불리는 것인지 잘 이해가 가지 않았다.다만 현업에 들어와 개발을 하며 시간이 흐른 지금은 이전보다는 이해도가 많이 상승하여 조금은 어떤 느낌인지 알게 되었다. 이번 포스트에서 "캡슐화"에 대해서 간단하게 예시를 통해 알아보도록 하자.  1. 캡슐화란?캡슐화란 무엇일까캡슐화는 '캡슐 안에 무언가를 담는 것'을 의미한다. 우리가 아플 때 먹는 약 캡슐을 생각해 보자. 약 성분은 캡슐 안에 안전하게 보호되어 있다..
[Thread] 4. Kotlin의 코루틴(Coroutine)이란?
·
개발지식/스레드(Thread)
이번 편에서는 코루틴이 무엇인지 알아보자.📌 서론이전 스레드 시리즈에서는 '일반 스레드와 스레드풀'을 사용하여 성능 비교를 했었다.두가지 테스트만으로도 충분히 흥미로운 결과를 얻을 수 있었으며 내가 지금까지 개발하면서 생각하지 못했던 스레드를 활용한 성능 개선 방법에 대해 배울 수 있었다. 사실 내가 처음 이 시리즈를 작성하게 된 이유는 단순히 스레드의 성능이 궁금해서가 아니다. 동시성에 대한 테스트를 하다보니 스레드에 대해서 알아야겠다는 생각이 들었고 공부하다보니 공부할 것이 정말 많아서 정리를 해야겠다고 생각했기 때문이다. 그래서 열심히 세미나도 찾아보고 각종 문서, 블로그도 살펴봤다. 그랬더니 요즘은 '경량 스레드'를 사용하여 동시성을 제어하는 경우가 있다는 것도 알게 되었다. 그래서 이것에 대해..
[Thread] 3. 일반 스레드 vs 스레드풀 (I/O, CPU 성능 비교)
·
개발지식/스레드(Thread)
스레드 vs 스레드풀 (성능 비교)📌 서론이전 1,2탄 포스팅에서 '일반 스레드'와 '스레드풀'을 사용했을 때 I/O, CPU 작업을 진행하면 어떤 성능을 보여줄지 테스트를 진행했다. 테스트를 통해 I/O 작업이 조금 더 스레드풀 설정에 민감하게(성능향상폭) 반응한다는 것을 알게 되었고 CPU작업은 스레드풀 설정에는 민감하지 않지만 제대로 설정하지 않으면 낭비되는 스레드가 많을 것이라는 생각을 하게 되었다.그래서 이번에는 조금 더 상세하게 각 스레드별로 테스트를 진행하고 분석을 해봤다. 이번 내용을 통해 우리가 일반적으로 사용하는 스레드의 성능과 최적화는 어떻게 하는게 좋을지 알아보자.테스트에 사용되는 코드는 하단의 1,2편에 모두 작성되어 있습니다. (전체 소스코드 깃허브도 이전 포스팅에 포함) [T..
[Thread] 2. 스레드풀의 I/O, CPU 성능 비교
·
개발지식/스레드(Thread)
Kotlin(Java)을 사용하여 스레드풀의 성능을 비교해 보자📌 서론지난 포스트에서는 일반적인 스레드 환경의 I/O, CPU 스레드 성능을 비교해 봤다.이번 포스트는 Thread 시리즈의 2번째 포스트로서 만약 스레드풀을 사용한다면 어떤 성능을 보여줄지 테스트해 보고 이전 결과와 비교해 볼 예정이다.이 글을 확실하게 이해하기 위해 이전 포스트를 확인하는 것을 추천한다. 왜냐하면 이전 포스트에서 얻은 결과를 통해 이번 포스트에서 비교하기 때문이다.이전 포스트 (일반 스레드 성능 비교) [Thread] 1. 일반 스레드의 I/O, CPU 성능 비교Kotlin(Java)을 사용하여 일반 스레드의 성능을 비교해 보자📌 서론최근 나는 동시성 제어에 관심이 생겨 관련된 개념을 많이 찾아보고 생각하고 있다. 그..
[Thread] 1. 일반 스레드의 I/O, CPU 성능 비교
·
개발지식/스레드(Thread)
Kotlin(Java)을 사용하여 일반 스레드의 성능을 비교해 보자📌 서론최근 나는 동시성 제어에 관심이 생겨 관련된 개념을 많이 찾아보고 생각하고 있다. 그래서 java의 동시성 제어 List, Map 등을 내부 구현까지 뜯어서 확인해보기도 하고 성능 테스트도 진행했다.이렇게 열심히 테스트를 하다 보면 동시성 제어가 이런 것이구나! 깨달음을 얻게 된다. 근데 나는 궁금한 게 많은 개발자다 보니 테스트를 하며 새로운 것들에 눈을 뜨게 되었다. 특히 locust결과를 보면 알 수 있는 RPS(Requests Per Second)에 대해서 많이 궁금한 점이 생겼다. RPS는 동시성 제어(synchronized, concurrentHashMap)에 따라 lock이 걸리며 결과가 다르게 나타나기도 하지만 스레..