개발을 하다 보면 객체를 복제해서 사용하고 싶을 때가 있다. 단순히 생각한다면 아래와 같이 대입연산자를 사용해 복제를 하려 할 것이다만약 위의 코드에서 obj2의 멤버변수의 값을 변경하면 어떻게 될까. 결과obj2의 필드값을 변경했음에도 원본 객체의 값까지 변경된 걸
오라클 공식문서에 따르면 아래와 같다.An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program's instruct
자바에서는 collection을 통해 자료 구조를 구현해 놓았다. 크게 다음과 같이 분류할 수 있다.순서가 있는 목록형(List)순서가 중요하지 않고 중복 없는 셋형(Set)먼저 들어온 것이 먼저 나가는 큐형(Queue)키-값으로 저장되는 맵형(Map)자바의 컬렉션과
HashSet은 내부적으로 HashMap을 사용하며 중복을 허용하지 않는 자료구조이다.중요한 특징으로는 아래와 같다.데이터를 중복없이 저장하며 null을 허용한다.내부적으로 HashMap을 사용한다.순서를 보장하지 않는다.스레드 세이프하지 않다.add() 메서드를 통해
(출처: https://memostack.tistory.com/234)List와 Set과 달리 HashMap은 Collection 인터페이스가 아닌 Map을 구현한 클래스이다. HashMap은 키-밸류 페어로 값을 저장하며 저장할 때와 값을 꺼내올 때의 시간복
익명클래스는 아래의 다이어그램에서 보듯이 일종의 중첩클래스이다. (참조: https://www.baeldung.com/java-anonymous-classes)익명클래스는 다른 내부클래스들과 달리 이름을 갖지 않으며 사용하는 시점에 선언과 함께 초기화를 해줘야
이전 아티클에서 익명클래스에 대해 소개하였다(참고: 익명클래스). 이러한 익명클래스와 관련된 한가지 문제는 익명클래스 구현이 매우 간단한 경우, 예를들어 하나의 메서드만 포함하는 인터페이스를 익명클래스로 구현한다면, 불필요하게 어렵게 보일수 있고 또한 가독성도 떨어진다
왜 프로덕션 코드에서 System.out.println() 말고 Logger나 Log4j 같은 로깅 프레임워크를 사용해야 할까? 크게 2가지 이유가 있다.여러 로깅프레임워크는 로그 레벨에 따라 디버깅 정보를 로그하게끔 해준다. 로깅 프레임워크에서 제공하는 로그 레벨은
로세스는 운영체제로부터 자원을 할당받은 작업의 단위이며 스레드는 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위이다.프로그램을 실행시키면 운영체제가 프로그램에 독립적인 메모리 공간을 할당해준다. 즉 프로세스는 메모리에 올라간 프로그램 실행 단위이다.하나의 프로세스
(출처: https://www.baeldung.com/java-wait-notify)위는 스레드의 라이프 사이클에 대한 간략한 다이어그램이다. 스레드는 생성된 후에 start() 메서드를 통해 실행된다. 정확히는 Runnable과 Running 상태를 왔다갔다
volatile은 여러 최적화 기법 중 캐싱과 리오더링으로 발생할 수 있는 이슈를 예방할 수 있다. 이러한 이슈들을 살펴보고 volatile을 통해 어떻게 대처할 수 있을지 알아보자.프로세서는 프로그램 instruction을 실행시키며 이를 위해 RAM으로부터 해당 i
멀티스레드 환경에서는 여러 스레드가 변경 가능한 공유 데이터를 동시에 수정하려 할 때 레이스 컨디션이 발생한다. 자바에서는 이러한 레이스 컨디션을 회피할 수 있도록 synchronized 기능을 제공한다. synchronized 키워드를 붙이면 해당 블록에는 오직 하나
제네릭이란 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 말한다. geeksforgeeks에서는 parameterized types 라고도 표현하는데, 말 그대로 타입을 파라미터로 넘겨 클래스나 메서드 내에서 사용하는 것을 뜻한다.예전에는 여러 타입을