본문 바로가기

Computer Science

[자바] CS 질문 리스트 정리

반응형
SMALL

 

과거 공부 기록을 복습하고 정리한다.

 

🗂️ Java의 특징을 설명해주세요.

자바는 객체지향적인 언어로, 추상화, 상속성, 다형성, 캡슐화 특징을 가지고 있습니다.
또한, JVM 위에서 동작하기 때문에 운영체제로부터 독립적인 특징도 있습니다.

추상화는 공통점과 본질을 모아 추출하는 것입니다.
상속성은 기존 클래스를 활용하여 새로운 클래스를 생성하는 것입니다.
다형성은 어떤 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있는 것입니다.
캡슐화는 서로 연관된 속성이나 기능을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것입니다.

 

 

JVM 역할에 대해 설명해주세요.

Java Virtual Machine의 약어로, 자바와 운영체제 사이에서 자바가 독립적으로 실행될 수 있도록 합니다.
자바의 바이트 코드를 기계어로 변환하여 실행되도록 하고, 메모리 관리와 GC 역할도 수행합니다.

 

 

JVM 구조에 대해 설명해주세요.

클래스 로더, 런타임 데이터 영역, 실행 엔진, GC로 구성되어 있습니다.

클래스 로더는 자바의 클래스 파일을 런타임 데이터 영역의 메서드 영역으로 넘깁니다.
런타임 데이터 영역은 자바의 메모리 공간입니다.
실행 엔진은 자바의 바이트 코드를 실행 가능하도록 해석합니다.
GC는 힙 영역에 배치된 메모리를 관리합니다.

 

 

런타임 데이터 영역에 대해 설명해주세요.

메서드 영역, 힙, PC 레지스터, JVM 스택, 네이티브 메서드 스택으로 구성됩니다.

메서드 영역은 클래스 정보를 처음으로 메모리에 올릴 때 초기화되는 대상을 저장합니다.
은 동적으로 생성된 객체의 인스턴스가 할당됩니다.
PC 레지스터는 어떤 명령을 실행해야 할 지 기록을 담당합니다.
JVM 스택은 호출된 메서드의 매개변수, 지역변수 등이 저장됩니다.
네이티브 메서드 스택은 자바 외의 언어에 제공되는 메서드의 정보를 저장합니다.

 

 

Java의 컴파일 과정에 대해 설명해주세요.

개발자가 코드를 작성하여 자바 파일을 생성합니다.
파일을 빌드하여, 컴파일러를 통해 바이트 코드를 생성합니다.
클래스 로더를 통해 바이트 코드를 JVM 메모리로 로드합니다.
실행 엔진을 통해 운영체제를 고려하여 컴퓨터가 읽을 수 있는 기계어로 해석됩니다.

 


🗂️ 오버라이딩과 오버로딩에 대해 설명해주세요.

오버라이딩은 상위 클래스에 있는 메서드를 하위 클래스에서 재정의하는 것입니다.
오버로딩은 매개변수의 개수나 타입을 다르게 하여 같은 이름을 여러 개 정의하는 것입니다.

 


🗂️ 객체지향 프로그래밍에 대해 설명해주세요.

상태와 행위를 가진 객체를 만들고, 각각의 역할이 무엇인지 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것입니다.

 

 

객체지향 설계 원칙에 대해 설명해주세요.

SOLID 원칙이라고도 합니다. 단일 책임의 원칙, 개방 폐쇄 원칙, 리스코프 치환 형식, 인터페이스 분리 법칙, 의존 관계 역전 원칙을 포함합니다.

 

✍️ 단일 책임 원칙: 한 클래스는 하나의 책임만 가진다.

✍️ 개방 폐쇄 원칙: 확장에는 열려있고, 수정에는 닫혀있어야 한다.

✍️ 리스코프 치환 형식: 부모, 자식 객체가 있을 때, 부모 객체를 호출하는 동작에서 자식 객체가 완전히 대체할 수 있어야 한다.

✍️ 인터페이스 분리 법칙: 인터페이스 내의 메서드는 최소한일수록 좋다.

✍️ 의존 관계 역전 원칙: 구체 클래스보다 인터페이스, 추상 클래스와 같이 변할 가능성이 낮은 클래스와 관계를 맺어야 한다.

 


🗂️ try-with-resources에 대해 설명해주세요.

try-catch-finally를 보완합니다. 따로 catch나 finally 구문에 종료 처리를 하지 않아도, try 구문에 객체를 전달하면 try 블록이 끝나면 자동으로 자원을 해제합니다.

 


🗂️ 불변 객체에 대해 설명해주세요.

불변 객체는 객체 생성 이후 내부 상태가 변하지 않는 객체입니다.

 

 

참조 타입일 경우 추가적인 작업은 어떤 것이 있을까요?

객체를 참조할 경우 필드의 참조 변수도 불변 객체로 정의해야 합니다.
배열 또는 리스트를 참조할 경우는 copy해서 전달받도록 하는데, 이를 방어적 복사라고 합니다.

 

 

불변 객체나 final을 사용하는 이유는 무엇일까요?

Thread-safe하기 때문에 병렬 프로그래밍에 유용하고, 동기화를 고려하지 않아도 됩니다.
또한, GC의 성능도 높일 수 있습니다.

 

 

불변 객체가 GC의 성능에 도움이 되는 이유는 무엇일까요?

불변 객체를 이용하면 불변 객체 내부의 객체에 대해서는 GC 스캔 대상에서 제외됩니다.
결과적으로 GC의 스캔 빈도와 범위가 줄어 성능이 향상되는 이점을 얻을 수 있습니다.

 


🗂️ 추상 클래스와 인터페이스에 대해 설명해주세요.

추상 클래스는 상속받아 기능을 재활용하고 확장시키는 데 존재 목적이 있고,
인터페이스는 구현을 강제하여 구현체들이 같은 동작을 하는 데 존재 목적이 있습니다.

 


🗂️ 싱글톤 패턴에 대해 설명해주세요.

단 하나의 인스턴스를 생성하여 사용하는 디자인 패턴입니다.

 

 

예시를 설명해주세요.

대표적인 예로 스프링 빈이 있습니다. 스프링 컨테이너는 모든 빈들을 싱글톤 패턴으로 관리합니다.

 


🗂️ 가비지 컬렉션(GC)에 대해 설명해주세요.

동적으로 할당한 메모리 영역에서 참조하지 않는 메모리를 회수하여 메모리를 관리하는 것입니다.

 

 

과정에 대해 설명해주세요.

JVM이 어플리케이션 실행을 잠시 멈추고, GC를 실행하는 스레드 외 모든 스레드의 작업을 중단합니다.
이후 사용하지 않는 메모리를 제거하고 작업이 재개됩니다.

 


🗂️ 클래스와 객체에 대해 설명해주세요.

클래스는 객체를 생성하는 데 사용되고, 객체는 클래스 기반으로 생성되어 고유한 상태(필드)와 행위(메서드)를 갖습니다.
객체에 메모리가 할당되어 실제로 활용되는 실체는 인스턴스입니다.

 

 

생성자에 대해 설명해주세요.

생성자는 클래스와 같은 이름의 메서드로, 객체가 생성될 때 호출되는 메서드입니다.

 


🗂️ 래퍼 클래스에 대해 설명해주세요.

기본 자료형에 대한 객체 표현입니다.

 

 

박싱과 언박싱에 대해 설명해주세요.

박싱은 기본 자료형을 래퍼 클래스로 변환하는 것이고, 언박싱은 래퍼 클래스를 기본 자료형으로 변환하는 것입니다.

 


🗂️ Synchronized에 대해 설명해주세요.

여러 개의 스레드가 하나의 자원에 접근하려고 할 때, 현재 자원을 사용하고 있는 스레드를 제외하고 접근을 제한합니다.
Synchronized 사용을 통해 변수와 메서드에 동기화할 수 있지만, 남용하면 성능이 저하될 수 있습니다.

 


🗂️ new String()과 리터럴("")의 차이에 대해 설명해주세요.

new String()은 새로운 객체를 생성하기 때문에 힙 메모리 영역에,
리터럴은 힙 안에 있는 String 상수 풀 영역에 저장됩니다.

 


🗂️ String, StringBuffer, StringBuilder에 대해 설명해주세요.

String은 불변의 속성을 가지고, StringBuffer와 StringBuilder는 가변의 속성을 가집니다.
StringBuffer는 동기화를 지원하여 주로 멀티 스레드 환경에서 사용되고,
StringBuilder는 동기화를 지원하지 않아 주로 싱글 스레드 환경에서 사용됩니다.

 

 

String 객체가 불변인 이유는 무엇일까요?

참조하려는 문자열이 상수 풀에 존재하는 경우, 상수 풀의 객체를 사용하기 때문에 성능 향상을 기대할 수 있습니다.
여러 스레드에서 참조해도 불변 객체이기 때문에 안전하고, 중요한 데이터를 다룰 경우 보안적으로도 안전합니다.

 


🗂️ 접근 제한자에 대해 설명해주세요.

변수 또는 메서드의 접근 범위를 설정해주기 위해 사용하는 자바의 예약어입니다.
public, protected, default, private가 있습니다.

 

✍️ public: 접근 제한이 없다.

✍️ protected: 같은 패키지 또는 상속 받은 자식 클래스에서 접근 가능하다.

✍️ default: 해당 패키지 내에서만 접근 가능하다.

✍️ private: 해당 클래스에서만 접근 가능하다.

 


🗂️ static에 대해 설명해주세요.

모든 객체가 메모리를 공유할 수 있으며, 프로그램 종료 전까지 메모리 값이 유지됩니다.
공통으로 사용되는 데이터들을 관리할 때 사용됩니다.

 


🗂️ 내부 클래스의 장점에 대해 설명해주세요.

관련있는 클래스들을 논리적으로 묶음으로써 캡슐화를 증가시키고 코드의 복잡성을 낮출 수 있습니다. 또한, 외부에서 접근할 수 없기 때문에 코드 보안성도 높일 수 있습니다.

 


🗂️ 리플렉션에 대해 설명해주세요.

구체적인 클래스 타입을 몰라도, 해당 클래스의 메서드, 타입, 변수 등에 접근할 수 있도록 하는 자바 API입니다.
런타임 시점에 실행되는 클래스를 가져와야 하는 경우 사용됩니다.

 


🗂️ Error와 Exception의 차이에 대해 설명해주세요.

에러는 실행 중 일어날 수 있는 치명적인 오류로, 프로그램이 종료됩니다.
예외는 비교적 경미한 오류로, try-catch문을 통해 비정상적인 종료를 막을 수 있습니다.

 

 

CheckedException과 UncheckedException에 대해 설명해주세요.

CheckedException은 실행 전 예측 가능한 예외로, 예외 처리가 반드시 필요합니다.
UncheckedException은 실행 후 알 수 있는 예외로, 따로 예외 처리하지 않아도 됩니다.

 


🗂️ Optional API에 대해 설명해주세요.

NullPointerException 예외의 발생을 막아주고, Optional의 메서드를 통해 null을 컨트롤할 수 있습니다.

 


🗂️ 컬렉션 프레임워크에 대해 설명해주세요.

다수의 데이터를 효과적으로 관리할 수 있는 표준화된 방법을 제공하는 클래스 집합입니다.
List, Set, Map, Stack, Queue 등이 있습니다.

 

✍️ List: 순서를 보장하며, 데이터의 중복을 허용합니다.

✍️ Set: 순서를 보장하지 않으며, 데이터의 중복을 허용하지 않습니다.

✍️ Map: 키와 값이 한 쌍으로 이뤄져있고, 키의 중복을 허용하지 않습니다.

✍️ Stack: 가장 최근에 삽입된 데이터부터 꺼낼 수 있습니다.

✍️ Queue: 가장 먼저 삽입된 데이터부터 꺼낼 수 있습니다.

 


🗂️ 제네릭에 대해 설명해주세요.

클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법입니다.

 

 

사용하는 이유는 무엇인가요?

컴파일 시점에 타입 검사를 통해 예외를 방지할 수 있고, 불필요한 캐스팅을 제거하여 성능이 향상됩니다.

 


🗂️ final, finally, finalize의 차이에 대해 설명해주세요.

final은 클래스, 변수 등을 한 번만 선언하고 싶을 때 사용합니다.
finally는 try-catch와 함께 사용되며, 해당 구문이 종료될 때 마무리 실행 작업을 포함한 코드 블록입니다.
finalize는 GC에 의해 호출되는 소멸자 메서드입니다.

 


🗂️ 직렬화에 대해 설명해주세요.

시스템 내부에서 사용되는 객체 또는 데이터를 외부에서도 사용할 수 있도록 바이트 형태로 변환하는 기술입니다.

 

 

SerialVersionUID가 필요한 이유를 설명해주세요.

JVM은 직렬화와 역직렬화를 하는 시점에 클래스에 대한 버전 번호를 부여합니다.
직렬화와 역직렬화 과정에서 버전 번호가 다르면 실패할 수 있기 때문에 필요합니다.

 


References

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A0%9C%EB%84%A4%EB%A6%ADGenerics-%EA%B0%9C%EB%85%90-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0#%EC%A0%9C%EB%84%A4%EB%A6%AD_%EC%82%AC%EC%9A%A9_%EC%9D%B4%EC%9C%A0%EC%99%80_%EC%9D%B4%EC%A0%90

https://devoong2.tistory.com/entry/Java-%EB%B6%88%EB%B3%80-%EA%B0%9D%EC%B2%B4Immutable-Object-%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

https://blog.itcode.dev/posts/2021/08/15/liskov-subsitution-principle

반응형
LIST