new String("")
문자열 리터럴
문자열 리터럴은 String Pool
메모리 영역에 저장된다.
동일한 내용의 문자열이 이미 String Pool
에 존재하면 새로운 객체를 생성하지 않고
기존의 객체를 참조하기 때문에 메모리 사용 효율이 높고, 안전하게 사용이 가능하다.
일반적으로 문자열을 생성할 때는 리터럴 방식이 권장된다.
🔍 String Pool
Java에서 문자열 리러털을 효율적으로 관리하기 위해 사용되는 메모리 영역
문자열 리터럴이 사용되면 JVM에서 String Pool
에 해당 문자열이 존재하는지 확인
new String
Heap 메모리 영역에 문자열 객체를 명시적으로 생성하며
동일한 내용이라도 항상 새로운 객체를 생성하기 때문에 메모리 사용량이 증가할 수 있다.
보안상의 이유로 String Pool
에 저장되지 않고 독립적으로 객체를 생성해야 할 때 사용한다.
String, StringBuilder, StringBuffer
1) String
문자열이 생성된 이후에는 변경할 수 없고, 항상 새로운 객체가 생성되어 속도가 느리다.
변경이 적은 문자열을 처리할 때 주로 사용한다.
2) StringBuilder
기존 객체를 수정하여 문자열을 변경할 수 있다.
동기화(synchronization
)가 되어 있지 않아 단일스레드 환경에서는 성능이 뛰어나지만
Thread-Safe
가 아니므로 멀티스레드 환경에서는 주의가 필요하다.
단일스레드 환경에서 문자열 변경이 많은 경우에 사용한다.
3) StringBuffer
기존 객체를 수정하여 문자열을 변경할 수 있다.
동기화(synchronization
)가 되어 있어 멀티스레드 환경에서도 안전하게 사용 가능하지만,
동기화로 인해 단일스레드 환경에서는 StringBuilder
보다 속도가 느리다.
멀티스레드 환경에서 문자열 변경이 많은 경우에 사용한다.
🔍 동기화(synchronization
)와 Thread-Safe
동기화란 멀티스레딩 환경에서 하나의 공유 자원에 하나의 스레드만 접근 가능하도록
제한하는 매커니즘이고, Thread-Safe
란 동시에 여러 스레드가 접근하더라도 프로그램이
예상대로 동작하는 것을 의미한다. 즉 동기화를 통해 Thread-Safe
를 보장할 수 있다.
Exception (🍀)
프로그램 실행 중에 발생하는 복구 가능한 문제를 말한다.
주로 사용자 입력, 네트워크, 파일 입출력 등의 문제로 발생하며
try ~ catch
를 통해 예외를 처리하여 프로그램을 계속 실행할 수 있다.
Checked Exception
컴파일러가 예외 처리를 강제하는 예외로,
try ~ catch
, throws
키워드 등으로 반드시 처리해야 한다.
IOException
, SQLException
, ClassNotFoundException
Unchecked Exception
런타임 시 발생하며 컴파일러가 예외 처리를 강제하지 않아
코드 작성이 간결하며 반드시 처리하지 않아도 프로그램이 컴파일 및 실행됨
NullPointerException
, ArrayIndexOutOfBoundsException
Error
시스템에서 발생하는 복구 불가능한 문제를 말한다.
JVM의 동작, 시스템 리소스 등의 심각한 문제로 발생하며
예외 처리가 불가능해 프로그램 중단 위험이 있다.
예) OutOfMemory
, StackOverflow
throw
와 throws
throw
: 예외를 직접 발생시키는 키워드
메서드 내부에서 new
키워드로 구체적인 예외 객체를 생성하여 던진다.
예외가 즉시 처리되지 않으면 런타임 에러가 발생한다.
throws
: 메서드가 예외를 호출자에게 전달함을 선언하는 키워드
메서드 선언부에서 Checked Exception을 컴파일러와 호출자에게 전달하여
발생 가능한 예외를 호출자가 처리할 수 있도록 알린다.
Java에서 클래스, 메서드, 컬렉션에서 데이터 타입을 한 종류로 제한하는 기능으로
컴파일 시 타입 안정성과 코드 재사용성을 높인다.