Java ‐ 기술 면접 - dnwls16071/Backend_Study_TIL GitHub Wiki
정리한 내용 보기 (👈 Click)
- 장점
- JVM에서 동작하기 때문에 플랫폼에 종속적이지 않습니다.
- 캡슐화, 상속, 추상화, 다형성 등을 지원하여 객체 지향 프로그래밍이 가능합니다.
- 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적 로딩해서 생성됩니다.
- 또한 유지보수 시 해당 클래스만 수정하면 되기 때문에 전체 애플리케이션을 다시 컴파일할 필요가 없습니다.
- 따라서 유지보수가 쉽고 빠르다는 장점이 있습니다.
- 단점
- JVM에 의해 기계어로 번역되고 실행되는 과정을 거치기 때문에 다소 느리다는 단점이 있습니다.
정리한 내용 보기 (👈 Click)
- 객체(Object)는 소프트웨어에서 구현할 대상을 말합니다.
- 클래스(Class)는 객체를 만들기 위한 설계도를 말하며 이 설계도로부터 만들어진 실체를 인스턴스(Instance)라고 합니다.
정리한 내용 보기 (👈 Click)
- 객체 지향 프로그래밍이란, 프로그램 구현에 필요한 객체를 파악하고 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말합니다.
- 캡슐화 : 필요 없는 정보는 외부에서 접근할 수 없도록 제한합니다.
- 상속 : 기존 상위 클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있도록 도와줍니다.
- 추상화 : 사물들의 공통적인 특징을 파악해서 하나의 개념으로 다루는 것을 말합니다.
- 다형성 : 형태가 같지만 다른 기능을 하는 것을 말합니다.
정리한 내용 보기 (👈 Click)
- SRP(단일 책임 원칙)
- 객체는 단 하나의 책임만을 가져야 합니다.
- 어떤 변화에 의해 객체를 수정해야 하는 이유는 오직 하나뿐이어야 합니다.
- OCP(개방 폐쇄 원칙)
- 기존 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계해야 합니다.
- LSP(리스코프 치환 원칙)
- 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 합니다.
- ISP(인터페이스 분리 원칙)
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫습니다.
- 인터페이스가 명확해지고 대체 가능성이 높아집니다.
- DIP(의존관계 역전 원칙)
- 구현 클래스에 의존하지 말고 인터페이스에 의존하라는 것을 말합니다.
정리한 내용 보기 (👈 Click)
- JVM은 OS로부터 메모리를 할당받습니다.
- 컴파일러가 소스코드를 바이트 코드로 변환합니다.
- 클래스 로더를 통해 클래스 파일을 JVM내의 Runtime Data Area로 로딩합니다.
- 로딩된 클래스 파일을 Execution Engine을 통해 해석하고 실행합니다.
정리한 내용 보기 (👈 Click)
- JVM는 자바 프로그래밍 언어의 메모리 관리 메커니즘으로, 동적으로 할당된 메모리 중 더 이상 사용되지 않는 객체를 자동으로 식별하고 제거하는 프로세스입니다.
- JVM은 힙 영역, 클래스 영역, 스택 영역 3가지로 나뉩니다.
- 힙 영역은 생성된 인스턴스가 존재하는 영역입니다.
- 클래스 영역은 static이 붙은 변수들, 클래스 메타데이터, 그 외 기타 상수들이 존재하는 영역입니다.
- 스택 영역은 각 쓰레드마다 별도로 생성되는 영역입니다.
- GC는 자동 메모리 관리와 메모리 누수 방지를 통해 개발자의 수동 메모리 관리 부담을 줄여줍니다.
- 성능 오버헤드가 발생하고 애플리케이션이 일시 중지 되는 문제가 발생합니다.
정리한 내용 보기 (👈 Click)
- 자바에서는 4가지 접근 제한자를 지원합니다.
- public : 접근 제한 없음
- private : 외부 접근 불가
- default : 동일한 패키지 내에서만 접근 가능
- protected : 동일한 패키지 내에서만 접근 가능하며 상속 관계에서도 접근 가능
정리한 내용 보기 (👈 Click)
- char은 1개인 문자로 제한되는 반면에 String은 문자열을 담을 수 있습니다.
정리한 내용 보기 (👈 Click)
- 자바에서
==
연산자는 두 객체가 동일한 객체를 가리키는지 확인합니다. - 자바에서
equals()
메서드는 객체 내용이나 상태가 같은지를 판단합니다. - 기본적으로
equals()
는 Object 클래스에서 지원을 해주고 있고 내부 메서드를 들여다보면 참조값을 기준으로 비교합니다. - 따라서 요구사항에 맞춰 객체에서
hashCode()
메서드도 오버라이딩해야 합니다.
정리한 내용 보기 (👈 Click)
- 기본형 타입은 Null을 허용하지 않고 메모리의 스택 영역에 저장됩니다.
- 참조형 타입은 Null을 허용하며 데이터는 힙 영역에서 관리되지만 메모리는 스택 영역에 저장됩니다.
정리한 내용 보기 (👈 Click)
- hashcode란 객체를 식별하는 정수값을 말합니다.(고유하지 않습니다.)
- 해시 기반 컬렉션에서 값을 빠르게 찾기 위해 사용되며
hashCode()
메서드를 통해 비교합니다.
정리한 내용 보기 (👈 Click)
- 프로그램에 따라 기본 타입의 데이터를 객체로 취급해야되는 경우가 있습니다.
- 이 때, 래퍼 클래스는 각각 타입에 해당하는 데이터를 인자로 전달받아 해당 값을 가지는 객체로 만들어주는 역할을 합니다.
- 기본형 타입과 참조형 타입의 차이점은 null의 허용 여부, 동등성/동일성 측면에서의 비교 방법의 차이가 있습니다.
정리한 내용 보기 (👈 Click)
- 기본형 타입의 인스턴스를 참조형 타입의 인스턴스로 변환하는 과정을 박싱, 참조형 타입의 인스턴스를 기본형 타입의 인스턴스로 변환하는 과정을 언박싱이라고 합니다.
- JDK 1.5부터는 자바 컴파일러가 오토 박싱과 오토 언박싱을 지원해줍니다.
- 허나 이 오토 박싱과 오토 언박싱이 빈번하게 이루어지면 성능 저하가 발생할 수 있습니다.
정리한 내용 보기 (👈 Click)
- static
- 유일하게 하나만 생성되고 모든 객체들에 의해 공유됩니다.
- 프로그램이 종료될 때까지 사라지지 않습니다.
- non-static
- 객체가 제거될 때 함께 제거된다.
- 객체마다 별도로 존재하고 인스턴스 변수라고 합니다.
정리한 내용 보기 (👈 Click)
- try with resources는 Java 7에서 도입된 자원 관리 기법으로 명시적으로 닫아야 하는 리소스에 대해서 간결하고 안전하게 처리할 수 있게 도와주는 기능입니다.
- try 블록이 종료되면 자동으로 리소스를 닫아줍니다.
-
close()
메서드를 명시적으로 호출할 필요가 없습니다.
정리한 내용 보기 (👈 Click)
- 직렬화
- 자바 시스템 내부에서 사용되는 객체 또는 데이터를 자바 시스템 외부에서도 사용할 수 있도록 바이트 형태로 데이터를 변환하는 기술을 말합니다.
- 직렬화 처리를 해주기 위해서는 Serializable 인터페이스를 구현해주면 됩니다.
- 역직렬화
- 바이트로 변환된 데이터를 다시 객체도 변환하는 기술을 말합니다.
- 역직렬화시 직렬화된 객체 클래스 구조와 동일해야하며 serialVersionUID가 일치해야 합니다.
정리한 내용 보기 (👈 Click)
- 오버로딩(Overloading)
- 두 메서드가 같은 이름을 가지고 있으나 파라미터의 수나 타입이 다른 경우를 말합니다.
- 오버라이딩(Overriding)
- 하위 클래스에서 상위 클래스의 메서드와 일치하는 함수를 재정의하는 것을 말합니다.
정리한 내용 보기 (👈 Click)
- 추상 클래스와 인터페이스 모두 다형성을 구현하기 위한 방법 중 하나입니다.
- 추상 클래스는 상속을 통해, 인터페이스는 구현을 통해 다형성을 구현합니다.
- 다이아몬드 상속에 의해 상속은 1개만 가능하기 때문에 인터페이스를 이용해서 구현하는 것이 유지보수에 적합합니다.
정리한 내용 보기 (👈 Click)
- Error는 런타임 시점에 발생하며 컴파일 시점에 알 수 없습니다.
- Exception 중 체크 예외의 경우 컴파일 시점에 확인이 가능하고 언체크 예외의 경우 런타임 시점에 확인이 가능합니다.
정리한 내용 보기 (👈 Click)
- Checked Exception은 컴파일 시점에 예외 처리를 강제합니다.
- Unchecked Exception은 런타임 시점에 발생하며 예외 처리를 강제하지 않습니다.
- 예외 처리의 유연함과 코드 간결함을 위해서 Unchecked Exception을 선호하고 있는 추세입니다.
정리한 내용 보기 (👈 Click)
- 자바 컬렉션은 List, Set, Map, Queue, Stack 등이 있습니다.
- List는 순서가 있고 중복을 허용하는 자료구조입니다.
- Set은 중복을 허용하지 않는 자료구조입니다.
- Map은 키-값 쌍으로 데이터를 저장하는 자료구조입니다.
- Queue는 FIFO 구조를 가지는 자료구조입니다.
- Stack은 LIFO 구조를 가지는 자료구조입니다.
정리한 내용 보기 (👈 Click)
- Map 인터페이스를 구현한 클래스로는 HashMap, LinkedHashMap, TreeMap, ConcurrentHashMap, HashTable이 있습니다.
- HashMap은 키-값에 Null값을 허용하며, 순서를 보장하지 않고 해시 테이블 기반으로 구현됩니다.
- LinkedHashMap은 입력 순서를 유지하지만 성능 오버헤드가 존재합니다.
- TreeMap은 내부적으로 레드 블랙 트리 구성으로 이루어져 있고 정렬이 자동으로 수행됩니다.
- ConcurrentHashMap은 동시성 환경에서 사용하고 쓰레드 안전성을 제공합니다.
- HashTable은 키-값에 Null값을 허용하지 않습니다.
정리한 내용 보기 (👈 Click)
- Set 인터페이스를 구현한 클래스로는 HashSet, LinkedHashSet, TreeSet이 있습니다.
- HashSet은 순서를 유지하지 않고 해시 알고리즘을 사용하여 검색 속도가 매우 빠릅니다.
- LinkedHashSet은 순서를 유지합니다.
- TreeSet은 내부적으로 레드 블랙 트리 구성으로 이루어져 있고 정렬된 상태로 저장됩니다.
정리한 내용 보기 (👈 Click)
- List 인터페이스를 구현한 클래스로는 ArrayList, LinkedList, Vector, Stack 등이 있습니다.
- ArrayList는 배열과 달리 메모리 할당이 동적으로 이루어지며 메모리가 연속적으로 배치됩니다.
- LinkedList는 양방향 포인터 구조로 메모리가 불연속적으로 배치됩니다.
- Vector는 하위 호환을 위해서만 존재하고 있습니다.
배열은 동적으로 크기를 확장할 수 없고 초기 선언 시 크기가 정적으로 고정됩니다. 허나 리스트의 경우 동적으로 크기를 확장할 수 있습니다.
정리한 내용 보기 (👈 Click)
- String
- 새로운 값을 할당할 때마다 새로운 클래스에 대한 객체를 생성합니다.
- StringBuilder
- 메모리에 append하는 방식으로 클래스에 대한 객체를 생성하지 않습니다.
- 비동기 처리를 지원합니다.
- StringBuffer
- 메모리에 append하는 방식으로 클래스에 대한 객체를 생성하지 않습니다.
- 동기 처리를 지원합니다.
정리한 내용 보기 (👈 Click)
- String new의 경우 새로운 객체를 생성할 때마다 메모리에 자리잡게 됩니다.
- 허나 리터럴의 경우 문자열 풀에서 가져오기 때문에 메모리에 새로운 객체를 생성하지 않고 재사용하기 때문에 효율적입니다.
정리한 내용 보기 (👈 Click)
- 호출하는 함수가 작업 완료 여부를 신경쓰는지 여부에 차이가 있습니다.
- 동기의 경우 요청한 작업에 대해 완료 여부를 따져 순차적으로 처리합니다.
- 비동기의 경우 요청한 작업에 대해 완료 여부를 따지지 않고 그대로 처리합니다.