본문 바로가기
면접대비/예상질문

백엔드 신입 면접질문 공부(자바 Java)

by 계범 2022. 3. 2.

주관적인 평가

상: 많이 나올만한 내용

중: 나올수도 있는 내용

하: 잘 안나올 거 같은 내용

 

객체 지향이란 무엇인가요?(중)

더보기

: 실생활에서 쓰는 모든 것을 객체라고하는데, 객체지향 프로그래밍이란 프로그래밍 구현에 필요한 객체를 파악하고 정의하여 객체들간의 상호작용을 통해 프로그램을 만드는것을 뜻합니다.

 

객체 지향적 설계 원칙 5가지에 대해 얘기해주세요.(상)

더보기

1 SRP 단일 책임 원칙(Single Responsibility Principle)

  • 한 클래스는 하나의 책임만 가져야 한다.
  • 하나의 책임은 모호
    • 클 수도 있고, 작을 수도 있다.
    • 문맥과 상황에 따라 다름
  • 중요한 기준은 변경. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것
  • EX) UI 변경, 객체의 생성과 사용 분리

2 OCP 개방-폐쇄 원칙(Open-Closed Principle)

  • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 함
  • 다형성을 활용
  • 인터페이스를 구현한 새로운 클래스를 하나 만들어 새로운 기능을 구현(변경X)''
  • 문제점
    • 클라이언트가 구현 클래스를 직접 선택
    • 구현 객체를 변경하려면 클라이언트 코드를 변경해야함..
    • 분명 다형성을 사용했지만 OCP 원칙을 지킬 수 없음
    • 해결할려면 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자가 필요

3 LSP 리스코프 치환 원칙(Liskov Substitution Principle)

  • 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
  • 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야함, 다형성을 지원하기 위한 원칙, 인터페이스를 구현한 구현체는 믿고 사용하려면, 이 원칙이 필요.
  • EX) 자동차 인터페이스의 엑셀은 앞으로 가라는 기능! 만약 뒤로 가게 구현했다면 LSP 위반. 느리더라도 앞으로 가게 구현해야함!

4 ISP 인터페이스 분리 원칙(Interface Segregation Principle)

  • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다
  • 자동차 인터페이스 -> 운전 인터페이스, 정비 인터페이스로 분리
  • 사용자 클라이언트 -> 운전자 클라이언트, 정비사 클라이언트로 분리
  • 분리하면 장비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않음
  • 인터페이스가 명확, 대체 가능성이 높아짐

5 DIP 의존관계 역전 원칙(Dependency Inversion Principle)

  • 프로그래머는 "추상화에 의존해야지, 구체화에 의존하면 안된다." 의존성 주입은 이 원칙을 따르는 방법 중 하나
  • 구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 뜻
  • 기존의 역할과 구현에서 역할에 의존해야한다는 거랑 같음. 그래야 유연하게 구현체를 변경 가능. 구현체 의존할 경우 변경 아주 어려워짐...

김영한님의 인프런강의

 

객체지향 프로그래밍의 특징과 장점에 대해 설명하세요.(상)

더보기

: 객체지향 프로그래밍의 특징으로는 추상화, 캡슐화, 상속성, 다형성있고 이로 인해

코드를 재사용성이 높고, 관리가 용이하며, 신뢰성 높은 프로그래밍을 가능하게 합니다.

 

간단 요약

추상화: 공통된 속성이나 기능을 찾아내어 공통된 조상을 만드는 것.(클래스나 인터페이스)

캡슐화: 객체의 속성과 행위를 하나로 묶고, 구현 내용을 외부로부터 감추는 것

(예시: 클래스로 하나로 묶고, 내부에 접근제어자를 두어 외부에서 접근 불가능하게 만들어 감춤)

상속성: 부모 클래스의 특성을 자식 클래스가 상속받는 것.

다형성: 여러 가지 형태를 가질수 있는 것. (오버로딩, 오버라이딩)

 

2022.03.04 - [Language/Java] - [Java] 추상클래스(abstract class) -추상화,구체화

2022.03.04 - [Language/Java] - [Java] 제어자(modifier) - 접근 제어자와 그 외 제어자(캡슐화)

2022.03.04 - [Language/Java] - [Java] 객체지향 프로그래밍 -상속과 포함관계,Object클래스

2022.03.04 - [Language/Java] - [Java] 다형성(polymorphism)

 

객체와 클래스의 차이는 무엇인가요?(상)

더보기

: 클래스는 객체를 만드는 설계도입니다. 이 클래스를 참조하여 객체(인스턴스)를 생성합니다.

 

2022.03.01 - [Language/Java] - [Java] 객체지향언어특징과 클래스와 객체

 

jvm의 메모리 구조에 대해 설명하세요(중)

더보기

: jvm은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고, 용도에 따라 여러 영역으로 나누어 관리합니다. 총 5가지의 영역으로 나누어집니다.

 

Runtime Data Areas

JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역임

총 5가지 영역으로 나누어짐 : PC 레지스터, JVM 스택, 네이티브 메서드 스택, 힙, 메서드 영역

(이 중에 힙과 메서드 영역은 모든 스레드가 공유해서 사용함)

 

PC 레지스터 : 스레드가 어떤 명령어로 실행되어야 할지 기록하는 부분(JVM 명령의 주소를 가짐)

call 스택: 메서드에 대한 정보가 저장. (지역변수, 매개변수, 메서드 정보, 임시 데이터 등)

네이티브 메서드 스택 : 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역

힙(heap): 런타임에 동적으로 할당되는 데이터가 저장되는 영역. 객체나 배열 생성이 여기에 해당함

(또한 힙에 할당된 데이터들은 가비지컬렉터의 대상이 됨. JVM 성능 이슈에서 가장 많이 언급되는 공간임)

메서드 영역(method area) : JVM이 시작될 때 생성되고, JVM이 읽은 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 필드 및 메서드 코드, 정적 변수, 메서드의 바이트 코드 등을 보관함

 

2022.02.24 - [Language/Java] - [Java] 자바언어의 특징과 JVM

gyoogle 참조

 

클래스 변수(Static 멤버)와 인스턴스 변수(Non-static 멤버)의 차이에 대해 설명하세요(하)

더보기

클래스 멤버(변수,메서드)는 클래스가 메모리에 올라갈 때 생성되며, 모든 인스턴스가 공유합니다.

반면 인스턴스 멤버는 인스턴스가 생성될 때 생성되며, 각각의 인스턴스가 독립적인 인스턴스 변수를 가집니다.

 

2022.03.02 - [Language/Java] - [Java] 변수와 메서드

 

오버로딩과 오버라이딩의 차이점을 설명해주세요(상)

더보기

오버로딩이란 한 클래스 내에 매개변수의 개수나 타입이 다른 같은 이름으로 메서드를 여러개 정의하는 것을 뜻합니다.

오버라이딩이란 부모 클래스로부터 상속받은 메소드를 재정의하는 것을 뜻합니다.

 

2022.03.02 - [Language/Java] - [Java] 오버로딩(overloading)

 

접근 제어자에 대해 설명해주세요(중)

더보기

접근 제어자란 해당하는 클래스,메서드,변수 등을 외부에서 접근하는 것을 제어하는 역할을 합니다.

public, protected, (default), private 순으로 더 좁은 범위에서 접근할 수 있게 해줍니다.

 

2022.03.04 - [Language/Java] - [Java] 제어자(modifier) - 접근 제어자와 그 외 제어자(캡슐화)

 

인터페이스와 추상 클래스의 차이점을 설명해주세요(상)

더보기

추상 클래스는 추상 메서드를 포함한 클래스로 해당 추상클래스를 단일 상속하게 하여, 틀을 제공해줍니다.

인터페이스는 추상 메서드와 상수만을 포함한 것으로 다중 상속이 가능합니다.

(jdk1.8 이후 static 메서드와 default 메서드도 가능)

 

추상 클래스는 extend라는 키워드처럼 자신의 기능들을 하위 클래스로 확장시키는 느낌이라면,

인터페이스는 implements라는 키워드처럼 정의된 추상메서드를 각 목적에 맞게 구현하는 느낌입니다.

 

2022.03.04 - [Language/Java] - [Java] 추상클래스(abstract class) -추상화,구체화

2022.03.04 - [Language/Java] - [Java] 인터페이스(interface)

 

static에 대해 설명해주세요(중)

더보기

static은 제어자로 '공통적인'이란 의미를 가지고 있습니다.

static을 붙이게 되면 모든 객체가 공유하게 되지만, GC의 관리영역 밖에 존재하므로 주의해야합니다.

 

2022.03.04 - [Language/Java] - [Java] 제어자(modifier) - 접근 제어자와 그 외 제어자(캡슐화)

 

primitive type & reference type에 대해 설명해주세요(중)

더보기

primitive type은 기본 자료형 타입으로 8개의 타입이 있고, 실제값을 저장하는 stack 메모리에 저장됩니다.

reference type은 참조형 타입으로 null이 포함 가능하고 유동적인 개수를 가지며(사용자가 만들어서도 쓰기때문[클래스]), new 연산자를 통해 생성되어 주소값을 저장하는 공간으로 heap 메모리에 저장됩니다.

 

2022.02.25 - [Language/Java] - [Java] 기본형(Primitive type) & 상수와 리터럴(constant & literal)

2022.02.27 - [Language/Java] - [Java] 기본형(Primitive Type)

 

업캐스팅과 다운캐스팅에 대해 설명해주세요(상)

더보기

업캐스팅과 다운캐스팅은 서로 상속관계에 있는 클래스에서 나타나며,

업캐스팅은 자손 클래스 ​타입의 참조변수에서 조상 클래스 ​타입의 참조변수로 형변환,

다운캐스팅은 조상 클래스 타입의 참조변수에서 자손 클래스 타입의 참조변수로 형변환 하는 것입니다.

 

2022.03.04 - [Language/Java] - [Java] 다형성(polymorphism) - 업캐스팅,다운캐스팅

 

Error와 Exception의 차이에 대해 설명해주세요(중)

더보기

Error: 프로그램 코드로 수습할 수 없는 심각한 오류

Exception: 프로그램 코드로 수습이 가능한 다소 미약한 오류

 

2022.03.06 - [Language/Java] - [Java] 예외처리(exception handling), 에러와 예외의 차이

 

checkedException과 uncheckedException의 차이에 대해 설명해주세요(하)

더보기

checkedException: RuntimeException 클래스를 제외한 Exception 클래스의 하위 클래스들을 뜻합니다. 체크 예외의 특징은 반드시 오류 처리를 해결해야 합니다. 해결하지않으면 Compile시점에서 걸립니다.

uncheckedException: RuntimeException의 하위 클래스들을 뜻합니다. 언체크 예외는 명시적으로는 처리하지 않아도 됩니다. 프로그램을 구동하는데는 문제가 없습니다.

 

2022.03.06 - [Language/Java] - [Java] 예외처리(exception handling), 에러와 예외의 차이

 

얕은 복사와 깊은 복사의 차이에 대해 설명해주세요(중)

더보기

얕은 복사(shallow copy)는 새로운 객체를 만들고 원본에 값을 복제하는 것이 아닌 원본을 참조하는 형식입니다.

불변의 요소는 가져오고 가변의 요소는 같은 주소를 가리키게 됩니다.

 

깊은 복사(deep copy)는 새로운 객체를 만들고 내용도 새로 생성해서 복사합니다. 그로인해 복사된 객체는 원본 객체와 무관한 객체가 됩니다.

 

2022.01.05 - [CS/Basic] - [Python] 객체복사,shallow copy,deep copy

 

String, StringBuilder랑 StringBuffer 차이에 대해 설명해주세요(상)

더보기

String은 불변의 객체로, heap과 상수풀에 저장됩니다.

StringBuilder와 StringBuffer는 heap에 저장되고 변경이 가능하지만, StringBuffer의 경우 Thread-safe하고, StringBuilder의 경우 Thread-safe하지 않습니다.

(Thread-safe: 멀티쓰레드 환경에서 안전하다는 뜻)

 

2022.03.07 - [Language/Java] - [Java] String, StringBuffer, StringBuilder 클래스

 

제네릭(Generic)에 대해 설명해주세요(중)

더보기

제네릭 타입은 다양한 타입의 객체들을 다룰 수 있도록 도와주는 타입 매개 변수입니다.

 

클래스나 인터페이스,메서드에 제네릭 타입을 사용함으로서, 타입체크와 형변환을 생략 가능하게하고 잘못된 타입 사용으로 인한 런타임 오류를 컴파일과정에서 미리 알 수 있게 해줍니다.

 

 

 

어노테이션(annotation)에 대해 설명해주세요(중)

더보기

어노테이션은 일종의 메타 데이터로, 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것입니다.

대표적으로 제공하는 정보는 다음과 같습니다.

 

1. 컴파일러가 코드 문법 에러를 찾을 수 있도록 정보를 제공합니다.

2. 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공합니다.

3. 실행 시 (런타임 시) 특정 기능을 실행하도록 정보를 제공합니다.

 

 

어노테이션 참조

 

래퍼클래스(Wrapper Class)에 대해 설명해주세요(중)

더보기

래퍼클래스란 기본형 변수를 객체 형태로 쓸 수 있게 만든 클래스입니다.

 

2022.03.08 - [Language/Java] - [Java] 래퍼(wrapper) 클래스

 

Call By Reference VS Call By Value에 대해 설명해주세요(상)

더보기

Call By Value란 값에 의한 호출로, 함수 호출 시 인자로 전달되는 변수의 값을 복사하여 함수의 인자로 전달합니다. 복사된 인자는 지역변수의 특성을 가집니다.

 

Call By Reference는 참조에 의한 호출로, 함수 호출 시 인자로 전달되는 변수의 레퍼런스를 전달합니다. 그로인해 함수 내부에서 인자의 값이 변경되면, 인자로 전달되었던 변수의 값도 함께 변경됩니다.

 

자바는 Call By Value로 이루어져있습니다.

참조 자료형을 매개변수로 넘길 시에, 참조 매개변수에 전달했던 변수의 주소값을 복사하여 값으로 가집니다.

그로인해 함수 내부에서 해당 변수에 새로운 객체를 만들어 주소값을 저장하더라도, 원본 변수의 주소값은 변하지 않으므로 원본 변수가 가르키는 객체가 변하지 않습니다.

 

2022.03.12 - [CS/Basic] - Call By Value VS Call By Reference 차이점

 

자바의 Thread에서 start와 run의 차이에 대해 설명해주세요(하)

더보기

run() 메서드는 쓰레드 내부의 run() 메서드를 호출하는 것뿐입니다. 그래서 main 메서드에서 쓰레드를 생성한 후에 run() 메서드를 호출하면 main쓰레드 내의 콜 스택에서 실행됩니다.

 

start() 메서드는 스레드를 위한 콜 스택을 새로 생성한 후에 그 위에서 실행됩니다.

 

콜스택: 실질적인 명령어를 담고 있는 메모리. 멀티 쓰레드는 여러개의 콜 스택을 번갈아가면서 처리하는 것.

 

2022.03.13 - [Language/Java] - [Java] 쓰레드 1 - 구현 및 실행(start, run)

 

 병행과 병렬의 차이를 설명해주세요(하)

더보기

병행: 여러 일을 동시에 수행하는 것처럼 매우 짧은 시간에 번갈아가면서 수행하는 것입니다.

병렬: 멀티 코어 환경에서 실제로 여러 일을 동시에 수행하는 것입니다.(core는 한가지 일밖에 처리 못하기 때문)

 

쓰레드 그룹과 특징에 대해 설명해주세요(하)

더보기

쓰레드 그룹은 서로 관련된 쓰레드를 그룹으로 다루기 위한 것입니다.

모든 쓰레드는 반드시 쓰레드 그룹에 포함되어있고, 명시적으로 쓰레드 그룹에 포함시키지 않으면 자신을 생성한 쓰레드의 그룹에 포함됩니다.

 

2022.03.14 - [Language/Java] - [Java] 쓰레드 3 - 쓰레드 우선순위와 쓰레드 그룹

 

일반 쓰레드와 데몬 쓰레드에 대해 설명해주세요(하)

더보기

일반 쓰레드는 기본적인 쓰레드(실행단위)를 뜻하고, 데몬 쓰레드는 일반 쓰레드를 도울 목적으로 만들어진 쓰레드를 뜻합니다. 대부분의 데몬 쓰레드는 무한루프를 돌며 조건문을 통해 대기하고 있다가 특정 조건이 되면 작업을 수행하고 다시 대기하는 형태로 쓰입니다. 일반 쓰레드가 다 끝나면 데몬 쓰레드도 종료되게 됩니다.

 

2022.03.14 - [Language/Java] - [Java] 쓰레드 4 - 데몬 쓰레드(daemon thread)

 

쓰레드의 상태에 대해 설명해주세요(하)

더보기
상 태 설 명
NEW 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태
RUNNABLE 실행 중 또는 실행 가능한 상태
BLOCKED 동기화블럭에 의해서 일시정지된 상태(lock이 풀릴 때까지 기다리는 상태)
WAITING,
TIMED_WAITING
쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은(unrunnable) 일시정지 상태.
TIMED_WAITING은 일시정지시간이 지정된 경우를 의미.
TERMINATED 쓰레드의 작업이 종료된 상태

 

2022.03.14 - [Language/Java] - [Java] 쓰레드 5 - 쓰레드의 실행제어(sleep, interrupt, join, yield)

 

Map, Set, List에 대한 설명해주세요(중)

 

String을 사용할 때 같은 크기에서 변경하게 된다면 주소값이 같은가요?(중)

 

Array와 LinkedList의 차이가 무엇인가요(중)

 

iterator는 무엇인가요?(하)

 

이진탐색트리(Binary Search Tree)에 대해 설명하세요(중)

 

Stack 과 Queue에 대해 설명하세요(중)

 

해싱이란 무엇인가요?(중)

 

2의 보수법에 대해 설명해주세요(하)

 

부동소수점과 고정소수점에 대해 설명해주세요(하)

 

Garbage Collection이 무엇인지 설명해주세요(중)

더보기

GC(Garbage Collection)은 JVM이 주기적으로 heap영역에 할당된 객체들 중 사용하지 않는 객체들을 정리해주는 작업입니다.

 

2022.04.03 - [Language/Java] - [Java] Garbage Collection(GC) 가비지 컬렉션


Stop The World에 대해 설명해주세요(중)

더보기

GC를 실행하기 위해 JVM이 어플리케이션의 실행을 멈추는 것을 의미합니다.

 

2022.04.03 - [Language/Java] - [Java] Garbage Collection(GC) 가비지 컬렉션

 

Weak Generational Hypothesis에 대해 설명해주세요(하)

더보기

가비지 컬렉터는 'weak generational hypothesis'라는 가설에 의해 생겼습니다.

  • 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다.
  • 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.

 

2022.04.03 - [Language/Java] - [Java] Garbage Collection(GC) 가비지 컬렉션

 

Reachability에 대해 설명해주세요(중)

더보기

Java GC는 객체가 가비지인지 판별하기 위해서 reachability라는 개념을 사용합니다. 어떤 객체에 유효한 참조가 있으면 'reachable'로, 없으면 'unreachable'로 구별하고, unreachable 객체를 가비지로 간주해 GC를 수행합니다.

 

보다 자세한 내용이 아래 D2 글 참조

https://d2.naver.com/helloworld/329631

 

Young 영역과 Old 영역에 대해 설명해주세요(중)

더보기
G1GC 이전의 GC에선 Heap을 크게 두개의 물리적 공간으로 나누어서 관리했었습니다.

 

Young 영역
  • 새롭게 생성한 객체의 대부분이 여기에 위치.
  • 대두분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라짐.
  • 이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말함.

Old 영역

  • 접근 불가능 상태로 되지 않아 Young영역에서 살아남은 객체가 여기로 복사.
  • 대부분 Young영역보다 크게 할당.
  • 크기가 큰 만큼 Young 영역보다 GC는 적게 발생.
  • 이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC)가 발생한다고 말함.

 

2022.04.03 - [Language/Java] - [Java] Garbage Collection(GC) 가비지 컬렉션

 

Minor GC와 Major GC에 대해 설명해주세요(중)

더보기

Minor GC는 Young 영역에서 일어나는 GC를 말하고,

Major GC는 Old 영역에서 일어나는 GC를 말합니다.

 

G1GC와 ZGC에 대해 설명해주세요(중~상)

더보기

IT 대기업에서 질문 나왔었음..

 

G1GC는 JDK 11 Default GC로 기존의 Young,Old 영역으로 나눈 것이 아닌 Heap을 Region이라는 특정 크기로 나누고, GC대상 객체가 발견된 각각의 Region에만 GC 발생합니다.

 

ZGC는 큰 메모리에서 효율적인 GC를 위한 GC로 JDK 15에서 준비중인 GC입니다.Colored Pointers와 Load Barriers 알고리즘을 통해 객체를 Marking하고 관리하게 됩니다.

ZGC는 확장이 가능하고 저지연(STW 10MS이하가 목표) GC입니다.

 

2022.04.03 - [Language/Java] - [Java] Garbage Collection(GC) 가비지 컬렉션

댓글