📚 자바에서 String 이란?
java에서 문자열의(연속된 문자들의 집합)을 나타내는 클래스이다.
java.lang패키지에 속해있고 기본 데이터타입이 아닌 객체타입이다.
- String Literal:
- String Pool에 저장됨.
- 동일한 값의 리터럴이 있으면 재사용
- new String(""):
- Heap 메모리에 새로운 객체를 생성.
- 동일한 값을 가진 String Literal이 있더라도 다른 객체를 생성
// String Literal 예시
String str1 = "Hello";
String str2 = "Hello"; // str1과 동일 객체 참조
//new String("") 예시
String str1 = new String("Hello");
String str2 = new String("Hello"); // 서로 다른 객체
📚 String, StringBuilder, StringBuffer의 차이
String:
불변 객체(Immutable)이며 문자열 수정 시 새로운 객체를 생성한다.
* for문에서는 지양한다
그 이유는 String 객체를 반복적으로 수정할 경우, 매번 새로운 객체를 생성하기 때문에 성능이 저하된다. 특히, 반복문에서 많은 문자열 연산이 이루어질 경우 객체 생성 비용이 커지기 때문이다.
StringBuilder:
가변 객체 (Mutable)이며, 동기화를 지원하지 않음 → 단일 스레드 환경에서 사용 권장한다.
StringBuffer:
가변 객체 (Mutable)이고 동기화 지원 → 멀티스레드 환경에서 사용 가능.
성능은 StringBuilder보다 느림.
String str = "Hello";
str = str + " World"; // 새로운 객체 생성
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 기존 객체 수정
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 기존 객체 수정
📚 예외(Exception)
자바에서 에러란?
프로그램이 실행 중 어떤 원인에 의해 오작동을 하거나 비정상적으로 종료되는 경우가 있다.
이러한 결과를 초래하는 원인을 '프로그램 에러' 또는 '오류'라고 한다.
에러의 종류
- 컴파일에러: 컴파일시에 발생하는 에러
- 런타임에러: 실행시에 발생하는 에러
- 논리적에러: 실행은 되지만, 의도와 다르게 동작하는 것
자바에서는 프로그램 실행 시(runtime) 발생할 수 있는 오류를 '에러(Error), '예외(Exception)' 두가지로 구분한다.
- 에러: 프로그램 코드에 의해 수습될 수 없는 심각한 오류
- 예외: 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
예외 클래스의 계층 구조
자바에서는 이 두개를 클래스로 정의하였으며, 조상은 Object클래스로 Exception과 Error클래스가 자손이다.
예외 클래스
1) Exception클래스와 그 자손
2) RuntimeException클래스와 그 자손들
이 두가지로 크게 나뉜다
여기에서 1번의 경우는, 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
2번의 경우는 프로그래머의 실수로 발생하는 예외가 있다. ex) null인 값의 참조변수의 멤버를 호출한다거나 배열의 범위를 벗어나는 경우...
예외 처리하기 : try - catch
정의 : 프로그램 실행시의 발생할 수 있는 예외에 대비한 코드를 작성하는 것
목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
만일, 발생하는 예외를 처리하지 못한다면 프로그램은 비정상적으로 종료되고 처리되지 못한 예외는 JVM의 '예외 처리기(UncaughtExceptionHandler)'가 받아서 예외의 원인을 화면에 출력한다.
try 블록에서 작성한 코드가 예외없이 정상 실행되면 catch블록은 실행되지 않고 finally블록이 실행됨
그러나 try블록에 예외가 발생하면 catch 블록이 실행 -> finally블록 실행
예외 상관이 없이 finally는 항상 실행됨 (옵션으로 생략 가능)
catch블로기 여러개여도 단 하나만 실행됨.
이유는 try블록에서 동시 다발적으로 예외가 발생되는 것이 아니고, 하나의 예외의 발생하면 즉시 실행을 멈추고 해당 catch블록으로 이동함
처리해야하는 예외클래스들이 상속에 있을때는 하위클래스 catch블록을 먼저 작성하고 상위 catch블록을 나중에 작성해야함
예외가 발생하면 catch블록이 위해서부터 차례대로 검사하고, 하위 예외도 상위 클래스 타입으로 상위 클래스 catch블록이 먼저 검사 대상이 되면 안됨
Checked Exception과 Unchecked Exception
Checked Exception (검사 예외):
- IOException: 파일이나 데이터 스트림 작업 중 발생하는 예외.
- SQLException: 데이터베이스 작업 중 발생하는 예외.
Unchecked Exception (비검사 예외):
- NullPointerException: 객체가 null인데 메서드나 필드에 접근할 때 발생.
- ArrayIndexOutOfBoundsException: 배열 인덱스가 범위를 벗어날 때 발생.
- ArithmeticException: 0으로 나누기 등의 수학적 오류가 발생할 때 발생.
Checked Exception과 Unchecked Exception의 차이
- Checked Exception:
- 컴파일 타임에 발생할 가능성을 컴파일러가 체크.
- try-catch 구문으로 처리하거나 throws로 선언해야 함.
- 예시: IOException, SQLException.
- Unchecked Exception:
- 런타임에 발생하는 예외로 컴파일러가 강제적으로 체크하지 않음.
- 예외 처리 (try-catch)가 필수가 아님.
- 예시: NullPointerException, ArrayIndexOutOfBoundsException.
📚 throw와 throws란?
예외 떠넘기기 - throws
메소드를 호출한 곳에서 예외를 떠넘길 수 있다. 메소드 선언부 끝에 작성하고 ','쉼표를 사용해서 구분해주면 된다
- throw:
- 예외를 직접 발생시킬 때 사용.
- 메서드 내부에서 사용됨.
- throws:
- 메서드가 특정 예외를 던질 가능성이 있다고 선언할 때 사용.
- 메서드 시그니처에 위치.
Throwable과 Exception의 차이
- Throwable:
- 예외와 오류의 최상위 클래스.
- 두 하위 클래스:
- Error: 시스템 수준의 심각한 오류 (예: OutOfMemoryError).
- Exception: 프로그램에서 처리 가능한 예외.
- Exception:
- Throwable의 하위 클래스.
- 프로그램에서 처리 가능한 예외를 나타냄.
- 다시 Checked Exception과 Unchecked Exception으로 나뉨.
'🍎 Backend > JAVA' 카테고리의 다른 글
[JAVA] Garbage Collector, GC (0) | 2025.01.30 |
---|---|
[JAVA] JVM의 구조 (0) | 2025.01.30 |
[JAVA] 제네릭, 지네릭스(Generics) (0) | 2025.01.09 |
[JAVA] 어노테이션(Annotation) (0) | 2025.01.09 |
[JAVA] 람다(Lambda)와 스트림(Stream) (0) | 2025.01.09 |