JAVA

·JAVA
Java의 탄생 배경자바가 등장할 당시, C/C++과 같은 언어들이 주로 사용되었지만, 이 언어들은 특정 플랫폼(OS)이나 하드웨어에 맞춰 컴파일되도록 설계된 언어였다. 각 플랫폼마다 사용하는 CPU에 따라 해당 환경에 맞게 컴파일해야 했다. 이런 한계를 극복하기 위해 Sun Microsystems는 OS나 하드웨어에 상관없이 다양한 환경에서 실행될 수 있는 언어를 만들기로 결심했고, 이것이 자바의 탄생으로 이어졌다. 자바는 “Write Once, Run Anywhere”라는 철학을 기반으로 다양한 플랫폼에서 동일한 코드를 실행할 수 있도록 설계된 언어이다. JAVA의 동작 원리JVM을 설명하기 전에, 자바 프로그램이 어떻게 동작하는지 기본적인 원리를 먼저 살펴보겠다.자바로 작성된 소스 파일은 보통 이름..
·JAVA
새로운 클래스에 대한 고민과 결정Lv4에 들어서면서 자릿수에 대한 요구 사항이 있었다. 이에 따라 GameManager에서 필드로 digitSize를 가지고 있게 생각을 하였는데, 좀 더 객체 지향적으로 개선하기 위해 책임의 분리와 확장성을 고려하며 이에 따라 개선한 과정을 작성하려고 한다.     고민의 코드public class GameManager { private final BaseballGame baseballGame; private final GameStats gameStats; private final int digitSize; public GameManager() { this.gameStats = new GameStats(); this.base..
·JAVA
GameManager 설계 고민과 해결계산기 과제 Level 2, Level3에서는 GameManager 클래스가 게임의 전반적인 흐름을 제어하고 사용자 입력에 따라 게임을 시작하거나 기록을 조회하는 역할을 한다. 이 과정에서 몇 가지 설계 고민이 있었고, 그에 대한 해결책을 마련하였다. 이번 포스트에서는 이 고민과 해결책에 대해 자세히 살펴보겠다.     고민 1: GameManager 생성 시 BaseballGame 인스턴스 초기화public class BaseballGame { private final NumberGenerator numberGenerator; private final Referee referee; public BaseballGame(final NumberGenera..
·JAVA
지난 계산기 과제에서 Exception을 상속하여 예외 처리를 하던 중 코드가 지저분해지는 문제가 발생했다. 매번 try-catch 문을 사용해야 했고, 그로 인해 코드가 길어지며 가독성도 떨어졌다. 그래서 RuntimeException으로 변경하여 try-catch 문을 생략하게 되었다.     왜 RuntimeException으로 변경하면 try-catch 문을 생략할 수 있었을까?Exception을 상속받으면 해당 예외는 CheckedException이 된다. CheckedException은 컴파일러가 예외 처리를 강제하기 때문에, 메서드 내에서 반드시 try-catch로 처리하거나 메서드 선언부에 throws를 붙여야 한다. 그렇지 않으면 컴파일 오류가 발생한다. 하지만 RuntimeExcepti..
·JAVA
ArrayList는 Java에서 List 인터페이스를 구현한 인기 있는 데이터 구조이다. 이번 글에서는 동적으로 크기가 조절되는 배열을 제공하는 ArrayList의 내부 저장 방식과 성능에 대해 살펴보려고 한다.     ArrayList의 초기화 과정ArrayList를 생성할 때, 기본적으로 빈 배열을 사용하여 초기화된다. 기본 용량은 일반적으로 10이며 처음에는 빈 배열이 할당된다. +) 리스트의 size가 10이 아님!     add 메서드 작동 방식add(E e) - 끝에 요소 추가위 사진은 ArrayList의 리스트 끝에 요소를 추가하는 add 메서드 내부 코드이다. 코드를 하나하나 살펴보자.modCount++ : 리스트가 수정될 때마다 증가하는 값이다. 이 값은 여러 스레드에서 ArrayList..
·JAVA
GC(Garbage Collection)란?JVM에서 메모리를 관리해 주기 때문에 더 이상 사용하지 않는 객체를 청소해 주는 작업이다. Java의 Heap 메모리 구조Java의 Heap 메모리는 객체가 동적으로 생성되고 관리되는 메모리 영역이다. 이 메모리는 크게 Young 영역과 Old 영역으로 나뉜다. Young 영역은 다시 Eden 영역과 Survivor 영역으로 세분화된다.1. Young 영역Young 영역은 상대적으로 짧은 생애를 가진 객체들이 위치하는 영역이다. 이 영역은 두 부분으로 나뉜다.Eden 영역: 새로운 객체가 생성되는 영역이다. 모든 객체는 처음에 Eden 영역에 생성된다.Survivor 영역: Eden 영역에서 살아남은 객체들이 이동하는 영역이다. Survivor 영역은 두 개로..
·JAVA
Java에서 final 키워드는 불변성을 보장하고 의도하지 않은 변경을 방지하기 위해 사용되는 강력한 기능이다. 이 포스트에서는 메서드 파라미터와 객체 필드에 final을 사용하는 이유에 대해 작성해보려고 한다. final 이란?final은 변수, 메서드, 클래스 등에 사용될 수 있는 키워드로, 변경이 불가능하거나 상속이나 오버라이딩을 금지할 때 사용되며 주로 불변성(immutability)을 보장하기 위해 사용된다. 메서드 파라미터에 final 사용 이유의도하지 않은 수정 방지: 파라미터를 final로 선언하면 메서드 내부에서 해당 파라미터의 값을 재할당할 수 없게 된다. 이로 인해 파라미터를 의도하지 않게 변경하는 것을 방지할 수 있다.public Player(final List playerNumbe..
·JAVA
이번 계산기 프로젝트에서 발생한 문제와 그 해결 방법을 정리하려고 한다.문제 상황ArithmeticCalculator 객체를 매번 새로 생성할 때, 계산 결과가 results 리스트에 저장되지 않는 문제가 발생했다. 이는 매번 객체가 새로 생성되면서, 결과가 저장되지 않고 사라지는 상황이었다.public void start() { while (true) { ... ArithmeticCalculator arithmeticCalculator = new ArithmeticCalculator(firstNumber, secondNumber, operation); Number answer = arithmeticCalculator.calculate(); ..
·JAVA
Garbage Collection이란?Garbage Collection(GC)은 메모리 관리를 자동으로 처리해 주는 기능이다. Java, Kotlin 같은 언어에서는 개발자가 직접 메모리를 해제하지 않아도 되는데, 그 이유가 바로 이 GC 덕분이다. C 언어에서는 free()를 호출해 사용한 메모리를 수동으로 정리해야 하지만, Java는 JVM이 주기적으로 불필요한 객체를 감지하고 제거해 준다. Java에서는 메모리 누수를 막기 위해 System.gc()로 GC를 강제 호출할 수도 있지만, 이 방법은 성능 문제를 일으킬 수 있으니 사용하지 않는 것이 좋다. Minor GC와 Major GCJVM의 힙 메모리는 크게 두 영역으로 나뉜다: Young Generation과 Old Generation이다. 이 ..
·JAVA
제네릭(Generic)제네릭은 클래스나 메서드에서 사용되며, 코드의 재사용성을 높이고 타입 안전성을 보장하기 위해 사용된다.와 같은 형태로 사용하며, 여기서 T는 타입 변수(type variable)라고 한다.보통 T, E, K, V 같은 이름을 자바 컨벤션으로 사용하지만, 다른 이름을 써도 된다. 하지만 자주 쓰이는 이름을 사용하면 혼란을 줄일 수 있다. 제네릭 클래스 예시public class Generic { public E multiTypeMethod(T t, U u) { ... }}Generic instance = new Generic();instance.multiTypeMethod(longVal, intVal);위 예시처럼 여러 개의 타입 변수를 사용할 수 있다. 제네릭 ..
유선준
'JAVA' 카테고리의 글 목록