250x250
Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- BFS
- Java
- CSS
- 스프링부트
- JPA
- 리소스모니터링
- alter
- sql
- math
- html
- NIO
- 큐
- string
- spring boot
- map
- GC로그수집
- date
- 스택
- Properties
- 힙덤프
- scanner
- dfs
- priority_queue
- deque
- List
- javascript
- set
- union_find
- Calendar
- Union-find
Archives
- Today
- Total
매일 조금씩
Java 개념 정리 (1) - Java 기본, 객체 지향 본문
728x90
반응형
Java 기본
- Java의 특징에 대해서 설명해주세요.
- Java는 플랫폼 독립적이고, 객체 지향적이며, 안정성이 높은 언어입니다. 이는 Java가 JVM(Java Virtual Machine) 위에서 실행되기 때문에 다양한 운영 체제에서 동일한 코드로 작동할 수 있으며, 객체 지향 프로그래밍 원칙을 완벽하게 지원하여 코드의 재사용성과 유지 보수성을 높입니다. 또한, 자동 메모리 관리와 예외 처리 기능으로 프로그램의 안정성을 강화합니다.
- Java의 단점에 대해서 설명해주세요.
- Java는 실행 속도가 상대적으로 느리고, 메모리 사용량이 많은 편입니다. 이는 Java가 JVM 위에서 실행되며, 런타임 중에 바이트 코드에서 기계어로 번역이 되고, 가비지 컬렉션과 같은 메모리 관리 기법을 사용하기 때문입니다. 또한, 다른 언어에 비해 작성해야 하는 코드의 길이가 긴 편입니다.
- Java 실행 과정에 대해서 설명해주세요.
- 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당 받습니다.
- .java 파일이 자바 컴파일러에 의해 자바 바이트 코드(.class 파일)로 변환됩니다.
- 클래스 로더를 통해 자바 바이트 코드를 JVM으로 필요한 시점에 로딩합니다.
- 해석된 바이트 코드는 런타임 데이터 영역에 배치되고, 실행 엔진에 의해 실질적인 수행이 이루어지게 됩니다.
- 실행 과정 속에서 JVM은 필요에 따라 GC와 같은 관리 작업을 수행합니다.
- Java Bytecode에 대해서 설명해주세요.
- Java 바이트 코드는 Java 소스 코드를 컴파일한 후 생성되는 중간 형태의 코드입니다. 이 바이트 코드는 JVM에서 해석되어 실행될 수 있으며, 플랫폼 독립적인 Java의 실행을 가능하게 합니다. 바이트 코드는 Java가 "Write Once, Run Anywhere" 원칙을 실현하는 핵심 요소 중 하나입니다.
- Java의 인터프리터(interpreter) 방식과 JIT 컴파일(compile) 방식에 대해서 설명해주세요.
- 인터프리터 방식은 소스 코드를 한 줄씩 읽고 실행하는 방식이며, JIT(Just-In-Time) 컴파일 방식은 프로그램 실행 중에 자주 쓰이는 바이트 코드를 기계어로 컴파일하여 실행 속도를 향상시킵니다. 인터프리터 방식은 플랫폼 독립성을 제공하지만 실행 속도가 느리다는 단점이 있는데, JIT 컴파일러는 자주 쓰이는 바이트 코드 컴파일을 통해 인터프리터의 단점을 보완합니다.
- 사용해본 Java 버전과 특징 그리고 왜 그 버전을 사용했는지 설명해주세요.
- 저는 주로 Java 8을 사용해왔습니다. Java 8은 람다 표현식, 스트림 API, 새로운 날짜/시간 API 등 현대적인 프로그래밍 기능을 도입했기 때문에 코드를 더 간결하고 효율적으로 작성할 수 있었습니다. 특히, 람다 표현식은 컬렉션을 처리할 때의 코드 가독성과 작성 편의성을 크게 향상시켜 주었습니다.
- Java 8, 11, 17 버전에 대해 아는대로 설명해주세요.
- Java 8: 람다 표현식, 스트림 API, 새로운 날짜/시간 API를 도입하여 함수형 프로그래밍 지원을 강화했습니다.
- Java 11: String 관련 편의 메서드(isBlank(), lines() 등)이 추가되고, 새로운 HttpClient(HTTP/2, WebSocket 지원 등)가 도입되고, 람다 파라미터에서 var 키워드를 이용할 수 있게 되었습니다.
- Java 17: kotlin의 data class와 유사한 record class와 무분별한 상속을 제한하기 위한 sealed class 기능 등이 있습니다.
- JDK와 JRE에 대해서 설명해주세요.
- JDK(Java Development Kit)는 Java 애플리케이션을 개발하기 위해 필요한 도구들(컴파일러, 라이브러리, 실행 환경 등)을 포함합니다. JRE(Java Runtime Environment)는 Java 애플리케이션을 실행하기 위한 환경으로, JVM과 Java 클래스 라이브러리를 포함합니다. 간단히 말해, JDK는 개발자를 위한 것이고 JRE는 실행만을 위한 것입니다.
- 동일성과 동등성에 대해 설명해 주세요.
- 두 객체가 할당된 메모리 주소가 같으면 동일하고, 두 객체의 내용이 같으면 동등하다고 말합니다.
- equals()와 ==의 차이점은 무엇일까요?
- == 연산자는 객체의 동일성을 판별하기 위해 사용하며, equals 연산자는 두 객체의 동등성을 판별하기 위해 사용합니다.
- equals 연산자는 재정의하지 않으면 내부적으로 == 연산자와 같은 로직을 수행하므로 차이가 없습니다. 따라서 equals 연산자는 각 객체의 특성에 맞게 재정의를 해야 동등성의 기능을 수행합니다.
- HashCode를 설명하고, equals() 와 hashCode() 의 차이점에 대해 설명해 주세요.
- 객체 HashCode란 객체를 식별하는 하나의 정수 값을 말합니다. equals() 는 객체의 내용을 비교하고, hashCode() 는 두 객체가 같은 객체인지 확인합니다.
- 왜 equals() 외에 hashCode() 도 재정의해야 하나요?
- hash 기반의 컬렉션은 객체가 논리적으로 같은지 확인하기 위해 두 객체의 해시 코드를 비교하고 나서 내용을 비교합니다. 그런데, 비교하려는 객체의 hashCode() 가 재정의되어 있지 않다면, 객체의 고유한 주소 값을 반환하는 Object.hashCode() 가 적용되기 때문에 두 객체는 다른 객체라고 판단하게 됩니다.
- 그래서 equals() 외에 equals() 으로 비교할 내용을 기반으로 해시 코드를 다시 만들기 위해 hashCode() 메소드를 재정의해야 합니다.
- toString()에 대해서 설명해주세요.
- toString() 메서드는 객체를 문자열로 표현하는 데 사용됩니다. 기본적으로 클래스 이름과 해시 코드를 반환하지만, 의미 있는 정보를 제공하도록 오버라이드할 수 있습니다. 일반적으로 객체의 상태를 표현하는 등 로깅하기 편한 형식으로 오버라이드하는 편입니다.
- 자바에서 메인 메서드는 왜 static으로 되어 있을까요?
- 메인 메서드는 프로그램 실행의 진입점이며, 객체의 생성 없이도 호출될 수 있어야 합니다. static으로 선언함으로써, 자바 런타임은 어떠한 객체의 인스턴스도 생성하지 않고 메인 메서드를 호출할 수 있습니다. 이는 프로그램 실행의 시작점에서 필요한 특성입니다.
- 상수(Constant)와 리터럴(Literal)에 대해서 설명해주세요.
- 상수는 변하지 않는 값을 의미하며, final 키워드를 사용하여 선언됩니다. 리터럴은 소스 코드 내에서 고정된 값을 직접 나타내는 표현식입니다. 예를 들어, final int MAX = 10;에서 10은 정수 리터럴이며, MAX는 상수입니다.
- Primitive Type과 Reference Type에 대해서 설명해주세요.
- 자바에서 기본형(Primitive Type)은 실제 값을 저장하는 타입이며, 참조형(Reference Type)은 메모리상의 객체 위치(참조)를 저장합니다. 기본형은 효율적인 접근과 성능을 위해 스택 메모리에 저장되며, 참조형은 힙 메모리에 객체를 저장하고 스택 메모리에는 그 참조를 저장합니다.
- Java는 Call by Value 일까요? 아님 Call by Reference 일까요?
- 자바는 Call by Value 방식을 사용합니다. 객체의 참조를 메서드에 전달할 때, 참조의 복사본이 전달됩니다. 따라서 메서드 내에서 참조값을 변경해도 원본 객체에는 영향을 미치지 않습니다. 하지만 참조를 통해 객체의 상태를 변경할 수 있으므로 객체 내용은 변할 수 있습니다.
- Java 직렬화(Serialization)에 대해서 설명해주세요.
- 자바 Serialization은 객체의 상태를 바이트 스트림으로 변환하여 파일, 네트워크를 통해 전송하거나 저장하는 기술입니다. 이 과정은 객체의 지속성을 확보하고, 분산 환경에서 객체를 쉽게 공유할 수 있게 해줍니다. 객체를 직렬화하기 위해서는 해당 객체의 클래스가 java.io.Serializable 인터페이스를 구현해야 하며, 직렬화 과정은 **ObjectOutputStream**을 사용하여 수행됩니다. 역직렬화는 **ObjectInputStream**을 통해 이루어지며, 직렬화 과정에서 transient 키워드로 선언된 필드는 무시됩니다. 직렬화는 객체의 데이터를 안전하게 전송하고 저장하는 데 필수적이지만, 보안 측면에서 주의를 요합니다.
Java 객체 지향
- 오버로딩과 오버라이딩의 차이는 뭔가요?
- 오버로딩은 같은 이름의 메서드를 여러 개 정의하는 기법이고, 오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 기법입니다.
- 다형성이 무엇이고, 왜 필요할까요?
- 다형성은 하나의 객체에 여러 가지 타입을 대입할 수 있다는 것을 의미합니다. 다형성을 구현하는 방법으로는 오버로딩, 오버라이딩, 함수형 인터페이스를 사용하는 것이 있습니다. 다형성을 사용하면 코드 재사용성이 증가하고, 새로운 클래스가 추가되더라도 기존 코드를 수정할 필요가 없으므로 코드의 유연성이 높아집니다.
- 상속은 무엇인가요?
- 상속은 객체들 간의 관계를 구축하는 것을 말합니다. 이를 통해 다형성을 구현할 수도 있고, 상위 클래스의 메소드나 필드를 하위 클래스가 재사용할 수 있다는 장점이 있습니다.
- 상속의 단점은 무엇이 있을까요?
- 하위 클래스는 상위 클래스의 메소드나 필드를 사용할 수 있으므로 하위 클래스는 수동적인 객체가 될 수 있습니다. 또한, 기능 확장을 위해 잘 정의된 상위 클래스의 메소드를 오버라이딩하면 캡슐화를 깨뜨립니다.
- 상속과 조합의 차이에 대해 설명해 주세요.
- 상속은 객체들 간의 관계를 구축하여 다형성을 구현합니다. 이와 더불어 상위 클래스의 메소드나 필드를 하위 클래스가 재사용하거나 수정할 수 있습니다. 반면, 컴포지션(조합)은 A라는 객체가 B라는 객체를 의존하고 B 객체의 메소드를 사용할 뿐 다형성과는 관계가 없습니다.
- instanceof 키워드란 무엇인가요?
- 특정 클래스의 구체적인 타입을 확인하는 키워드입니다.
- instanceof 키워드를 사용할 때 문제점으로 무엇이 있을까요?
- 로직상 구체적인 객체가 드러나므로, 캡슐화가 저해됩니다.
- 로직이 바뀔 때마다 instanceof 분기 로직을 수정해야하므로 유지보수성이 떨어집니다.
- 런타임에 객체의 타입을 확인하므로 성능이 좋지 않습니다.
- interface란 무엇일까요?
- 특정 클래스에서 구현해야 하는 명세를 의미합니다.
- interface와 abstract class는 어떤 차이가 있나요?
- interface는 상태를 가질 수 없지만, abstract class는 상태를 가질 수 있습니다. interface는 다중 상속이 가능하지만, abstract class는 다중 상속이 불가합니다. interface는 모든 메서드가 public이지만, abstract class는 접근 제어자를 자유롭게 사용할 수 있습니다.
- 언제 interface 사용하고, 언제 abstract class 사용 하나요?
- abstract class는 클래스 상속이므로 가능한 interface + default 메서드 기반으로 정의하는 편입니다. 만일 상태를 유의미하게 이용해야 하는 경우 abstract class를 사용합니다.
- final 키워드에 대해 설명해 주세요.
- 변수에 붙일 경우, 1번만 초기화를 보장합니다. 메서드에 붙일 경우, 오버라이딩이 불가합니다. 클래스에 붙일 경우, 상속이 불가합니다.
728x90
반응형
'Java' 카테고리의 다른 글
Java 개념 정리 (2) - 문자열, 예외, 제네릭, 람다, 스트림, 어노테이션, 리플렉션 (0) | 2025.01.09 |
---|---|
Servlet 이란? Spring 에선 어떻게 사용하고 구현되는지? (0) | 2024.11.03 |
Java EE 란? Spring framework 와 경쟁? 상호 보완? (1) | 2024.11.03 |
유틸리티 클래스 사용 시 주의 사항 "Add a private constructor to hide the implicit public one" (0) | 2024.10.26 |
익명 클래스와 람다식의 차이 (0) | 2022.02.14 |