JAVA (26) - synchronized와 동기화
1. 개요 멀티스레드(Multi thread) 환경에서는 여러 스레드가 하나의 공유 자원에 동시에 접근하여 값을 읽거나 수정할 수 있다. 이때 적절한 제어가 이루어지지 않으면 데이터의 일관성이 깨지는 신뢰성 문제가 발생한다. 자바에서는 이러한 멀티스레드 환경에서 발생할…
TAG
25개의 글
1. 개요 멀티스레드(Multi thread) 환경에서는 여러 스레드가 하나의 공유 자원에 동시에 접근하여 값을 읽거나 수정할 수 있다. 이때 적절한 제어가 이루어지지 않으면 데이터의 일관성이 깨지는 신뢰성 문제가 발생한다. 자바에서는 이러한 멀티스레드 환경에서 발생할…
1. 개요 자바(Java) 애플리케이션은 기본적으로 하나의 메인 스레드(Main Thread)에서 코드를 순차적으로 실행한다. 하지만 네트워크 통신, 파일 입출력, 복잡한 연산 등 시간이 오래 걸리는 작업을 처리할 때는 작업이 끝날 때까지 프로그램 전체가 대기하는 현상…
1. 개요 자바 프로그래밍에서 가장 흔하게 발생하는 예외 중 하나는 NullPointerException (NPE)이다. NPE를 방지하기 위해 과거에는 코드 곳곳에 if (obj != null) 과 같은 조건문을 가득 채워 넣어야 했고, 이는 코드의 가독성을 크게 떨…
1. 개요 Java 8에서 도입된 가장 큰 변화 중 하나는 함수형 프로그래밍 스타일의 도입이다. 그 중심에는 람다식(Lambda Expression)과 스트림 API(Stream API)가 존재한다. 람다식을 통해 코드를 더욱 간결하고 직관적으로 작성할 수 있게 되었으…
1. 개요 자바(Java)는 C나 C++과 달리 개발자가 객체의 메모리를 직접 해제하지 않는다. JVM(Java Virtual Machine)의 가비지 컬렉터(Garbage Collector)가 더 이상 사용할 수 없는 객체를 찾아 메모리를 자동으로 회수하기 때문이다.…
1. 개요 자바 애플리케이션을 효율적으로 개발하고 메모리 누수를 방지하기 위해서는 JVM(Java Virtual Machine)의 메모리 관리 방식을 이해해야 한다. JVM 메모리 영역은 크게 스태틱(Static), 스택(Stack), 힙(Heap) 영역 등으로 나뉜다…
1. 개요 자바에서 I/O(Input/Output)는 프로그램이 외부 장치(키보드, 파일, 네트워크, 모니터 등)와 데이터를 주고받는 입출력 작업을 의미한다. 자바는 모든 입출력을 스트림(Stream) 이라는 일관된 개념을 통해 처리하며, 데이터의 단위에 따라 바이트…
1. 개요 자바의 리플렉션(Reflection) 은 구체적인 클래스 타입을 알지 못하더라도 런타임 시점에 클래스의 메타데이터(클래스 구조, 메서드, 필드, 생성자 등)에 접근하고 이를 조작할 수 있게 해주는 기능이다. 작성 시점에는 알 수 없는 클래스를 동적으로 로딩하…
1. 개요 애노테이션(Annotation)은 자바 5부터 도입된 기능으로, 코드에 대한 추가적인 정보(메타데이터, Metadata)를 제공하는 주석 형태의 표식이다. 기존의 주석이 사람을 위한 설명이었다면, 애노테이션은 컴파일러나 런타임 프레임워크가 코드를 어떻게 처리…
1. 개요 자바의 컬렉션 프레임워크(Collection Framework) 는 다수의 데이터를 효율적으로 저장, 관리, 조작할 수 있도록 표준화된 데이터 구조와 알고리즘을 제공하는 클래스와 인터페이스의 집합이다. 배열(Array)이 고정된 크기만을 지원하는 한계를 극복…
1. 개요 자바에서 제네릭(Generic)은 클래스, 인터페이스, 메서드를 정의할 때 사용할 데이터 타입을 파라미터로 지정할 수 있게 해주는 기능이다. Java 5에 도입되었으며, 데이터 타입(Data Type)의 안정성을 높이고 형변환의 번거로움을 줄이기 위해 사용된…
1. 개요 프로그램 실행 중에는 구문 오류(Syntax Error) 외에도 예측하지 못한 상황으로 인해 오류가 발생할 수 있다. 자바에서는 이러한 비정상 종료를 막고 프로그램이 정상적인 흐름을 유지할 수 있도록 예외 처리(Exception Handling) 메커니즘을…
1. 개요 자바의 최상위 클래스인 Object 는 모든 클래스가 기본적으로 상속받는 메서드들을 제공한다. 그중 equals() 와 hashCode() 는 객체의 동일성(Identity)과 동등성(Equality)을 비교할 때 핵심적인 역할을 담당한다. 두 메서드는 올바…
1. 개요 자바에서 String 은 가장 자주 사용되는 클래스 중 하나다. 다른 객체와 달리 String 은 한번 생성되면 내부의 값을 변경할 수 없는 불변(Immutable) 객체 로 설계되었다. 이러한 불변 특성은 자바의 메모리 관리 및 안정성 측면에서 매우 중요한…
1. 개요 내부 클래스(Inner Class)는 클래스 내부에 선언된 또 다른 클래스를 의미한다. 두 클래스가 서로 긴밀한 관계에 있을 때 내부 클래스로 선언하면, 외부 클래스의 멤버들에 쉽게 접근할 수 있고 코드의 캡슐화를 높일 수 있다. 내부 클래스는 선언되는 위치…
1. 개요 자바(Java)에서 static 키워드는 클래스 수준의 멤버(변수, 메서드)를 정의할 때 사용한다. 일반적으로 객체 지향 프로그래밍에서는 클래스를 바탕으로 new 연산자를 통해 인스턴스를 생성해야 멤버에 접근할 수 있다. 하지만 static 키워드가 붙은 멤…
1. 개요 자바에서 추상 클래스(Abstract Class) 와 인터페이스(Interface) 는 모두 객체 지향 프로그래밍의 핵심 개념인 추상화(Abstraction)를 구현하기 위한 장치이다. 두 개념 모두 하위 클래스에서 반드시 구현해야 하는 메서드를 정의하여 코…
1. 개요 상속(Inheritance)과 다형성(Polymorphism)은 객체 지향의 핵심이라 불리는 대표적인 특성이다. 상속을 통해 기존 클래스의 자원을 재사용하고, 다형성을 통해 하나의 타입으로 여러 형태의 객체를 다룸으로써 유연하고 유지보수가 쉬운 프로그램을 작…
1. 개요 자바(Java)는 대표적인 객체 지향 프로그래밍(Object Oriented Programming, OOP) 언어 이다. 객체 지향 프로그래밍의 핵심은 현실 세계의 사물이나 개념을 프로그램 내의 '객체'로 모델링하여 코드를 작성하는 데 있다. 이러한 객체를…
1. 개요 Java에는 int , double , boolean 과 같은 기본 타입(Primitive Type)이 존재한다. 기본 타입은 성능상 이점이 있지만, 객체가 아니기 때문에 컬렉션 프레임워크( ArrayList 등)에 저장할 수 없고 null 을 다룰 수도 없…
1. 개요 열거형(Enum, Enumeration)은 서로 관련이 있는 연관된 상수들의 집합을 정의하는 특수한 데이터 타입 이다. Java 5 이전에는 상수를 정의할 때 final static int 방식을 사용했지만, 이는 타입 안정성 문제나 가독성 저하를 유발했다.…
1. 개요 배열(Array)은 같은 타입의 변수를 여러 개 묶어서 하나의 단위로 관리 하는 자료구조다. 데이터의 수가 많아질 때 변수를 일일이 선언하는 대신 하나의 배열 변수를 통해 연속된 메모리 공간에 데이터를 저장하고 효율적으로 관리할 수 있다. Java에서 int…
1. 연산자 (Operators) Java의 연산자는 피연산자의 개수 및 역할에 따라 여러 종류로 나뉜다. 1.1 산술 및 단항 연산자 산술 연산자: + , , , / , % (덧셈, 뺄셈, 곱셈, 나눗셈, 나머지) 증감 연산자: ++ , (변수의 값을 1 증가 또는…
1. 변수 (Variable) 변수란 데이터를 저장할 수 있는 메모리 공간을 의미한다. 프로그램이 실행되는 동안 값이 변경될 수 있다. 선언과 할당 : 변수를 사용하려면 먼저 어떤 타입의 데이터를 담을지 타입 과 이름 을 지정(선언)해야 하며, 이후 값을 저장(초기화/…
1. 자바 실행 과정 (Java Code to Execution) 자바는 "Write Once, Run Anywhere (한 번 작성하면 어디서든 실행된다)"라는 슬로건을 가진 대표적인 플랫폼 독립적 언어다. 이를 가능하게 만드는 것이 바로 컴파일 과정 과 JVM 이다…