본문 바로가기
면접 대비

CS 관련 면접 질문 정리 (Java)

by Mecodata 2023. 1. 16.

1. Java 컴파일 과정

★ 자바 파일을 자바 Compiler가 바이트 코드로 변환하면 Class Loader가 자바 바이트 코드를 JVM 런타임 데이터 영역에 로드하고 실행 엔진이 최종적으로 자바 바이트 코드를 실행
- 개발자가 .java 파일 생성 후 build
- build한 java 파일을 java 컴파일러(javac)가 해석하여 바이트 코드(.class)로 변환
- 변환한 바이트 코드 파일을 Class Loader가 JVM 내부에 로딩(적재)
- 로딩된 class 파일들을 실행 엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석하여 Runtime Data Area에 배치한 후 수행
 ※ 런타임 데이터 영역(Runtime Data Area) = JVM이 프로그램을 실행하기 위해 OS로부터 할당받은 메모리 영역
 
♠ 컴파일러와 인터프티터 차이
- 컴파일러 = 한꺼번에 번역, 한번 실행 파일이 만들어지면 실행 시간이 빠름, 메모리 많이 소요, 런타임 전에 오류 탐지
- 인터프리터 = 한 줄씩 번역, 한줄씩 번역후 실행하기 때문에 실행 시간이 느림, 메모리 적게 소요, 런타임 후에 오류 탐지
 
2. String, StringBuilder, StringBuffer 차이
- String = 불변 객체 (+로 객체를 변화시키는 것은 실제로는 기존 객체를 제거하고 새로운 객체를 반환하는 것 - 재할당)
※ 캐싱(힙 공간 절약), 보안, 동기화(멀티 스레드 안정성)를 이유로 불변으로 설정
- StrngBuilder = 가변 객체, 비동기 방식(Thread-Safe X - 싱글 스레드)
- StringBuffer = 가변 객체, 동기 방식(Thread-Safe - 멀티 스레드)
=> 한 스레드가 메소드 실행시 다른 메소드가 동시에 같은 메소드를 실행시키지 못하도록 대기시킴

 버퍼(Buffer) = 데이터를 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역

 

3. String 변수 생성 시 차이

- 리터털 이용 (String a = "b") = JVM의 String Constant Pool에 할당 => 데이터가 같으면 주소값도 같음

- new 연산자 이용 (String a = new String("b")) = 힙 영역에 할당 => 데이터가 같아도 주소값이 다름

 

4. HashMap, HashTable 차이

- HashMap = Thread-Safe X(동기화 보장 X), key에 null 허용

- HashTable = Thread-Safe(동기화 보장), key에 null 허용 X

스레드 안전(Thread Safe) = 멀티 스레드 상태에서 어떤 공유 자원에 여러 스레드가 동시에 접근해도 프로그램 실행에 문제가 없는 상태

 

5. Generic(제네릭, <>

- 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법

- 제네릭 등장 전에는 컬렉션에서 객체를 꺼낼 때마다 형변환이 필요했음

- 제네릭을 사용하면 컬렉션이 담을 수 있는 타입을 컴파일러에 알려줌

=> 런타임 이전에 컴파일 과정에서 오류를 탐지할 수 있음


6. 객체(Object)와 클래스(Class)
객체 = 속성과 기능이 묶인 프로그램 단위
클래스 = 객체들이 공통적으로 갖는 속성과 기능들을 하나로 모아 정의한 집합체
인스턴스 = 클래스를 기반으로 생성된 객체
=> 인스턴스와 클래스는 붕어빵과 붕어빵 틀 같은 관계

7. 객체지향 프로그래밍(OOP, Object Oriented Programing) = 애플리케이션을 구성하는 요소들을 각각 하나의 객체로 바라보고 이러한 객체들을 서로 유기적으로 연결하여 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍
로직(Logic) = 프로그램을 만들 때의 논리적인 흐름
장점 - 간편한 유지보수, 코드 재사용성, 대형 프로젝트에 적합
단점 - 상대적으로 느린 속도, 복잡한 설계

8. OOP의 특징
추상화 = 객체들에서 공통적으로 중요한 속성과 기능을 추출하여 하나의 클래스로 정의하는 것 
캡슐화 = 서로 연관있는 속성과 기능들을 하나로 묶어 데이터를 외부로부터 보호하고(은닉성) 함수를 통해서만 접근 가능하도록 한 것
ex) public void setName() { String a = "Tom" ... }
상속성 = 하위 클래스가 상위 클래스의 속성과 기능을 상속받아 재사용하고 상황에 따라 기능을 확장하거나 수정할 수 있는 것 
④ 다형성 = 하나의 메소드나 연산자가 상황에 따라 다르게 동작될 수 있는 것 
 
9. 객체지향 설계 5원칙 (SOLID)
 SRP(Single Responsibility Principle, 단일 책임 원칙)
- 하나의 클래스는 하나의 책임만 담당하는 원칙 (한 가지 책임에 관한 변경사항이 생겼을 때만 코드를 수정해야 함 => 변경 원인이 딱 하나여야 함)
② OCP(Open Closed Principle, 개방 폐쇄 원칙)
- 클래스는 확장에는 개방되어 있어야 하고, 수정에는 폐쇄되어야 한다는 원칙
③ LSP (Liskov Substitution Principle, 리스코프 치환 원칙)
- 하위 타입(자식, 구현 클래스)은 언제나 자신의 상위 타입(부모 클래스, 인터페이스)으로 대체될 수 있어야 한다는 원칙
④ ISP (Interface Segregation Principle, 인터페이스 분리 원칙)
- 하나의 일반적인 인터페이스 보다는 구체적인 여러 개의 인터페이스를 만들어야 한다는 원칙
⑤ DIP (Dependency Inversion Principle, 의존 역전 원칙)
- 어떤 클래스를 참조해서 사용해야하는 상황이 생긴다면, 그 클래스를 직접 참조하는 것이 아니라 그 대상의 상위 요소(추상 클래스 or 인터페이스)를 참조하라는 원칙 (참조할 때 최대한 변경할 일이 거의 없는 것을 참조하라는 것)
 
10. 오버라이딩, 오버로딩 
오버라이딩 = 상위 클래스에 있는 메소드를 하위 클래스에서 재정의 
오버로딩 = 같은 이름의 메소드를 파라미터의 타입 및 개수를 다르게 하여 여러 개 정의
 
11. JVM, JRE, JDK (JVM ⊂ JRE ⊂ JDK)
JVM(Java Virtual Machine, 자바 가상 머신) = 자바 바이트 코드 파일을 읽고 검증한 뒤 실행하는 가상의 OS
바이너리 코드 = CPU이해할 수 있는 코드를 위한 이진 표현법
바이트 코드 = CPU가 아닌 가상 머신에서 이해할 수 있는 코드를 위한 이진 표현법
JRE(Java Runtime Environment, 자바 실행 환경) = 컴파일된 자바 프로그램을 실행시킬 때 필요한 플러그인
JDK(Java Development Kit, 자바 개발 도구) = Java를 활용하여 프로그램을 개발할 때 필요한 도구 모음
 
12. 자바 컬렉션 프레임워크 (Java Collection Framework) 
데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것
List = 순서가 있는 데이터의 집합, 중복 허용
Set = 순서가 없는 데이터의 집합, 중복 허용 X
Map = 키와 값의 한 쌍으로 이루어지는 데이터 집합, 키는 중복 X & 값은 중복 가능 (Python의 딕셔너리)
※ List와 Set은 Collection 인터페이스에서 상속, Map은 별도로 정의
 
13. Call by value (에 의한 호출), Call by reference (참조에 의한 호출)
Call by value = 값을 복사하여 처리 (Deep Copy) => 원래 값 보존, 참조보다 상대적으로 느린 속도 
Call by reference = 값의 주소를 참조하여 직접 값에 영향을 줌 (Shallow Copy) => 원래 값 보존 X, 빠른 속도
자바는 call by value!!
 
14. 접근 제어자 종류
- private = 해당 클래스에서만
- default = 동일 패키지에서만
- protected = 동일 패키지 + 상속받은 외부 패키지에서만
- public = 제한 x
 
15. 추상 클래스와 인터페이스

공통점

- 추상(abstract) 메소드 필수 입력
※ 추상 메소드 = 실행문 없이 선언문(반환타입과 메소드명)만 정의된 메소드 => 중괄호 {} 사용 X
ex) abstract void setNumber(int num); 
- new 생성자 사용 X (인스턴스화 불가능)
- 상속받아 구현한 구현체의 인스턴스를 사용해야 함
- 상속한 클래스는 추상 메소드를 반드시 구현해야 함

차이점

추상 클래스 인터페이스
클래스 클래스 X
필드값 설정 가능 필드값 설정 불가능 (상수만 설정 가능)
메소드 내부 코딩 가능 메소드 내부 가능 (default, static 활용)
단일 상속만 가능 단일 & 다중 상속 가능

 

추상 클래스
- 하나 이상의 추상 메소드를 가지고 있는 클래스
- 상속을 통해 자식 클래스에서 기능을 이용하고 확장(extends), 단일 상속만 가능
- 일반 메소드, 상수, 생성자 포함 가능 (일종의 미완성 설계도)
- 사용 이유 =  상속 관계인 클래스들이 공통으로 가지는 메소드와 필드가 많아 중복 통합이 필요한 경우
 
인터페이스
- 자바에서 클래스들이 구현해야하는 메소드를 지정하는 용도로 사용되는 추상 자료형 (클래스 X)
- 상속에 얽매이지 않고 공통 기능이 필요할 때마다 구현(implement), 다중 상속 가능
- 메소드 상세 코딩 가능(Java8부터 default, static 사용으로 가능), 생성자 포함 불가능

=> 추상, static, default 메소드 및 상수 필드만 가능 (일종의 기본 설계도)
- 사용 이유 = 다중 상속 or 서로 연관성이 없는 클래스들을 공통적인 기능을 통해 하나로 묶기 위해서 (유연성 증대)
ex) 카드 결제와 현금 결제 클래스 각각 있는 상황에서 두 클래스에 모두 A 기능(내용은 서로 다름)을 추가하려면 A 인터페이스를 생성하여 각각의 클래스에 implement를 해주면 됨
 
16. Java8 특징
- 람다(익명 함수) = ( 파라미터 ) -> { 몸체(실행문) } 형태로 함수식을 표현
- 함수형 인터페이스 = 추상 메소드가 단 하나만 정의된 인터페이스 (따로 static, default 메소드가 정의되어 있어도 상관 X)
- 메소드 참조(::) = 일반 함수를 람다 형태로 사용 => 마지막에 소괄호() 입력 X
ex) String.valueOf(); => String::valueOf; 
- 스트림배열이나 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있게 해주는 반복자(기능)
(기존 for문을 이용한 반복문을 보다 간편하게 표현할 수 있도록 해줌, 데이터 읽기만 가능하고 변경은 불가능)
 
- 인터페이스에서 static, default 메소드 선언 (이전에는 추상 메소드만 정의할 수 있었음)
default = 인터페이스에 새로운 메소드가 추가되면 자동적으로 구현(자식) 클래스에서도 사용 가능 (하위 호환 문제 해결)
static = [인터페이스.메소드] 형태로 메소드 호출  => 오버라이딩 불가능
 
- Optional = NULL이 올 수 있는 값을 감싸는 Wrapper 클래스로, NPE가 발생하지 않도록 도와줌
 
17. MyBatis, JPA 차이
MyBatis 
- 쿼리문과 프로그래밍 코드가 분리 => 쿼리문이 바뀌어도 자바 코드를 바꿔줄 필요 X
- 쿼리문 직접 작성 후 어떤 객체에 매핑할지 바인딩
- 객체와 쿼리 모두 관리
- xml로 쿼리문 관리
- DB에 종속적 => DB 변경 시 DTO도 수정
 
JPA (Java Persistent API)
- 자바 진영의 ORM 기술 표준 (자바에서 RDB를 사용하는 방식을 정의한 인터페이스)
※ ORM(Object Relational Mapping) = 객체와 DB의 데이터를 자동으로 매핑(연결)해주는 것
영속성(Persistence) = 데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성
- 쿼리를 직접 작성 하지 않아도 되며 DB에 종속적이지 않아 데이터 수정 시 객체만 변경하면 됨
- 코드량이 짧은 편 => 가독성 우수, 수정이 간편함
- 다수의 테이블 조인 시 복잡함 => 복잡한 쿼리문일 경우 JPQL 사용
- 객체만 관리 가능
- 기본 CRUD 기능 제공 (객체 중심 개발) 
 
18. JDBC (Java DataBase Connectivity)
- 자바 프로그램이 DB에 접근(Connectivity)할 수 있도록 Java에서 제공하는 API 
- DB에 독립적
- JDK에서 제공
 
19. Enum
- 열거형 상수 집합
- 클래스를 상수처럼 사용 가능
- 상속 X, 싱글톤 형태
 
20. 싱글톤 패턴
- 하나의 클래스에 오직 1개의 인스턴스만 가지는 패턴
 
21. 가비지 컬렉션(GC, Garbage Collectoin)
자바의 메모리 관리 방법 중의 하나로 JVM의 가비지 컬렉터 영역(Young, Old)에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역(garbage)를 찾아서 자동으로 정리해주는 기능
 
22. 어노테이션
자바 소스코드에 추가해서 사용할 수 있는 메타 데이터의 일종
 
23. Java의 자료형
primitive type(원시 타입) = boolean, byte, short, int, long, char, float, double (값을 스택 영역에 저장)
reference type(참조 타입) = primitive type를 제외한 자료형 => 클래스, 인터페이스 (메모리 주소는 스택 영역에 실제 값은 힙 영역에 저장) 
 
 

댓글