coyojo10의 개발블로그!
자바 기술 면접 정리 3 본문
String, StringBuilder, StringBuffer 각각의 차이에 대해 설명해주세요. String : 문자열 연산이 적고 멀티쓰레드 환경일 경우 StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경일 경우 StringBuilder : 문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우 String과 StringBuffer/StringBuilder 클래스의 가장 큰 차이점은 String은 불변(immutable)의 속성을 갖는다는 점입니다. String 클래스는 불변하기 때문에 문자열을 수정하는 시점에 새로운 String 인스턴스가 생성된 것이지요. string은 불변성을 가지기 때문에 변하지 않는 문자열을 자주 읽어들이는 경우 String을 사용해 주시면 좋은 성능을 기대할 수 있습니다. 그러나 문자열 추가,수정,삭제 등의 연산이 빈번하게 발생하는 알고리즘에 String 클래스를 사용하면 힙 메모리(Heap)에 많은 임시 가비지(Garbage)가 생성되어 힙메모리가 부족으로 어플리케이션 성능에 치명적인 영향을 끼치게 됩니다. 가변(mutable)성을 가지는 StringBuffer / StringBuilder 클래스 String 과는 반대로 StringBuffer/StringBuilder 는 가변성 가지기 때문에 .append() .delete() 등의 API를 이용하여 동일 객체내에서 문자열을 변경하는 것이 가능합니다. 따라서 문자열의 추가,수정,삭제가 빈번하게 발생할 경우라면 String 클래스가 아닌 StringBuffer/StringBuilder를 사용하셔야 합니다. 그렇다면 동일한 API를 가지고 있는 StringBuffer, StringBuilder의 차이점은 무엇일까요? 가장 큰 차이점은 동기화의 유무로써 StringBuffer는 동기화 키워드 (Syncronized)를 지원하여 멀티쓰레드 환경에서 안전하다는 점(thread-safe) 입니다. 참고로 String도 불변성을 가지기때문에 마찬가지로 멀티쓰레드 환경에서의 안정성(thread-safe)을 가지고 있습니다. 반대로 StringBuilder는 동기화를 지원하지 않기때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer 보다 뛰어납니다. |
Checked Exception과 Unchecked Exception에 대해 설명해주세요. 프로그래밍에서 예외란 입력 값에 대한 처리가 불가능하거나, 프로그램 실행 중에 참조된 값이 잘못된 경우 등 정상적인 프로그램의 흐름을 어긋나는 경우를 말한다. 그리고 자바에서 예외는 개발자가 직접 처리할 수 있기 때문에 예외 상황을 미리 예측하여 핸들링할 수 있다. 그러나, 에러는 시스템에 무엇인가 비정상적인 상황이 발생한 경우를 말한다. Unchecked Exception명시적인 예외 처리를 강제하지 않기 때문에 Uncheked Exception이라고 한다. 명시적인 예외 처리란 try ~ catch로 예외를 잡거나 throw로 호출한 메소드에게 예외를 던지지 것이므로 이것을 하지 않는 행위를 Unchecked Exception 이라고 말한다.Unchecked Exception은 RuntimeException을 상속한 클래스이며, 명시적인 예외 처리를 하지 않는다. 런타임 시점에 확인할 수 있고 트랜잭션 안에서 동작할 때 Unchecked Exception이 발생하면 롤백된다는 특징이 있다. Checked Exception명시적인 예외 처리를 강제하기 때문에 Checked Exception이라 한다. 반드시 try ~ catch로 예외를 잡거나 throw로 호출한 메소드에게 예외를 던져야 한다.Checked Exception은 RuntimeException을 상속하지 않은 클래스이며, 명시적인 예외 처리를 해야 한다. 컴파일 시점에 확인할 수 있고 트랜잭션 안에서 동작할 때 Checked Exception이 발생하면 롤백되지 않는다는 특징이 있다. |
try-with-resource에 대해서 설명해주세요. try 구문에 리소스를 선언하고, 리소스를 다 사용하고 나면 자동으로 반납(close) 해주는 기능입니다. java.lang.AutoCloseable 인터페이스를 구현하는 객체가 try with resources의 resource로 사용될 수 있습니다. 참고로 나중 선언된 리소스부터 반납된다. try 블록에는 예외발생 가능 코드가 위치합니다. try블록의 코드가 정상적으로 실행이 된다면 catch는 실행되지 않고 바로 finally블록으로 이동합니다. - try블록에서 예외가 발생하면 즉시 실행을 멈추고 catch로 이동하여 예외처리 코드가 실행되요 finally블록은 예외 발생과 상관 없이 항상 실행할 내용을 포함합니다. 생략이 가능합니다. 예외 떠넘기기 (throws) 예외 처리 중 필요에 따라 메소드를 호출한 곳으로 예외처리를 떠넘길 수 있습니다. 이따 사용하는 것이 바로 throws입니다. 이는 메소드의 선언부에서 선언되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘깁니다. |
강한 결합과 느슨한 결합이 무엇인지 설명해주세요. 1.간단정의 강한 결합 # 구현 클래스 직접 참조 #클래스와 객체가 의존적 # 객체가 변경되면 클래스도 전체적으로 수정되어야 할 위험 존재 구현 클래스를 직접 참조하는 것과 같이 클래스와 객체가 서로 의존적이라 객체가 변경될 시 클래스가 전체적으로 수정되어야 할 위험이 있음. 유연성과 코드의 재사용성이 어려워 좋지 않다 느슨한 결합 # 인터페이스를 사용해 의존성을 최소화하는 것 # 직접 구현 클래스 참조하는 클래스의 의존성을 줄이는 것 인터페이스 클래스를 사용해 의존성을 최소화하는 것 , 즉 다른 구현 클래스를 직접적으로 참조하는 의존성을 줄이는 것 |
자바의 동시성 이슈(공유자원 접근)에 대해 설명해주세요. # 멀티 쓰레드 환경에서 발생하는 문제점 동시성 이슈란? 여러 스레드가 공유 자원에 동시에 변경을 할 경우 각 쓰레드가 기대하던 값과는 다른 결과를 반환하는 것을 의미한다. 예를 들면 하나의 세션이 데이터를 수정중일 때 , 다른 세션에서 수정 전의 데이터를 조회해 로직을 처리함으로써 잘못된 결과를 반환하는 문제를 말합니다.따라서 멀티 스레드 환경에서 동시성 제어를 위해 공유 객체를 동기화 하는 키워드인 synchronized를 사용한다.한 스레드가 synchronized 메서드를 호출하면 해당 메서드의작업이 끝날때까지 다른 스레드에서는 synchronized 메서드를 호출하지 못한다. 추가로, 이미 생성된 객체의 접근을 제한하는 것이기 때문에 생성자에 synchronized를 붙이지는 못한다.동시성을 제어하는 방법synchronized의 상호 배제Java의 모든 인스턴스는 각각의 고유한 lock을 갖고 있다. 스레드가 synchronized 메서드를 실행하는 경우 자동으로 lock을 획득하고, 메서드가 반환될 때 lock을 해제하는 과정을 거친다. lock은 인스턴스 단위로 적용되며 한 스레드가 lock을 획득한 상태에서 다른 스레드가 해당 lock을 획득하는 것은 불가능하다. (synchronized는 static 메서드 등에도 적용할 수 있는데, 이 경우에는 인스턴스가 아닌 Class object에 적용된다.)synchronized와 성능하지만 모든 동시성을 제어하기 위해 synchronized를 모든 메서드에 다는 행위는 성능에 심각한 영향을 미칠 수 있다. synchronized의 상호 배제에서 설명했듯 lock을 획득하는 단위는 '인스턴스'이다. 한 인스턴스 내에 synchronized 메서드가 여러개가 있다고 가정해보겠다. 한 스레드에서 synchronized 메서드를 호출하고 있다면 다른 스레드들에서는 해당 인스턴스의 모든 synchronized 메서드를 호출하기 위해 모두 대기하는 상황이 오게 된다 |
Mutable 객체와 Immutable 객체의 차이점에 대해 설명해주세요. Mutable한 객체는 생성된 이후에 상태가 변경될 수 있는 객체이고, Immutable한 객체는 생성된 이후에 상태가 변경되지 않는 객체를 말한다. Mutable은 객체의 수정을 허용하나, Immutable인 경우(불변의) 객체의 수정을 허용하지 않는다. 수정이 필요할 경우 Mutable 객체는 기존의 객체에 수정사항을 곧바로 반영한다. 하지만 Immutable 객체의 경우 기존의 객체는 그대로 두고 수정사항을 반영한 새로운 객체를 생성한다는 점에서 차이가 있다. Immutable의 대표적 예시로는 String class가 존재한다. ![]() |
JRE와 JDK의 차이점은?JRE는 자바 실행 환경(Java Runtime Environment)의 약자로 자바로 만들어진 프로그램을 실행시키는데 필요한 라이브러리들과 각종 API, 그리고 자바 가상 머신 (JVM)이 포함되어 있습니다. JRE는 자바로 "개발(쓰기)은 안되고 실행(읽기)만 된다"라고 생각해주시면 될 것 같습니다.JDK는 자바 개발키트(Java Development Kit)의 약자로 이름 그대로 개발자들이 자바로 개발하는 데 사용됩니다. JDK안에는 개발 시 필요한 라이브러리들과 javac, javadoc 등의 개발 도구들을 포함되어 있고 개발을 하려면 당연히 실행도 시켜줘야 하기 때문에 JRE (Java Runtime Environment)도 함께 포함되어 있습니다. |
'백엔드' 카테고리의 다른 글
MVC패턴의 분리 - Spring 컨트롤러 메서드 반환타입에 정리 (0) | 2023.05.26 |
---|---|
자바 기술 면접 정리 2 (0) | 2023.05.09 |
자바 기술 면접 정리 (0) | 2023.05.09 |
[자바 백엔드 멀티캠퍼스] - Servlet 정리 2 (0) | 2023.04.24 |
[자바 백엔드 멀티캠퍼스] 수업 리뷰 - Servlet 정리 (0) | 2023.04.21 |