[JSCODE] 모의면접으로 학습하는 자바 2주차 - 문자열, 예외, 제네릭 (1~10)

동춘·2024년 11월 4일

[면접스터디] 자바

목록 보기
4/15

문자열, 예외, 제네릭

1. String literal과 new String("")의 차이

  • 자바의 두가지 String 생성 방식
    • new String() -> Heap 메모리 영역에 저장
    • String literal -> Heap 메모리 영역내에 String constant pool에 저장
String str1 = new String("Hello"); 
String str2 = "Hello"; 
String str3 = "Hello";

  • 리터럴은 생성할 때 constant pool에 같은 값이 존재한다면 생성되는 객체는 이미 존재하고 있는 값을 참조한다.
  • new 연산자로 생성된 String 객체는 같은 값이 String pool에 존재하더라도, Heap영역에 별도로 객체를 생성한다.
  • String Constant Pool이란 자바에서 문자열을 효율적으로 관리하기 위해 생성된 메모리 영역, (JVM의 Heap 메모리중 일부에 위치)
    • 메모리 절약 : 동일한 문자열 객체를 재사용하여 메모리 사용량을 줄입니다.
    • 성능 향상 : 문자열 비교시 동일한 객체를 참조, 빠른 비교가 가능합니다.

꼬리물기

  • literal이란 ? 코드에 직접 입력한값
    • call by reference 가 접목되지 않았을까 ?
  • 동일성과 동등성 : new String 은 같은 단어를 만들어도 동일하지 않고 동등하지만
    "Hello"와 같은 String constant pool의 사용은 동일 동일성을 보장한다
  • 기본형과 다른점 ? 기본형의 리터럴은 새로운 객체를 생성합니다, 하지만 == 연산자로는 동등성만 확인됩니다.

2. String, StringBuilder, StringBuffer의 차이점

String: 불변(immutable) 객체로, 문자열을 수정할 때마다 새로운 객체가 생성됩니다.
StringBuilder: 가변(mutable) 객체로, 문자열 변경이 가능하며, 동기화되지 않아 단일 스레드에서 빠르게 사용할 수 있습니다.
StringBuffer: StringBuilder와 비슷하지만, 스레드 안전(thread-safe)을 위해 동기화가 되어 있어 멀티스레드 환경에 적합합니다.

꼬리물기

  • thread-safe란? 여러 객체의 동시 접근해도 안전하게 동작하여 데이터의 일관성과 무결성 유지를 돕습니다.
  • synchronized란? 동기화 메커니즘을 제공하여 멀티 스레드 환경에서 여러 스레드가 하나의 공유 자원에 동시에 접근하는 것을 제어합니다.
    • lock을 걸어서 하나의 쓰레드만 사용할수있게 보장하고 접근한 다른 쓰레드는 cache에 저장하여 순서를 보장합니다.
  • 그래서 어떤 객체를 어떻게 사용해야하나 ? (지양과 지향) 다중사용하여 접근하는 경우 StringBuffer를 사용하여 데이터의 일관성을 지켜야 합니다.

3. Exception과 Error의 차이


Exception: 프로그램 실행 중에 발생하는 예외로, 예외 처리를 통해 복구가 가능합니다. 예상가능한 에러
try-catch 구문으로 처리.
Error: 시스템의 심각한 문제로 인해 발생하며, 일반적으로 프로그램이 복구할 수 없고 종료됩니다. 예: OutOfMemoryError.

꼬리물기

  • 예시 들어보기

4. Exception 클래스의 예시

IOException: 입출력 작업 중 발생하는 예외.
SQLException: 데이터베이스와 관련된 작업 중 발생하는 예외.
NullPointerException: 객체 참조가 null일 때 발생하는 예외.

꼬리물기

  • 경험에 빗대어 예시를 들어주세요
  • IOException, NullPointerException 등

5. Checked Exception과 Unchecked Exception의 차이

Checked Exception: 컴파일 시에 확인되는 예외로, 예외 처리를 강제합니다. 예: IOException, SQLException.
Unchecked Exception: 실행 시에 확인되는 예외로, 예외 처리가 강제되지 않습니다. 예: NullPointerException, ArithmeticException.

꼬리물기

  • 예시 고민하기
  • checked exception은 whiteBox검사에서 컴파일시 강제되는 예외처리를 미해결 되었을때 컴파일시 확인되는 에러입니다.

6. throw와 throws의 차이

throw: 특정 예외를 강제로 발생시킬 때 사용합니다.
throws: 메서드 선언부에 예외를 명시하여 메서드를 사용하는 구문에서 예외처리(try-catch)를 강제합니다.

꼬리물기

  • throws는 interface와 같은 exception 구현체 협업시 규약설정 같은것...?

7. try-catch-finally 구문에서 finally의 역할

finally 블록은 예외 발생 여부와 관계없이 항상 실행되는 코드 블록으로, 자원 해제나 정리 작업을 수행할 때 유용합니다. 예: 파일 닫기, 데이터베이스 연결 종료.

꼬리물기

  • ex) db 종료 안할때 : 의도치 않은 데이터의 오염, (db의 동시성 문제)성능 저하

8. Throwable과 Exception의 차이

Throwable은 Exception과 Error의 상위 클래스이며, 모든 예외와 에러의 최상위 클래스입니다.
Exception은 Throwable을 상속받은 하위 클래스 중 하나로, 주로 프로그램이 복구 가능한 상황을 나타냅니다.

꼬리물기

  • Throwable은 언제 쓸까 ?
  • 예시를 잘 들어보기..

9. 제네릭(Generic)이란 무엇이고, 왜 사용할까요?

제네릭은 클래스나 메서드에서 사용할 데이터 타입을 나중에 지정할 수 있도록 하는 기능입니다. 제네릭을 사용하지 않는 컬렉션은 Object 타입으로 간주되어, 다양한 타입의 객체를 저장할 수 있습니다.
이를 통해 타입 안정성을 높여 런타임에 발생할 수 있는 ClassCastException을 방지할 수 있으며, 코드의 재사용성을 높입니다.

꼬리물기

  • 타입안정성이란 ? 컬렉션 객체에 타입을 정해주는것. 제네릭을 사용하면 컴파일 시점에 타입 검사가 이루어져, 잘못된 타입을 사용하는 코드에 대해 컴파일 에러가 발생합니다. 이는 ClassCastException과 같은 런타임 오류를 줄여주며, 코드의 안전성을 높입니다.
  • 타입 매개변수를 사용하여 타입을 강요하지만 다양한 타입에도 사용 될 수 있게하여 다형성을 지원합니다

10. 제네릭을 사용한 경험

타입 안정성을 보장한 경험이 있습니다. 예를 들어, ArrayList 대신 ArrayList<String>과 같은 제네릭 타입을 사용하여 런타임에 발생할 수 있는 ClassCastException을 방지할 수 있었습니다.

꼬리물기

  • 예시 responseEntity
profile
건강하개

0개의 댓글