-
자바 기술면접 - 1개발 면접/자바 2024. 10. 31. 16:11
JSCODE 자바 기술면접 모의스터디에 참여하면서 정리한 자료입니다.
잘못된 정보가 있다면 언제든지 지적해주시면 감사하겠습니다.
Java의 특징에 대해서 설명해주세요.
- 객체 지향 언어이다.
- 객체: 실생활에서 사용되는 것들을 객체라고 볼 수 있다. 객체는 ‘상태’와 ‘행위’로 나타낸다.
- 추상화: 여러 객체들의 공통적인 특성을 추출하는 행위를 의미한다.
- 상속: 기존 클래스를 확장하여 새로운 상위 클래스를 만드는 것을 의미한다.
- 캡슐화: 내부의 ‘상태’와 ‘행위’를 외부로부터 감추고, 외부에는 필요한 ‘행위’만 노출시키는 것을 의미한다.
- 다형성: 하나의 타입이 상황에 따라서 다양한 타입으로 변할 수 있는 것을 의미한다.
- JVM위에서 동작하기 때문에 OS로부터 독립적이다.
- JVM: 자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환(인터프린터, JIT 컴파일러)하여 실행
- 자동으로 메모리를 관리해준다.
- GC가 더 이상 참조하지 않은 객체를 관리하는 것을 의미한다.
- 자바의 GC는 기본적으로 Mark And Sweep 방식으로 동작함
- 하지만, STW(Stop-The-World) 최적화 이슈가 항상 존재
- STW란?
- GC를 실행시키기 위해 현재 실행중인 애플리케이션을 중단하는 것을 의미함
- 인터프리터 방식과 컴파일 방식을 동시에 지원한다.
- 기본적으로 인터프리터 방식으로 동작
- 하지만, 반복적인 코드가 지속적으로 나오는 경우 컴파일 방식으로 동작
Java의 단점에 대해서 설명해주세요.
- JVM을 거쳐서 실행되기 때문에 타 언어에 비해서 느리다 (하지만, 체감할 정도는 아니라고 봄)
- GC로 인해 메모리 소비량이 크다?
Java 실행 과정에 대해서 설명해주세요.
- 자바 코드를 작성한 후 자바 컴파일러에 의해 자바 바이트 코드를 생성
- 클래스 로더가 바이트 코드를 읽어 JVM에 로딩
- JVM에 로딩된 바이트 코드들은 실행엔진에 의해 해석된다
- 해석된 코드들은 Runtime Data Area에 배치되어 실행된다.
Java Bytecode에 대해서 설명해주세요.
- 자바의 핵심인 “Write Once, run everywhere” 를 의미하며
- JVM이 해석할 수 있는 언어이다.
Java의 인터프리터(interpreter) 방식과 JIT 컴파일(compile) 방식에 대해서 설명해주세요.
- 인터프리터: 바이트코드를 한줄씩 읽어서 네이티브 기계어로 변환하는 방식
- JIT 컴파일러: 인터프리터로 읽은 기계어 중, 반복적으로 사용되는 바이트코드 시퀀스를 한번에 네이티브 기계어로 컴파일하고, 동일한 코드가 있다면 재사용할 수 있는 방식
사용해본 Java 버전과 특징 그리고 왜 그 버전을 사용했는지 설명해주세요.
- Java 8 버전
- Stream API
- Java 17 버전
- Record 클래스
- Spring Boot 3.0 버전부터 Java 17버전을 지원하기때문에 사용
Java 8, 11, 17 버전에 대해 아는대로 설명해주세요.
- 먼저 8, 11, 17 이 3가지 버전은 자바에서 LTS 버전으로 출시되었다.
- 자바 8
- 람다 표현식을 제공 → 함수형 프로그래밍 가능
- Stream API 제공
- 인터페이스 기능 추가 → default 메소드 추가
- Optional API 제공 → null을 위한 Wrapper 클래스
- 자바 11
- 자바 표준 HttpClient API 추가 → 기존에는 아파치 외부 라이브러리를 사용했음
- 람다 표현식에 매개변수로 var 키워드를 사용할 수 있다.
- new Garbage Collector (ZGC) 추가
- 자바 17
- Record 클래스 추가
- 텍스트 블록 기능 추가
- 봉인 클래스 추가
- Stream.toList() 기능 추가
- 기존, Stream을 List로 변환 시 Collectors에서 기능을 찾아서 사용했지만, 17부터 Collectors을 사용하지 않고 바로 toList() 사용
JDK와 JRE에 대해서 설명해주세요.
- JRE는 JVM를 포함하여 자바 애플리케이션을 실행할 수 있도록 구성된 최소한의 배포 단위이다.
- 단, 개발 도구를 포함하지 않는다.
- JDK는 JRE와 개발에 필요한 도구들을 제공해주는 것을 의미한다.
동일성과 동등성에 대해 설명해 주세요.
- 동일성: 주소가 같냐
- 동등성: 값이 같냐
equals()와 ==의 차이점은 무엇일까요?
- equals는 두 객체의 상태나 값이 같은지 비교
- ==는 두 객체의 참조가 동일한지 비교
HashCode를 설명하고, equals() 와 hashCode() 의 차이점에 대해 설명해 주세요.
- HashCode
- 객체를 식별하는 하나의 정수값
- Object 클래스에 hashCode() 메소드를 통해 해시코드를 반환받는다.
- eqauls()와 hashCode()의 차이점
- equals(): 두 객체의 상태나 값이 같은지를 비교
- hashCode(): 두 객체가 같은 객체인지 식별하는 정수값을 반환
왜 equals() 외에 hashCode() 도 재정의해야 하나요?
- equals 메소드를 오버라이딩 하는 경우는 참조타입에서 ‘값이 같은가’를 물어보기 위해 사용합니다. 그리고 hashCode가 자동으로 오버라이딩되는 이유는 원래 hashCode는 객체의 주소 값을 해시코드로 가지기 때문에 서로 다른 두 객체는 같은 해시 코드를 가질 수 없지만, 논리적으로 두 객체를 같음을 나타내기 위해 사용한다.
toString()에 대해서 설명해주세요.
- 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 메소드
자바에서 메인 메서드는 왜 static으로 되어 있을까요?
- 프로그램이 실행된 직후에는 어떠한 객체도 존재하지 않는다. 즉, main 메소드에 static 키워드를 사용하지 않으면 런타임 시점에 실행할 객체가 없다.
- 결과적으로 static을 사용하여 객체 생성없이 메모리에 할당해야한다.
상수(Constant)와 리터럴(Literal)에 대해서 설명해주세요.
- 상수: 모든 곳에서 하나의 값을 일관되게 사용하는 값이다.
- 자바에서는 이를 static final 키워드를 사용하여
- 리터럴: 변수에 대입되는 값 자체를 의미한다.
Primitive Type과 Reference Type에 대해서 설명해주세요.
- Primitive Type
- 실제 값을 저장하는 자료형이다.
- Stack 영역에 저장된다.
- null을 가지지않고, 기본값이 있다.
- Reference Type
- 객체의 주소를 저장하는 자료형이다.
- Heap 영역에 저장된다.
- null을 가질 수 있고 기본값이 null이다.
Java는 Call by Value 일까요? 아님 Call by Reference 일까요?
- 자바는 Call By Value
- 기본형, 참조형 둘 다 값,주소값이 복사되기 때문이다.
- 실제 프로그램이 동작할 때, stack 영역에서 이루어지기 때문이다.
Java 직렬화(Serialization)에 대해서 설명해주세요.
- 객체를 네트워크 통신에 사용하거나, 데이터베이스에 저장할 수 있도록 바이트 형태로 변환하는 것을 직렬화라고 부르고, 바이트 형태로 되어 있는 것을 다시 객체로 변환하는 것을 역직렬화라고 한다.
오버로딩과 오버라이딩의 차이는 뭔가요?
- 오버로딩 - 같은 이름의 메소드를 여러개 정의
- 같은 기능을 하는 메소드를 다양한 형태로 호출하기 위해서
- 오버라이딩 - 상속받은 클래스에 메소드를 재정의하는 것
- 상위 클래스에서 정의한 메소드를 하위 클래스에서 재정의하여 자신에게 맞게 변경
다형성이 무엇이고, 왜 필요할까요?
- 하나의 객체가 상황에 따라서 다양항 형태로 지닐 수 있는 성질을 의미한다.
- 이는 유지보수 향상을 위해 필요한 성질이다.
- 먼저, ‘무엇을 해야 하는가’를 의미하는 역할을 인터페이스 혹은 추상클래스로 정의한다.
- 이를 ‘어떻게 할 것인가?’를 의미하는 구현체 클래스는 이를 상속받아 구현한다.
- 이렇게 된다면, 이를 사용하는 측(클라이언트)에서는 구체 클래스를 의존하지 않고 역할에 의존하기 때문에 새로운 기능이 추가되더라도 클라이언트에게는 아무런 영향을 미치지 않는다.
- 이러한 성질로 인해, 자연스럽게 클라이언트 입장에서는 구현체에 대해 ‘캡슐화’가 이루어진다.
상속은 무엇인가요?
- 상위 클래스에 선언된 변수와 메소드를 그대로 하위 클래스에서 물려받는 것
상속의 단점은 무엇이 있을까요?
- 상속관계 있는 클래스끼리 강한 결합이 발생한다.
- 즉, 상위 클래스에 변경사항이 발생한 경우 하위 클래스에 영향을 줄 수 있다.
상속과 조합의 차이에 대해 설명해 주세요.
- 객체간의 결합도
- 상속: 계층 구조로 객체간의 관계를 나타내기 때문에 강한 결합이다.
- 조합: 객체가 다른 객체를 포함시키는 관계를 가지기 때문에 약한 결합이다.
instanceof 키워드란 무엇인가요?
- 객체의 타입을 확인할 때 사용한다.
instanceof 키워드를 사용할 때 문제점으로 무엇이 있을까요?
- 인스턴스 오브를 사용하게 되면 구체적인 타입을 명시적으로 드러내기 때문에 추상화와 캡슐화가 깨진다.
interface란 무엇일까요?
- 객체의 행위를 정의하는 타입
- 구현 클래스에서 반드시 구현해야 할 메소드를 명시
interface와 abstract class는 어떤 차이가 있나요?
- 상속
- interface: 다중 상속 가능
- abstract class: 단일 상속
- 관계
- interface: 서로 관계가 없는 객체들이 공통 동작을 해야할 때
- 행위로 묶을 수 있다
- abstract class: 관련된 객체들의 공통 기능을 구현할 때
- 인터페이스와 마찬가지로 행위로 묶을 순 있지만, 가장 큰 차이는 ‘확장성’이다.
- interface: 서로 관계가 없는 객체들이 공통 동작을 해야할 때
언제 interface 사용하고, 언제 abstract class 사용 하나요?
- interface
- 완전히 다른 클래스들이 공통된 동작을 가져야 할 때
- 다중 상속이 필요할때
- 반드시 구현해야하는 메소드를 정의할 때
- abstract class
- 관련된 클래스들끼리 공통된 기능을 공유할 때
- 상속받는 클래스에서 공통된 속성(필드)이 필요할 때
- 일부 구현 로직은 제공하면서, 추상화가 필요로 할 때
final 키워드에 대해 설명해 주세요.
- 선언된 대상의 변경을 금지한다
- 변수에 선언되는 경우 상수로 사용된다.
- 메소드에 선언되는 경우 오버라이딩을 금지한다.
- 클래스에 선언하는 경우 상속을 오버라이딩한다.
- 메소드 파라미터에 선언되는 경우 메소드 내부에서 값을 변경할 수 없다.
'개발 면접 > 자바' 카테고리의 다른 글
자바 기술면접 - 2 (2) 2024.11.07 - 객체 지향 언어이다.