To Dare Is To Do!
자바 면접 스터디(1) 본문
Java의 특징에 대해서 설명해주세요!
Java는
- 제가 생각하는 자바의 주요 특징에는 플랫폼에 대한 독립성, 객체 지향성, 자동 메모리 관리가 있습니다.또한 자바는 객체 지향 언어로 상속, 다형성, 캡슐화, 추상화 같은 객체 지향 개념을 기반으로 동작합니다.
이러한 특성 덕분에 자바는 코드의 재사용성과 유지보수성을 높일 수 있습니다. - 뿐만 아니라 자바는 가비지 컬렉션 기능을 제공하여 개발자가 직접 메모리 관리를 하지 않아도 자동으로 메모리 관리를 하여 메모리 누수나 해제와 같은 문제를 줄일 수 있습니다.
- 자바 코드는 JVM이라는 가상 머신에서 실행되기 때문에 운영체제와 상관 없이 한 번 작성한 코드를 다양한 운영체제에서 실행할 수 있습니다.
Java의 단점은 무엇이 있을까요?
java는 상대적으로 실행속도가 느리고 메모리 사용량이 많은 편입니다.
보통 java는 바이트코드로 컴파일되어 JVM에서 실행되므로, 네이티브 코드에 비해 해석 단계가 추가되는 형태를 가집니다. 때문에 C/C++과 같은 언어에 비해 실행 속도가 느릴 수 있습니다.
또한 가비지 컬렉션과 같은 기능을 수행하기 위해 추가적인 메모리를 필요로 하기 때문에 메모리 사용량을 증가시킬 수 있습니다.
Java 실행 과정에 대해서 설명해주세요!
개발자가 자바 소스코드를 작성하면, 이 코드는 먼저 자바 컴파일러에 의해 .class 확장자를 가진 바이트코드로 변환됩니다.
이 과정에서 자바 컴파일러는 자바의 문법과 규칙을 검토하여 오류를 체크한 후, 최적화된 바이트코드를 생성합니다.
그 다음, JVM의 클래스 로더가 필요한 시점에 이 바이트코드를 메모리의 데이터 영역으로 적재합니다.
클래스 로더는 바이트코드가 클래스에 대한 정보를 적절히 분류하고, 메모리에 적재하는 역할을 수행합니다.
이후 적재된 바이트코드는 JVM의 실행 엔진을 통해 실행됩니다.
이 실행 엔진은 바이트코드를 해석하거나, JIT(Just-In-Time) 컴파일러를 사용하여 바이트코드를 기계어로 변환한 후 실행하게 됩니다.
JIT 컴파일러는 반복적으로 호출되는 메서드를 최적화하여 성능을 향상시키는 데 도움을 줍니다.
마지막으로, JVM은 가비지 컬렉션을 통해 메모리 관리를 수행하여, 더 이상 사용되지 않는 객체를 자동으로 정리합니다. 이러한 일련의 과정을 통해 자바 프로그램이 안전하고 효율적으로 실행됩니다.
https://whitehartlane.tistory.com/23
JVM과 자바의 컴파일 과정
JVM이란?JVM이란 Java Virtual Machine으로 자바 프로그램을 실행하기 위한 가상 머신이다.컴파일된 바이트 코드를 플랫폼(운영체제, CPU 등)이 인식할 수 있도록 기계어로 변환해 준다.이를 통해 자바는
whitehartlane.tistory.com
Java Bytecode에 대해서 설명해주세요!
자바 바이트코드는 자바 컴파일러가 소스 코드(.java 파일)를 컴파일하여 생성하는 중간 코드입니다. 이 코드는 JVM(Java Virtual Machine)이 이해할 수 있는 형태로 변환된 것이며, .class 파일에 저장됩니다. 바이트코드는 플랫폼 독립적이며, 다양한 운영체제에서 동일하게 실행될 수 있습니다. JVM은 바이트코드를 해석하고 실행하며, 바이트코드를 실행하기 전에 검증 과정을 거쳐 보안과 안정성을 보장합니다.
Java의 인터프리터(interpreter) 방식과 JIT 컴파일(compile) 방식에 대해서 설명해주세요.
인터프리터 방식은 소스 코드를 한 줄씩 읽고 즉시 실행하는 방식입니다.
인터프리터 방식은 코드의 즉시 실행이 가능하지만, 매번 코드를 읽고 해석해야 하기 때문에 전체적인 성능에서 떨어지는 경향이 있습니다.
반면, JIT(Just-In-Time) 컴파일 방식은 프로그램 실행 중에 자주 호출되는 바이트 코드를 기계어로 컴파일한 후 메모리에 저장함으로써, 이후 동일한 코드가 호출될 때 더 빠르게 실행할 수 있습니다.
JIT의 장점은 성능이 향상된다는 것이지만, 초기 로딩 시간이 길어질 수 있다는 단점이 있습니다.
처음 실행할 때는 인터프리터 방식처럼 바이트 코드를 해석해야 하기 때문에 시간이 소요됩니다.
따라서, 자바는 인터프리터 방식과 JIT 컴파일러 방식을 혼합하여 최적의 실행 환경을 제공합니다.
사용해본 Java 버전과 특징 그리고 왜 그 버전을 사용했는지 설명해주세요.
저는 자바 17을 사용해왔습니다.
자바 17은 LTS(Long-Term Support) 버전으로, 안정성과 장기적인 지원이 보장되어 있고 Spring Boot 3.0 이상은 자바 17을 기본으로 지원하기 때문입니다.
Java 8, 11, 17 버전에 대해 아는대로 설명해주세요.
Java 8은 람다 표현식, Stream API, 새로운 날짜 및 시간 API를 도입하여 함수형 프로그래밍을 지원합니다.
Java 11은 isBlank(), lines() 등과 같은 String 관련 편의 메서드가 추가되고, 새로운 HttpClient(HTTP/2, WebSocket)가 도입되었으며, 람다 파라미터에서 var 키워드를 사용할 수 있게 되었습니다.
Java 17은 Kotlin의 data class와 유사한 record class와 무분별한 상속을 제한하기 위한 sealed class 기능 등이 추가되었습니다.
JDK와 JRE에 대해서 설명해주세요.
JDK는 Java 애플리케이션을 개발하기 위한 도구 모음입니다. Java 프로그래밍 언어로 소프트웨어를 작성하고 컴파일할 수 있는 모든 도구를 포함합니다.
- 컴파일러 (javac): Java 소스 코드를 바이트코드로 변환하는 역할을 합니다.
- JRE: JDK에는 JRE가 포함되어 있어, 개발한 애플리케이션을 실행할 수 있습니다.
- 디버거: 코드의 오류를 찾고 수정하는 데 도움을 주는 도구입니다.
- API 라이브러리: Java에서 사용할 수 있는 다양한 클래스와 메서드를 포함한 라이브러리입니다.
- 기타 도구: 문서화 도구(javadoc), 패키지 관리 도구(jar) 등이 포함되어 있습니다.
JRE(Java Runtime Environment)
JRE는 Java 애플리케이션을 실행하기 위한 환경입니다. Java 프로그램을 실행하는 데 필요한 모든 구성 요소를 포함하고 있습니다.
- JVM (Java Virtual Machine): Java 바이트코드를 실행하는 핵심 구성 요소로, 플랫폼에 독립적인 실행 환경을 제공합니다.
- Java 클래스 라이브러리: Java API의 표준 라이브러리로, 애플리케이션에서 사용할 수 있는 다양한 클래스와 메서드를 포함합니다.
동일성과 동등성에 대해 설명해 주세요.
동일성: 동일성은 두 객체가 메모리에서 동일한 위치를 참조하고 있는지를 나타냅니다.
즉, 두 객체가 완전히 같은 객체인지 여부를 판단합니다. (== 비교)
동등성 : 동등성은 두 객체의 값이 같은지를 나타냅니다. 즉, 객체의 내용이나 상태가 같은지를 판단합니다. (eqauls() 비교)
=> 두 객체가 할당된 메모리 주소가 같으면 동일하고, 두 객체의 내용이 같으면 동등하다고 말합니다.
https://whitehartlane.tistory.com/43
동일성과 동등성
개요같은 모델의 두 핸드폰을 비교할 때 동등하다 혹은 동일하다는 의미에서 모두 같은 핸드폰이라고 할 수 있을까?동일하다 : 같은 고유 식별값을 가지고 있지 않아 동일하다고 할 수 없음동
whitehartlane.tistory.com
equals()와 ==의 차이점은 무엇일까요?
== 연산자는 객체의 동일성을 판별하기 위해 사용하며, equals 연산자는 두 객체의 동등성을 판별하기 위해 사용합니다.
equals 연산자는 재정의하지 않으면 내부적으로 == 연산자와 같은 로직을 수행하므로 차이가 없습니다.
따라서 equals 연산자는 각 객체의 특성에 맞게 재정의를 해야 동등성의 기능을 수행합니다.
HashCode를 설명하고, equals() 와 hashCode() 의 차이점에 대해 설명해 주세요.
객체의 hashCode는 객체를 식별하는 고유한 정수 값을 나타냅니다.
이는 해시 기반 자료구조에서 객체를 효율적으로 저장하고 검색하기 위해 사용됩니다.이를 기반으로 hashCode() 는 두 객체가 같은 객체인지 확인합니다.
반면, equals() 메서드는 두 객체의 내용을 비교하여 동등성을 판단합니다.
왜 equals() 외에 hashCode() 도 재정의해야 하나요?
hash 기반의 컬렉션은 객체가 논리적으로 같은지 확인하기 위해 두 객체의 해시 코드를 비교하고 나서 내용을 비교합니다. 그런데, 비교하려는 객체의 hashCode() 가 재정의되어 있지 않다면, 객체의 고유한 주소 값을 반환하는 Object.hashCode() 가 적용되기 때문에 두 객체는 다른 객체라고 판단하게 됩니다.
그래서 equals() 외에 equals() 으로 비교할 내용을 기반으로 해시 코드를 다시 만들기 위해 hashCode() 메소드를 재정의해야 합니다.
toString()에 대해서 설명해주세요.
toString() 메서드는 Java에서 객체의 문자열 표현을 반환하는 메서드입니다.
이 메서드는 Object 클래스에 기본적으로 정의되어 있으며, 모든 Java 클래스는 이 메서드를 상속받습니다.
기본적으로 toString() 메서드는 객체의 클래스 이름과 해시 코드를 포함한 문자열을 반환하지만,
일반적으로는 이를 오버라이드하여 객체의 내용을 보다 이해하기 쉬운 형식으로 표현합니다.
자바에서 메인 메서드는 왜 static으로 되어 있을까요?
main 메서드는 프로그램의 시작점으로, 프로그램이 실행되면 가장 먼저 호출되는 메서드입니다. 프로그램이 실행 직후에는 어떠한 객체도 존재하지 않기 때문에 static 키워드를 사용합니다. static 메서드는 객체의 생성 없이 독립적으로 호출될 수 있기 때문에, 프로그램이 시작할 때 어떤 객체도 생성하지 않고 메서드를 실행할 수 있습니다.
상수(Constant)와 리터럴(Literal)에 대해서 설명해주세요.
상수는 변하지 않는 값을 의미하며, final 키워드를 사용하여 선언됩니다.
리터럴은 소스 코드 내에서 고정된 값을 직접 나타내는 표현식입니다.
예를 들어, final int MAX = 10;에서 10은 정수 리터럴이며, MAX는 상수입니다.
Primitive Type과 Reference Type에 대해서 설명해주세요.
자바에서 기본형(Primitive Type)은 실제 값을 저장하는 타입이며,
참조형(Reference Type)은 메모리상의 객체 위치(참조)를 저장합니다.
기본형은 효율적인 접근과 성능을 위해 스택 메모리에 저장되며, 참조형은 힙 메모리에 객체를 저장하고 스택 메모리에는 그 참조를 저장합니다.
기본형에는 int, char, boolean 등이 있고, 참조형에는 String, ArrayList, 사용자 정의 객체 등이 있습니다.
또한, 참조형 변수는 null 값을 가질 수 있는 반면, 기본형 변수는 항상 값을 가져야 합니다.
Java는 Call by Value 일까요? 아님 Call by Reference 일까요?
자바는 Call by Value 방식을 사용합니다.
객체의 참조를 메서드에 전달할 때, 참조의 복사본이 전달됩니다. 따라서 메서드 내에서 참조값을 변경해도 원본 객체에는 영향을 미치지 않습니다. 하지만 참조를 통해 객체의 상태를 변경할 수 있으므로 객체 내용은 변할 수 있습니다.
https://whitehartlane.tistory.com/41
Call by value와 Call by reference
Call by value- 메서드를 호출할 때 넘겨줄 변수(인자)를 지정하면, 메서드의 매개변수가 지정한 변수 값의 복사본으로 초기화되는 것- 복사된 인자는 함수 안에서 지역적으로 사용되는 local value
whitehartlane.tistory.com
Java 직렬화(Serialization)에 대해서 설명해주세요.
자바 Serialization은 객체의 상태를 바이트 스트림으로 변환하여 파일, 네트워크를 통해 전송하거나 저장하는 기술입니다. 이 과정은 객체의 지속성을 확보하고, 분산 환경에서 객체를 쉽게 공유할 수 있게 해줍니다. 객체를 직렬화하기 위해서는 해당 객체의 클래스가 java.io.Serializable 인터페이스를 구현해야 하며, 직렬화 과정은 ObjectOutputStream을 사용하여 수행됩니다. 역직렬화는 ObjectInputStream을 통해 이루어지며, 직렬화 과정에서 transient 키워드로 선언된 필드는 무시됩니다. 직렬화는 객체의 데이터를 안전하게 전송하고 저장하는 데 필수적이지만, 보안 측면에서 주의를 요합니다.
오버로딩과 오버라이딩의 차이는 뭔가요?
오버로딩, 오버라이딩 둘다 다형성을 구현하는데에 사용되는 대표적인 방식입니다.
오버로딩은 같은 이름의 메서드를 파라미터 목록을 달리하여 여러 번 정의할 수 있는 기능입니다. 이는 메서드의 호출 시 다양한 인자 조합에 대응할 수 있도록 합니다.
오버라이딩은 자식 클래스가 부모 클래스에서 상속받은 메서드를 재정의하여 사용함으로써, 자식 클래스에서 메서드의 동작을 수정하거나 확장할 수 있게 합니다.
오버로딩
- 함수 명은 같고, 파라미터 개수, 순서, 타입만 다른 함수를 일컫는다.
- 리턴값이 다른 것은 해당 안됨.
- 같은 기능을 하는 함수를 똑같은 이름으로 만들 수 있음 (print함수, operator 등)
오버라이딩
- 부모의 클래스로부터 상속받은 메서드를 자식이 재정의하는 것을 의미.
- 함수 시그니쳐가 같아야 한다.
- 부모보다 접근 제어자를 좁게 설정 불가능, 예외를 더 많이 선언 불가능
https://whitehartlane.tistory.com/28
오버로딩과 오버라이딩
오버로딩 (Overloading): 같은 이름의 메서드 또는 생성자를 매개변수의 개수나 타입을 다르게 지정함으로써 2개 이상 정의하는 것위와 같은 정의에서 메서드의 오버로딩 성립 조건을 정리해보면 1
whitehartlane.tistory.com
다형성이 무엇이고, 왜 필요할까요?
다형성은 하나의 객체에 여러 가지 타입을 대입할 수 있다는 것을 의미합니다.
다형성을 구현하는 방법으로는 오버로딩, 오버라이딩, 함수형 인터페이스를 사용하는 것이 있습니다.
다형성을 사용하면 코드 재사용성이 증가하고, 새로운 클래스가 추가되더라도 기존 코드를 수정할 필요가 없으므로 코드의 유연성이 높아집니다.
상속은 무엇인가요?
상속은 객체들 간의 관계를 구축하는 것을 말합니다.
이를 통해 다형성을 구현할 수도 있고, 상위 클래스의 메소드나 필드를 하위 클래스가 재사용할 수 있다는 장점이 있습니다.
상속의 단점은 무엇이 있을까요?
하위 클래스는 상위 클래스의 메소드나 필드를 사용할 수 있으므로 하위 클래스는 수동적인 객체가 될 수 있습니다.
또한, 기능 확장을 위해 잘 정의된 상위 클래스의 메소드를 오버라이딩하면 캡슐화를 깨뜨립니다.
상속과 조합의 차이에 대해 설명해 주세요.
상속은 객체들 간의 관계를 구축하여 다형성을 구현합니다.
이와 더불어 상위 클래스의 메소드나 필드를 하위 클래스가 재사용하거나 수정할 수 있습니다.
반면, 조합은 A라는 객체가 B라는 객체를 의존하고 B 객체의 메소드를 사용할 뿐 다형성과는 관계가 없습니다.
상속
부모 클래스의 속성과 메소드를 자식 클래스가 물려받는 것을 의미합니다. 논리적인 계층 구조를 표현할 수 있고, 코드의 재사용성을 높이지만 객체 간의 결합도를 높게 만듭니다.
is-a관계
조합
A라는 객체가 B라는 객체를 의존하는 경우
하나의 클래스가 다른 클래스의 인스턴스를 속성으로 가지는 경우
객체가 다른 객체를 포함하여 기능을 확장하는 방법입니다. 상속보다 유연하고, 객체 간의 결합도를 낮출 수 있습니다.
has-a 관계
instanceof 키워드란 무엇인가요?
특정 클래스의 구체적인 타입을 확인하는 키워드입니다.
이 키워드는 런타임에 객체의 실제 타입을 검사하여 객체가 지정된 클래스나 인터페이스의 인스턴스인지 여부를 boolean 값으로 반환합니다.
instanceof 키워드를 사용할 때 문제점으로 무엇이 있을까요?
로직상 구체적인 객체가 드러나므로, 캡슐화가 저해됩니다.
로직이 바뀔 때마다 instanceof 분기 로직을 수정해야하므로 유지보수성이 떨어집니다.
런타임에 객체의 타입을 확인하므로 성능이 좋지 않습니다.
interface란 무엇일까요?
자바와 같은 객체지향 프로그래밍 언어에서 클래스가 구현해야 하는 메서드의 집합을 정의하는 일종의 추상적 타입입니다. 인터페이스는 클래스가 어떤 기능을 제공해야 하는지를 명세하지만, 실제 구현 내용은 포함하지 않습니다.
interface와 abstract class는 어떤 차이가 있나요?
interface의 경우는 메서드 선언은 할 수 있지만 내용을 작성할 수 없습니다.
abstract class의 경우는 메서드 선언 및 내용 작성을 할 수 있습니다. 작성을 안해도 됩니다.
https://whitehartlane.tistory.com/37
추상클래스와 인터페이스
추상 클래스란?- 객체 명세의 역할을 맡아 실체 클래스의 공통적인 상태을 모아 규격화- 추상 메서드*를 하나 이상 포함한 클래스추상 메서드: 작동 로직 없이 즉 메서드의 선언부만 작성되어 구
whitehartlane.tistory.com
언제 interface 사용하고, 언제 abstract class 사용 하나요?
Interface는
- 다중 상속을 필요로 하거나,
- 행동의 계약을 정의하고 싶을 때,
- 유연한 설계가 필요할 때 사용합니다.
Abstract Class는
- 상태와 기본 구현을 공유하고자 할 때,
- 부분적으로 구현된 클래스가 필요할 때,
- 서로 관련된 클래스들을 그룹화하고 싶을 때 사용합니다.
final 키워드에 대해 설명해 주세요.
final 키워드는 변수, 클래스, 메서드에 적용하여 불변성을 보장하고, 상속이나 오버라이드를 방지하는 데 사용됩니다. 이를 통해 코드의 안전성과 안정성을 높이고, 설계를 더 명확하게 할 수 있습니다.
'Java' 카테고리의 다른 글
자바 면접 스터디(2) (0) | 2024.10.11 |
---|---|
java 면접 질문 공부 (1) | 2024.09.02 |
Stream (0) | 2024.08.07 |
thread pool (3) | 2024.08.06 |
hashcode(), equals() (0) | 2024.08.04 |