Java 32

StringBuffer & StringBuilder

StringBuffer & StringBuilder둘 다 가변 길이 문자열을 처리하는 데 사용되는 클래스이다.  StringBufferkey : thread-safe모든 메서드에 동기화가 적용되어 있어, thread-safe 로 멀티 스레드 환경에서 안전하다.여러 스레드가 동시에 문자열을 수정해야 하는 경우 사용된다.@Overridepublic synchronized StringBuffer append(Object obj) { toStringCache = null; super.append(String.valueOf(obj)); return this;}  StringBuilderkey : thread-unsafe내부적으로 동기화가 적용되어 있지 않기 때문에 멀티 스레드 환경에서 안전하지 않..

Java 2025.01.07

자바 직렬화 Serialization

객체를 바이트 스트림으로 변환하여 저장하거나 전송할 수 있게 하는 과정Java 시스템 내부에서 사용되는 데이터를 외부의 Java 시스템에서 사용할 수 있도록 바이트 형태로 변환하는 것을 의미한다.  구현 방식public interface Serializable() {}   자바에서 직렬화를 구현하기 위해서는 java.io.Serializable 인터페이스를 구현해야 한다.필드 중에 직렬화하지 말아야 할 필드는 transient 키워드를 사용하여 표시하자.import java.io.Serializable;public class User implements Serializable { private static final long serialVersionUID = 1L; // 클래스 버전 관리용 p..

Java 2025.01.07

System.out.println()와 로그

실무에서는 System.out.println() 대신 Logging를 사용한다.  System.out.println()System.out.println()은 Java 에서 콘솔에 출력할 때 사용되는 메서드로 주로 간단한 디버깅 목적으로 사용한다. 내부적으로 출력 버퍼를 사용하여 데이터를 출력한다. 따라서 작은 양의 데이터로 버퍼를 채우고 비우는 작업이 필요하다.따라서, 오버헤드가 발생할 수 있고, 객체를 출력하기 위해 내부적으로 문자열 변환을 해야 하기 때문에, 문자열 작업이 추가적으로 필요하다. System.out은 단일 인스턴스로, 여러 스레드가 동일한 System.out 객체에 동시에 접근할 수 있다. 이 때문에 동시에 여러 스레드가 출력을 시도하면 출력 결과가 뒤섞일 수 있다.이를 방지하기 위해 ..

Java 2025.01.07

synchroinzed와 DeadLock

synchroinzed멀티스레드 환경에서 동기화를 제공하기 위해 사용여러 스레드가 동시에 동일한 자원에 접근하지 못하도록 제어한다.  메서드 선언 앞에 사용되면 해당 메서드가 실행되는 동안 해당 객체의 락을 획득한다.다른 스레드가 동일 객체에 접근하려면 락이 해제될 때까지 대기해야 한다.메서드가 실행을 마치면 락을 해제하고, 다른 스레드가 접근할 수 있게 된다. 멀티 스레드 환경에서 공유 자원에 대한 경쟁 조건을 방지하기 위해서는 동기화가 필요하다.    동기화의 목적여러 스레가 공유 자원에 접근할 경우 발생할 수 있는 경쟁 조건을 방지하고, 자원의 일관성을 유지하기 위해 사용된다.Synchronized는 해당 객체에 대한 단일 락을 관리하고, 스레드가 하나씩 실행되는 것을 보장한다. 여러 스레드가 동일..

Java 2025.01.07

Generic과 Object

Generic데이터 타입을 일반화하여 클래스, 인터페이스, 메서드를 정의할 때 사용하는 기능클래스나 메서드를 선언할 때 타입을 명시적으로 지정하지 않고, 사용하는 시점에 실제 타입을 지정할 수 있다.제네릭을 이용하여 특정 타입에 의존하지 않고 데이터 구조나 알고리즘을 정의할 수 있으며, 코드의 재사용성과 타입 안정성을 향상 시킬 수 있다.컴파일 타임에 타입을 체크할 수 있어 런타임에 발생할 수 있는 오류를 예방할 수 있으며 형 변환의 번거로움을 줄일 수 있다. T(Type), E(Element), K(Key), V(Value)동작방식은 우선 클래스나 메서드 선언시 타입 매개변수를 선언한다.선언된 제네릭 클래스를 사용할 때는 타입 인자를 지정하여 구체적인 타입을 명시한다.그 후 컴파일러가 타입 안정성을 보..

Java 2025.01.07

Exception

Exception은 프로그램 실행 중 발생하는 예외 상황으로Checked exception과 Unchecked exception 이 있다. Checked Exception컴파일 시점에 발생하며 컴파일러가 예외처리를 강제한다.처리 방법에는 두 가지가 있다.try-catch 블록을 사용throws 키워드를 사용예외가 발생할 수 있는 코드를 try로 감싸고 예외가 발생하는 경우 catch 블록에서 처리한다.throws 키워드는 메서드의 선언부에 사용되어 해당 메서드에서 발생할 수 있는 예외를 호출하는 쪽으로 넘기는 역할을 한다.Unchecked Exception런타임 시점에 발생하는 예외이다.예외 처리를 강제하지 않으며 선택적으로 할 수 있다. 주로 프로그래밍 오류로 발생하며, 예로 NullpointerExc..

Java 2025.01.07

Process와 Thread

Process운영체제에 의해서 메모리에 올라가 실행 중인 프로그램각각의 프로세스마다 독립적인 메모리 공간을 가지며, 다른 프로세스의 메모리 공간에 접근할 수 없다.운영체제에 의해 메모리, 입출력 장치 등의 자원을 할당받으며 상태를 갖는다.프로세스는 최소 하나의 스레드를 갖는다. 멀티 프로세스여러 개의 프로세스가 동시에 실행되는 것 각 프로세스가 독립적인 메모리 공간을 갖기 때문에 하나의 프로세스가 죽어도 다른 프로셋스에 영향을 끼치지 않는다.하지만 독립적인 공간을 갖기 때문에 메모리 사용량이 많고 프로세스 간의 통신이 복잡하다.  Thread프로세스 내에서 동시에 실행되는 작업의 단위로 프로세스안에서 동시에 여러 작업들을 수행할 수 있게 해주는 프로세스 안의 작은 프로세스(경량 프로세스 또는 쓰레드)이다..

Java 2025.01.07

String 객체 선언하기

String 을 선언하는 방법에는 두 가지 방법이 있다. 두 방식은 저장 공간(메모리)에 차이가 있다.  리터럴로 선언리터럴로 선언하는 경우 문자열을 String Constant pool에 저장하기 때문에 메모리의 효율이 좋다.리터럴을 사용하여 생성할 때 상수 풀에 같은 값이 존재하면 객체는 이미 존재하는 값을 참조한다.따라 동일한 문자열을 리터럴로 선언한 변수는 모두 같은 객체를 참조한다.  String Constant Pool의 동작1. String Constant Pool은 JVM이 관리하는 특별한 메모리 영역으로, 문자열 리터럴을 저장하고 관리한다.2. 문자열 리터럴을 선언하면, JVM은 먼저 String Constant Pool에서 동일한 문자열이 존재하는지 확인한다.있는 경우: 기존 문자열 객..

Java 2025.01.06

동등성과 동일성

동일성Identity메모리 주소가 같다.주소 값이 같기 때문에 두 변수가 같은 객체를 가리킨다.==동등성Equality두 객체가 같은 값을 갖는다.객체의 데이터(필드 값)가 동일하다면 두 객체는 동등하다.equals() 메서드     기본 타입의 변수는 값을 직접 저장한다.예를 들어, int, double, char 등의 변수는 메모리에 값 자체를 저장하기 때문에,같은 값을 가지는 여러 변수가 존재해도 각각 독립적으로 메모리에 저장된다. == 연산자를 이용해 값을 비교하며, 두 변수가 같은 값을 가지면 true, 다른 값을 갖는 경우 false를 반환한다.   참조 타입의 변수는 객체의 메모리 주소를 저장한다.값 자체가 아닌 객체가 저장된 메모리 주소를 가리키기 때문에, 같은 값을 갖는 두 객체라도 메모..

Java 2025.01.06

Primitive 타입과 Reference 타입

Primitive Type기본 데이터 타입으로 정수, 실수, 불리언 등의 실제 데이터 값을 저장하는 타입int, long, double, float, boolean   Reference Type객체 참조 타입으로 객체의 주소를 저장하는 타입배열, 클래스, 인터페이스  두 타입의 차이는 메모리 저장 위치와 데이터 처리 방식에 있다.     메모리 저장 위치Primitive Type메모리의 스택 영역에 저장하고,  그 값을 직접 갖는다.스택 영역에 저장되기 때문에 메소드 호출이 종료되면 자동으로 사라진다.스택 영역에 저장된 변수들은 값에 직접 접근이 가능하기 때문에, 메모리 절약 및 속도가 중요한 경우에 사용한다.Reference Type객체의 주소를 스택 영역에 저장한다.실제 데이터는 힙 영역에 저장되며,..

Java 2025.01.06