-
자바와 객체지향 관련 질문긴급 면접 준비 2023. 9. 20. 15:51
자바 관련 질문
Java 자바 데이터 타입 중 기본형과 참조형의 차이에 대해 설명해주세요.
- 기본형은 데이터 자체를 변수 안에 저장하고 참조형은 데이터의 주소가 저장됩니다. 기본형 같은 경우에는 스택 메모리 영역에 저장되고 참조형의 데이터 객체는 힙 메모리 영역에 저장되게 됩니다.
객체지향 추상 클래스와 인터페이스의 차이는 무엇인가요? - 둘 다 객체 생성은 불가능, 확장을 위한 것임
- 추상 클래스의 경우 추상 메서드와 일반 메서드 모두를 포함할 수 있지만 인터페이스는 추상 메서드만 포함한다는 차이가 있습니다. 이에 따라 추상 클래스는 하위 클래스가 상위 클래스의 메서드를 재사용하거나 확장하는 경우에 사용을 하고 인터페이스의 경우에는 하위 클래스가 모든 추상 메서드를 구현해야하기 때문에 특정 동작을 정의하는데 사용합니다. 또한 추상 클래스는 다중 상속이 되지 않지만 인터페이스의 경우 다중 구현이 된다는 점이 있어서 상황에 맞게 둘을 사용해야 합니다.
JVM이란 무엇인가요?
- 자바 애플리케이션을 실행시키기 위한 가상 환경을 제공해주는 소프트웨어로 자바 가상 머신은 컴파일러에 의해 컴파일된 바이트 코드를 각 운영체제에 맞게 기계어로 번역하여 실행하는 역할을 하고 따라서 jvm이 설치된 모든 운영체제에서 실행될 수 있습니다. 사용되지 않는 객체를 제거하는 가비지 컬렉터 역할을 하고 다중 스레드를 지원하는 등의 기능을 합니다.
jre와 jdk에 대해서 설명해주세요
- jre는 자바 애플리케이션을 실행하는데 필요한 최소한의 구성 요소를 포함하는 환경으로 jvm, 표준 라이브러리를 포함합니다. jdk는 자바 언어로 소프트웨어를 개발하는데 필요한 도구를 의미하고 jre와 함께 컴파일러, 디버거, 빌드 도구 등을 포함합니다.
자바로 만든 응용 프로그램이 돌아가는 전체 과정에 대해서 설명해주세요
- 컴파일 -> 클래스 로딩 -> JVM의 바이트 코드 해석 -> 진입점 찾고 실행 -> 예외 처리 -> 종료
자바의 스레드 개념에 대해서 설명해주세요
- 스레드란 하나의 프로세스 안에서 실행되는 실행 단위를 의미하고 자바는 멀티 스레드를 지원합니다.
동기화란 무엇인가요?
- 여러 스레드가 동시에 공유 데이터에 접근할 때 한 번에 하나의 스레드만 데이터에 접근하게 하는 방법으로 데이터의 일관성을 유지할 수 있게 합니다.
자바 메모리 구조에 대해서 간단하게 설명해주세요
- 자바 메모리 구조는 크게 힙, 스택, 메서드 영역으로 나눌 수 있고 힙 영역에는 동적으로 할당되는 객체 인스턴스가 저장되고 스택 영역에는 메서드 호출 스택이나 로컬 변수가 저장되며 메서드 영역에는 클래스, 메서드, 스태틱 변수 및 상수 등이 저장됩니다.
자바 메모리에서 힙과 스택의 차이는 무엇인가요?
- 힙은 가비지 컬렉션에 의해 관리가 되고 모든 스레드에서 공유되지만 스택의 경우 스레드마다 독립적으로 가지고 있다는 차이점이 있습니다.
가비지 컬렉터가 무엇이고 왜 필요한가요?
- 더 이상 사용되지 않는 객체를 자동으로 제거하는 기술로 메모리 누수와 메모리 부족 문제를 방지하기 위해 필요합니다. gc를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업을 중단한 후 gc작업을 진행한다는 특징이 있습니다.
자바에서 예외와 오류의 차이는 무엇인가요?
- 예외는 프로그램 코드 상으로 처리할 수 있는 상황이지만 오류는 프로그램 내에서 처리할 수 없는 심각한 상황을 의미합니다. 예외에는 크게 컴파일러가 예외 처리 코드가 필요한지 검사하는 체크 예외와 검사하지 않는 언체크예외(런타임예외)로 나눌 수 있습니다. 예외를 처리하는 방법은 try-catch문을 사용하는 방법과 throws 키워드를 사용하는 방법이 있습니다.
자바의 컬렉션 프레임워크에 대해서 설명해주세요
- 자바에서 데이터를 효율적으로 저장하고 관리할 수 있게 미리 구현해놓은 라이브러리를 의미합니다. 대표적으로 List, Map, Set 등의 인터페이스가 있고 각각은 중복 가능 여부, 순서 유무 여부, 키-값 형태 등의 차이가 있습니다.
자바에서 멀티스레드 프로그래밍을 어떻게 구현하나요?
- Thread 클래스를 확장하거나 Runnable 인터페이스를 구현하여 멀티스레드 프로그래밍을 구현할 수 있습니다.
자바에서 익명클래스(익명객체)는 무엇이고 왜 사용하는건가요?
- 추상 클래스나 인터페이스의 하위 클래스를 생성과 동시에 사용하는 방법으로 객체를 한 번만 사용하고 다시 참조할 필요가 없을 때 유용하게 사용할 수 있습니다. 다만 자바 8 이후에는 람다 표현식을 사용하여 함수형 인터페이스의 인스턴스를 생성할 수 있기 때문에 코드의 가독성을 높이기 위해서 람다식을 사용하는 것이 좋습니다.
자바에서 제공하는 원시 타입의 종류와 각각 몇 바이트를 차지하는지 말해보세요
- 정수형 byte 1, short 2, int 4, long 8, 실수형 float 4, double 8, 문자형 char 2, 논리형 boolean 1바이트 입니다.
오버라이딩과 오버로딩의 차이에 대해서 설명해주세요
- 오버라이딩이란 상위 클래스의 메서드를 하위 클래스에서 재정의하는 것을 말하고, 오버로딩이란 같은 이름의 메서드를 매개변수의 타입과 개수를 다르게 하여 여러 개 정의하는 것을 말합니다.
자바에서 불변 객체란 무엇이고 이를 통해 얻는 이점은 무엇이 있을까요?
- final 키워드를 통해 불변 객체를 만들 수 있고 해당 변수에 재할당이 불가능하다는 특징이 있습니다. 이에 따라 의존관계 주입에서 싱글톤으로 객체를 관리할 수 있고 멀티 스레드 환경에서 안전하게 객체를 사용할 수 있다는 장점이 있습니다.
클래스, 객체, 인스턴스의 각각 차이점에 대해서 설명해주세요
- 클래스는 객체를 만들어내기 위한 틀, 설계도 라고 할 수 있고 객체는 클래스를 기반으로 생성되며 인스턴스는 이 객체가 실제 메모리 상에 올라간 상태를 강조하는 의미를 가지고 있습니다.
생성자에 대해서 설명해주세요
- 객체를 생성할 때 호출되는 리턴타입이 없는 특별한 메서드로 객체 생성 시에 필드를 초기화 하는 작업을 진행합니다. 명시적으로 생성자를 만들지 않으면 파라미터로 아무것도 없는 기본 생성자가 생성됩니다.
new String()과 리터럴("")의 차이에 대해서 설명해주세요
- 리터럴의 경우 Heap 안에 있는 String Constant Pool 영역에 저장되기 때문에 ==(등호) 비교 연산자로 비교하는 경우 true가 나오지만 new 로 생성할 경우 두 객체의 참조가 다르기 때문에 false가 나오게 됩니다.
String, StringBuffer, StringBuilder 의 차이에 대해서 설명해주세요
- 스트링은 다른 버퍼와 빌더와 다르게 불변 객체이기 때문에 문자열 연산이 적은 경우에 적합하며 버퍼의 경우 멀티쓰레드 환경에서 안전하기 때문에 멀티쓰레드 환경의 경우에 버퍼를 사용하는 것이 좋다.
String 객체는 왜 불변으로 만들었을까요?
- 캐싱 기능에 의해 메모리 절약과 속도가 향상되며 스레드-세이프하며 중요한 데이터를 문자열로 다루는 경우 값을 바꾸는 것이 불가능하기 때문에 보안에도 유리하다는 장점이 있습니다.
접근 제어자에 대해 설명해주세요
- 변수 또는 메서드의 접근 범위를 설정해주기 위해 사용하는 자바 예약어로 private, default(같은 패키지), protected, public 이 있습니다.
static에 대해 설명
- static 키워드를 사용한 변수나 메서드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 따라서 인스턴스 생성 없이 바로 사용할 수 있습니다. 모든 객체가 메모리를 공유한다는 특징이 있습니다. 따라서 공통된 데이터나 인스턴스 변수를 사용하지 않는 메서드는 static으로 선언할 수 있습니다. 하지만 프로그램이 종료될때까지 메모리에 있기 때문에 남발하게 되면 성능에 악영향을 미칠수 있습니다.
내부 클래스의 장점에 대해서 설명
- 서로 관련있는 클래스를 논리적으로 묶어서 표현함으로써 캡슐화를 증가시키고, 코드의 복잡성을 낮출 수 있다는 장점이 있습니다. 외부에서는 내부 클래스에 접근할 수 없기 때문에 보안적인 측면에서도 긍정적인 효과가 있습니다.
Optional API에 대해서 설명해주세요
- NPE를 피하기 위해 null 검사를 해주어야하는데 이때 유용한 기능들을 제공해주고 코드를 더욱 간결하게 작성할 수 있게 도와주는 라이브러리입니다.
자바의 리스트와 배열의 차이에 대해서 설명해주세요
- 크기의 가변성, 원시타입 저장 여부
제네릭이 무엇이고 왜 사용하는지 설명해주세요
- 데이터 타입을 특정하지 않고 범용적으로 지정할 수 있게 하는 자바 문법입니다. 타입을 지정하지 않고 클래스를 만들 수 있기 때문에 타입만 다르고 로직은 같은 코드를 쉽게 구현할 수 있게 됩니다. 또한 extends 키워드를 사용하여 타입을 제한할 수 있습니다. 특징으로는 static 멤버에는 사용이 불가능하며 제네릭 타입의 배열을 생성하는 것이 불가능합니다.(new 연산자를 사용하면 컴파일 시점에 타입이 명확해야 하기 때문)
직렬화에 대해 설명해주세요
- 자바 객체를 바이트 형태로 변환하는 과정으로 외부로 데이터를 전송하기 위한 과정입니다.
자바 스트림 api가 무엇이고 어떠한 장점이 있는가?
- 컬렉션이나 배열 등에 저장된 요소들을 하나씩 참조하면서 연산을 진행할 수 있는 기능입니다. 불필요한 for문을 사용하지 않고 람다식을 활용하여 코드를 직관적으로 작성할 수 있다는 장점이 있습니다. Stream API는 스트림 생성, 중간연산, 최종연산으로 구성되어 있고 특징으로는 기존 데이터를 변경하지 않고 재사용할 수 없다는 특징이 있습니다.
객체지향 관련 질문
oop란 무엇인가요?
- 실생활에 존재하는 모든 것인 객체들의 상호작용으로 프로그램을 구현하는 방식을 객체지향 프로그래밍이라고 합니다.
oop의 특징에 대해서 설명해주세요
- 캡슐화, 상속, 추상화, 다형성 등이 있는데 캡슐화란 내부의 복잡한 구현은 숨기고 외부 사용에 필요한 기능만을 공개하는 것을 의미하고 상속이란 상위 클래스의 속성과 기능을 하위 클래스가 상속 받아 재사용하고 확장할 수 있는 기능을 의미하고 추상화란 객체의 주요 특징을 추출하는 과정을 의미하며 다형성이란 상속 관계에서 상위 타입의 변수가 하위 타입의 인스턴스를 참조할 수 있는 기능을 의미합니다. 이러한 oop의 특징을 잘 이용하면 유지보수가 용이한 프로그래밍을 할 수 있습니다.
opp의 장점은 무엇인가요?
- 여러 객체 지향의 특징인 추상화, 상속, 다형성, 캡슐화 등을 적절하게 사용한다면 변화와 확장에 유연한 코드를 작성할 수 있습니다. 예를 들어, 상속과 추상화 개념을 이용하여 코드의 재사용성을 높이고 중복을 방지하는 이점을 가져올 수 있습니다.
객체지향 설계원칙인 solid에 대해서 설명해주세요
- 단일 책임 원칙: 하나의 클래스는 하나의 책임만을 가져야 한다.
- 개방-폐쇄 원칙: 확장에는 열려있고, 수정에는 닫혀있어야 한다.(기존의 코드는 변경하지 않으면서 기능을 추가)
- 리스코프 치환 원칙: 하위 타입은 항상 상위 타입을 대체할 수 있어야 한다.
- 인터페이스 분리 원칙: 인터페이스 내에 메서드는 최소한 일수록 좋다.(단일 책임 원칙과 관련이 있음)
- 의존관계 역전 원칙: 구체적인 클래스보다 추상적인 인터페이스나 추상클래스에 의존해야 한다.(느슨한 결합 유지해야함, 구현보다는 역할에 의존해야한다!)
참고 자료
https://dev-coco.tistory.com/153
신입 개발자 기술면접 질문 정리 - 자바
💡 Java의 특징을 설명해주세요. Java는 객체지향 프로그래밍 언어입니다. 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언
dev-coco.tistory.com
'긴급 면접 준비' 카테고리의 다른 글
리눅스 관련 질문 (0) 2023.09.23 자료구조 및 알고리즘 관련 질문 (0) 2023.09.23 네트워크 관련 질문 (2) 2023.09.21 운영체제 관련 질문 (0) 2023.09.20 백엔드 종합 (0) 2023.09.18