String str1 = new String("Hello");
String str2 = "Hello";
String str3 = "Hello";

- 리터럴은 생성할 때 constant pool에 같은 값이 존재한다면 생성되는 객체는 이미 존재하고 있는 값을 참조한다.
- new 연산자로 생성된 String 객체는 같은 값이 String pool에 존재하더라도, Heap영역에 별도로 객체를 생성한다.
꼬리물기
- literal이란 ? 코드에 직접 입력한값
- call by reference 가 접목되지 않았을까 ?
- 동일성과 동등성 : new String 은 같은 단어를 만들어도 동일하지 않고 동등하지만
"Hello"와 같은 String constant pool의 사용은 동일 동일성을 보장한다- 기본형과 다른점 ? 기본형의 리터럴은 새로운 객체를 생성합니다, 하지만 == 연산자로는 동등성만 확인됩니다.
String: 불변(immutable) 객체로, 문자열을 수정할 때마다 새로운 객체가 생성됩니다.
StringBuilder: 가변(mutable) 객체로, 문자열 변경이 가능하며, 동기화되지 않아 단일 스레드에서 빠르게 사용할 수 있습니다.
StringBuffer: StringBuilder와 비슷하지만, 스레드 안전(thread-safe)을 위해 동기화가 되어 있어 멀티스레드 환경에 적합합니다.
꼬리물기
- thread-safe란? 여러 객체의 동시 접근해도 안전하게 동작하여 데이터의 일관성과 무결성 유지를 돕습니다.
- synchronized란? 동기화 메커니즘을 제공하여 멀티 스레드 환경에서 여러 스레드가 하나의 공유 자원에 동시에 접근하는 것을 제어합니다.
- lock을 걸어서 하나의 쓰레드만 사용할수있게 보장하고 접근한 다른 쓰레드는 cache에 저장하여 순서를 보장합니다.
- 그래서 어떤 객체를 어떻게 사용해야하나 ? (지양과 지향) 다중사용하여 접근하는 경우 StringBuffer를 사용하여 데이터의 일관성을 지켜야 합니다.

Exception: 프로그램 실행 중에 발생하는 예외로, 예외 처리를 통해 복구가 가능합니다. 예상가능한 에러
try-catch 구문으로 처리.
Error: 시스템의 심각한 문제로 인해 발생하며, 일반적으로 프로그램이 복구할 수 없고 종료됩니다. 예: OutOfMemoryError.
꼬리물기
- 예시 들어보기
IOException: 입출력 작업 중 발생하는 예외.
SQLException: 데이터베이스와 관련된 작업 중 발생하는 예외.
NullPointerException: 객체 참조가 null일 때 발생하는 예외.
꼬리물기
- 경험에 빗대어 예시를 들어주세요
- IOException, NullPointerException 등
Checked Exception: 컴파일 시에 확인되는 예외로, 예외 처리를 강제합니다. 예: IOException, SQLException.
Unchecked Exception: 실행 시에 확인되는 예외로, 예외 처리가 강제되지 않습니다. 예: NullPointerException, ArithmeticException.
꼬리물기
- 예시 고민하기
- checked exception은 whiteBox검사에서 컴파일시 강제되는 예외처리를 미해결 되었을때 컴파일시 확인되는 에러입니다.
throw: 특정 예외를 강제로 발생시킬 때 사용합니다.
throws: 메서드 선언부에 예외를 명시하여 메서드를 사용하는 구문에서 예외처리(try-catch)를 강제합니다.
꼬리물기
- throws는 interface와 같은 exception 구현체 협업시 규약설정 같은것...?
finally 블록은 예외 발생 여부와 관계없이 항상 실행되는 코드 블록으로, 자원 해제나 정리 작업을 수행할 때 유용합니다. 예: 파일 닫기, 데이터베이스 연결 종료.
꼬리물기
- ex) db 종료 안할때 : 의도치 않은 데이터의 오염, (db의 동시성 문제)성능 저하
Throwable은 Exception과 Error의 상위 클래스이며, 모든 예외와 에러의 최상위 클래스입니다.
Exception은 Throwable을 상속받은 하위 클래스 중 하나로, 주로 프로그램이 복구 가능한 상황을 나타냅니다.
꼬리물기
- Throwable은 언제 쓸까 ?
- 예시를 잘 들어보기..
제네릭은 클래스나 메서드에서 사용할 데이터 타입을 나중에 지정할 수 있도록 하는 기능입니다. 제네릭을 사용하지 않는 컬렉션은 Object 타입으로 간주되어, 다양한 타입의 객체를 저장할 수 있습니다.
이를 통해 타입 안정성을 높여 런타임에 발생할 수 있는 ClassCastException을 방지할 수 있으며, 코드의 재사용성을 높입니다.
꼬리물기
- 타입안정성이란 ? 컬렉션 객체에 타입을 정해주는것. 제네릭을 사용하면 컴파일 시점에 타입 검사가 이루어져, 잘못된 타입을 사용하는 코드에 대해 컴파일 에러가 발생합니다. 이는 ClassCastException과 같은 런타임 오류를 줄여주며, 코드의 안전성을 높입니다.
- 타입 매개변수를 사용하여 타입을 강요하지만 다양한 타입에도 사용 될 수 있게하여 다형성을 지원합니다
타입 안정성을 보장한 경험이 있습니다. 예를 들어, ArrayList 대신 ArrayList<String>과 같은 제네릭 타입을 사용하여 런타임에 발생할 수 있는 ClassCastException을 방지할 수 있었습니다.
꼬리물기
- 예시 responseEntity