Java 15

[Java] Optional의 사용법과 주의사항

Optional이란? Java로 코드를 작성할 때 발생할 수 있는 흔한 문제 중 하나는 *NPE(NullPointerException)*이다. 따라서 개발자들은 null을 처리하기 위한 코드를 별도로 작성해줘야하는데, 보통 귀찮은 일이 아니다. public class Main { public static void main(String[] args) { String nullable = null; if (nullable != null) { System.out.println("null이 아닙니다."); } else { System.out.println("null"); } } } 핵심 비지니스 로직과 별개로 null을 항상 직접 처리해주는 방식은 효율적이지 못하다. 그래서 Java8에 등장한 것이 `Option..

Java 2024.01.24

[Java] 스레드(Thread) 총정리

1. Thread? - Process와 Thread 프로세스(Process)란 cpu에 의해 *메모리에 올라가 실행중인 프로그램*을 말한다. 예를 들어 PC에서 브라우저를 키고, 카카오톡을 하는 등 각각의 프로그램이 실행중인 것을 프로세스라고 말한다. 프로세스는 자신만의 메모리 공간을 포함한 *독립적인 실행공간*을 갖고있다. 자바의 JVM의 경우 주로 하나의 *프로세스 레벨* 안에서 실행된다. 하나의 프로세스 안에서는 동시에 여러 개의 작업을 수행할 수 있도록 *멀티 스레드를 지원*한다. 스레드란 무엇일까? 프로세스가 프로그램 그 자체를 의미한다면 스레드는 해당 프로그램 안에서 *실질적으로 작업을 실행하는 단위*이다. 프로세스가 단 하나의 스레드만으로 운영된다면 단일 스레드 환경, 여러 개의 스레드로 운..

Java 2024.01.19

[Java] 가비지 컬렉션(Garbage Collection)

Garbage Collection(GC)란? 가비지 컬렉션(이하 GC)은 자바의 메모리 관리 기법 중의 하나로, JVM의 *Heap 영역*에서 동적으로 할당되었던 메모리 중 *더 이상 사용하지 않는 객체를 모아 주기적으로 제거*하는 프로세스를 뜻한다. C 계열의 언어에는 이러한 가비지 컬렉션이 없어 개발자가 스스로 메모리를 할당하고 해제까지 해줘야한다. 반면, Java에서는 가비지 컬렉션이 메모리 관리를 대행해주기 때문에 개발자는 오롯이 *개발에만 집중*할 수 있다는 장점이 있다. GC의 개념은 꼭 자바에만 있는건 아니다. 파이썬, 자바스크립트, Go 언어 등 많은 프로그래밍 언어에서 가비지 컬렉션이 기본으로 내장되어 있으며, 브라우저 역시 자체적으로 구현된 가비지 컬렉션이 있다. 하지만 이렇게 천사같아..

Java 2024.01.12

[Java] 자바 가상 머신(JVM) 의 내부 구조

JVM? JVM은 자바 가상 머신이다. 단순히 *자바를 돌리는 프로그램*으로 이해하면 된다. 자바로 작성된 모든 프로그램은 JVM 위에서만 실행될 수 있으므로, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상 머신이 설치되어 있어야 한다. JVM은 JRE(Java Runtime Enviroment)에 포함되어 있다. 따라서 JRE 혹은 JDK를 설치했다면 JVM은 설치되어있다고 생각하면 된다. - JVM의 장점 Java는 OS에 종속적이지 않다는 특징을 가진다. C언어의 경우, 각 OS 환경마다 독자적인 컴파일러를 가지고 있기 때문에 다른 환경이 된다면 컴파일 결과가 달라진다. 따라서 컴파일러가 운영체제마다 의존적이었던 문제를 해결하고자 Java의 JVM이 등장했다. Java 언어로 작성된 소스파일은..

Java 2024.01.12

[Java] 제네릭(Generics)

제네릭이란? 자바에서 제네릭은 *클래스나 메소드에서 사용할 내부 데이터 타입을 외부에서 지정하는 기법*을 의미한다. 리스트나 맵 등 주로 컬렉션을 다룰 때 많이 봤을 것이다! ArrayList list = new ArrayList(); 위에서 꺽쇠 괄호에 해당하는 부분이 바로 제네릭이다. 해당 자료형에서 다룰 타입을 외부에서 지정해주는 의미이다. - 타입 파라미터 제네릭은 꺽쇠 괄호를 사용하는데, 이를 다이아몬드 연산자라 칭한다. 이러한 꺽쇠 괄호 안에 식별자 기호를 지정함으로써 파라미터화 할 수 있다. 마치 메소드에서 매개변수를 받아 사용하는 것과 비슷해 제네릭에서는 타입 매개변수 or 타입 파라미터라고 부른다. 이러한 타입 매개변수는 제네릭을 이용해 클래스나 인터페이스, 메소드를 설계할 때 사용된다...

Java 2024.01.02

[Java] 컬렉션 프레임워크

컬렉션 프레임워크란? 컬렉션 프레임워크는 자바 프로그래밍에서 중요한 요소 중 하나이다. 자주 사용하는 다양한 자료구조를 자바에서 쉽게 사용할 수 있도록 구현한 *이름 그대로 모음집*, 즉 컬렉션이라고 생각하면 된다. 컬렉션 프레임워크가 왜 생겨났을까? JDK 1.2 이전에는 Vector, Properties, Stack, HashTable, Dictionary 와 같은 클래스를 사용했는데 이들은 각각 사용법에 대한 통일성이 없었기 때문에 다루기 어려웠다. 자바는 *다형성*을 활용해 보다 통일된 사용법으로 다양한 자료구조를 제공하고자 컬렉션 프레임워크를 만들었다. 컬렉션 프레임워크가 도입되면서 데이터 삽입, 탐색, 정렬 등 편리한 API를 제공받아 사용할 수 있게 되었다. 구조도 언제 무엇을 사용하는게 적..

Java 2024.01.02

[Java] Stream API

Stream API의 등장 Java8 이전에 자바는 객체지향 언어이기 때문에 함수형 프로그래밍을 적용할 수 없었다. 하지만 Java8부터 함수형 인터페이스, 람다 표현식, Stream API가 등장하면서 함수형 프로그래밍을 할 수 있는 다양한 API를 제공하기 시작했다. 그 중 Stream API는 배열, Collection 등의 *데이터 자체를 추상화*하고 How보다는 What에 초점을 두어 데이터를 처리하는 다양한 함수를 정의해두었다. 동작 흐름 및 주요 특징 Stream API는 데이터를 처리하는 다양한 연산을 지원한다. 크게 아래와 같이 세 단계로 나눌 수 있다. 스트림 생성 중간 연산 최종 연산 주요 특징을 알아보자. 스트림은 원본 데이터를 변경하지 않고, 최초 원본 데이터를 복사한 스트림을 생..

Java 2023.12.21

[Java] 함수형 인터페이스(Functional Interface)와 람다식(Lambda Expression)

Java8이 등장하면서 자바에는 많은 변화가 생겼다. 단순 객체 지향 프로그래밍을 넘어서 함수형 프로그래밍 방식을 지원하는 다양한 기능들이 추가되었는데, 함수형 프로그래밍을 제대로 이해하려면 함수형 인터페이스 -> 람다 표현식 -> 스트림 의 순서로 이해가 되어야한다. 함수형 프로그래밍에 대한 자세한 내용은 후술할 포스팅에서 이야기하도록 하고, 먼저 함수형 프로그래밍에 근간이 되는 *함수형 인터페이스*와 *람다식*에 대해 이야기해보려고 한다. 함수형 인터페이스(Functional Interface) - 함수형 인터페이스란? Java8에 도입된 함수형 인터페이스는 인터페이스가 마치 하나의 함수처럼 동작하기에 함수형 인터페이스라고 불린다. 함수형 인터페이스를 생성하는 방법은, 오직 단 하나의 추상 메소드를 ..

Java 2023.12.14

[Java] 추상 클래스와 인터페이스

추상 클래스 - 추상 클래스 public abstract class 클래스이름 { // 필드 String name; // 생성자 public 클래스이름(String name) { this.name = name; { // 추상 메소드 public abstract void 메소드이름(); // 그냥 메소드 public void 메소드이름(); } 추상 클래스는 class를 선언할 때 앞에 'abstract'를 붙여 선언하고 반드시 '하나 이상의 추상 메소드'를 가져야한다. 추상 클래스는 상속을 통해 자식 클래스에서만 사용하도록 강제하는 클래스이다. 추상 클래스는 상속을 위한 클래스이기 때문에, new를 사용해 직접적으로 객체를 생성할 수 없다. 추상 클래스는 추상 메소드 외에도 일반 필드, 메소드, 생성자를..

Java 2023.05.30

[Java] Call by value & reference

- 그게 뭐지? 프로그래밍을 배우다보면 한번씩은 들어본 Call by value와 Call by reference.. 값을 복사하니, 주소값을 참조하니 어렵게 생각하지말고 직접 경험해보면서 알아보자. - Call by value 우선 자바의 데이터형에 대해 이해해야한다. 기본형(primitive type) - Boolean Type(boolean), Numeric Type(short, int, long, float, double, char) 참조형(reference type) - Class Type, Interface Type, Array Type, Enum Type, 기본형을 제외한 모든 것들 자바에는 메소드의 파라미터값으로 기본형을 받냐, 참조형을 받냐에 따라 같은 코드지만 전혀 다른 결과를 불러온다..

Java 2023.05.26