Java 기술 면접 대비

2025. 3. 20. 20:10·Language/Java
반응형

https://dev-coco.tistory.com/153 참고

신입 개발자 기술면접 질문 정리 - 자바

💡 Java의 특징을 설명해주세요.Java는 객체지향 프로그래밍 언어입니다. 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어

dev-coco.tistory.com

 

Java의 특징 설명

  • Java는 객체지향 프로그래밍언어로, 다형성, 상속, 캡슐화, 추상화 등의 특징을 가집니다.
  • JVM 위에서 구동되어 운영체제에 독립적입니다. 하지만 이 때문에 실행 속도가 상대적으로 느립니다.
  • GC가 자동으로 메모리를 관리해줍니다.

JVM에 대한 설명

  • JVM은 Java Virtual Machine의 약자로, Java가 운영체제에 독립적일 수 있게 합니다.
  • 클래스 로더 영억, 런타임 데이터 영역, 실행 엔진 영역으로 나뉩니다.
  • 클래스 로더는 바이트파일을 JVM 메모리에 로드하는 역할을 하며, 동적으로 런타임 데이터 영역에 클래스들이 배치됩니다.
    실행 엔진에서 바이트파일을 실행시키며, GC로 메모리 관리를 합니다.

Java의 컴파일 과정

  • .java 확장자의 파일을 Java 컴파일러로 .class 확장자의 바이트파일로 컴파일합니다.
  • 컴파일된 바이트파일을 클래스 로더가 JVM 메모리에 로드합니다.
  • 실행 엔진이 해당 파일을 실행시킵니다. 처음에는 인터프리터 방식으로 실행시키고, 자주 사용되는 것들은 JIT(Just In Time)로 실행시킵니다.

Overriding과 Overloading

  • Overriding이란 인터페이스나 부모 클래스에서 상속받은 메소드를 재정의하는 것을 의미합니다.
  • Overloading이란 같은 이름의 메소드를 변수의 수 등을 다르게 하여 여러개 정의하는 것을 의미합니다.

객체지향 프로그래밍(OOP)이란?

  • 모든 요소들을 객체의 형태로 바라보고, 각 객체들의 역할에 따라 상호작용하도록 하는 것을 의미합니다.
  • 즉, 기능 중심이 아닌, '누가 어떤 역할을 하는가?'를 중심으로 합니다.
  • 특징으로는 다형성, 상속, 캡슐화, 추상화가 있습니다.
  • 상속: 부모 객체나 인터페이스에 정의된 메서드를 하위 객체가 사용할 수 있는 것을 말합니다.
  • 다형성: 오버라이딩이나 오버로딩을 통해 같은 메서드를 호출하여도 다르게 동작하는 것을 말합니다.
  • 캡슐화: 클래스 내부에서만 접근할 수 있도록 하고, 외부에서 이를 직접적으로 조작하지 못하게 하는 것을 말합니다.
  • 추상화: 반환타입, 파라미터 타입, 메소드명과 같이 핵심적인 것들만 정의하는 것을 말합니다.

객체지향 설계 원칙 설명

  • 객체지향 설계 원칙은 SOLID를 따릅니다.
  • SRP (단일 책임 원칙) : 하나의 클래스는 하나의 역할만 수행다는 원칙입니다.
  • OCP (개방 폐쇄 원칙) : 확장에는 열려있고, 수정에는 닫혀있다는 원칙입니다.
  • LSP (리스코프 치환 원칙) : 하위타입은 항상 상위타입을 대체할 수 있어야 한다는 원칙입니다.
  • ISP (인터페이스 분리 원칙) : 인터페이스의 메소드를 최소화하여, 여러개의 인터페이스로 분리하라는 원칙입니다.
  • DIP (의존성 역전 원칙) : 구체적인 클래스보다 수정 가능성이 덜한 추상 클래스나 인터페이스와 관계를 맺도록 하는 원칙입니다.

try-with-resources란?

  • try-catch-finally 구문을 보완하고자 등장한 개념입니다.
  • try구문에 자원 객체를 전달하면, try 블록 종료 시 자원 할당이 자동으로 해제됩니다.

불변 객체란?

  • 불변 객체란 데이터 내부의 상태가 변하지 않는 객체를 말합니다.
  • 해시값 변경이 없기 때문에 해시를 사용하는 Map이나 Set으로 관리하기 좋습니다.
  • 자원 동기화가 필요 없어 멀티 스레드 환경에서도 안전하게 사용 가능합니다.

불변객체를 만드는 방법

  • final 키워드로 불변객체를 만들 수 있습니다.
  • 다만, 참조 자료형의 경우 내부 값들까지 불변으로 유지해야하기 때문에, 참조하는 객체의 내부 값들을 복사하여 저장하는 형태로 만들 수 있습니다.
  • 이를 방어적 복사(defensive copy)라고 합니다.

추상 클래스와 인터페이스의 차이

  • 추상 클래스는 abstract로 정의되어 있거나, 추상 메소드를 포함한 클래스를 말합니다.
  • 인터페이스는 모든 메소드가 추상 메소드여야 합니다.
  • 클래스는 다중상속이 불가능하지만, 인터페이시는 가능합니다.

싱글톤 패턴이란?

  • 싱글톤 패턴이란, 프로그램 내에서 1개의 인스턴스로 존재하는 것을 말합니다.
  • 인스턴스가 1개만 존재하는 것을 보장하고 싶은 경우 사용합니다.
  • 또는 동일한 인스턴스를 자주 사용해야 하는 경우 메모리 낭비를 방지하기 위해 사용합니다.
  • 대표적인 예로는 Spring의 Bean이 있습니다.

Garbage Collection이란?

  • Java에서 자동으로 메모리를 관리해주는 기법을 말합니다.
  • JVM의 엔진 영역에서 구동됩니다.
  • GC는 '대부분의 객체는 생명주기가 짧고, 오래 사용된 객체는 계속해서 오래 사용될 가능성이 높다'라는 가정하에 설계되었습니다.

Garbage Colloection 과정

  • Young Generation과 Old Generation으로 나뉘며, Young Generation에서 일어나는 GC 작업을 Minor GC라고 합니다.
  • Young Generation은 에덴 영역과 서바이버 영역으로 나뉘어져 있습니다. 에덴 영역에 새로운 객체들을 저장하고, 사용되는 객체들은 나이를 부여하며 서바이버 영역에 존재하게 합니다.
  • Minor GC 작업 시 사용되지 않는 객체를 정리하고 사용되는 객체들의 나이가 임계치를 넘어설 경우 Old Generation 영역에 저장합니다.
  • Old Generation 영역이 가득차게 되면 Major GC를 수행하여, 객체들을 정리합니다.
  • GC 작업은 모든 스레드가 중단된 후 이루어집니다.

자바의 메모리 영역에 대한 설명

  • 자바의 메모리 영역은 메소드 영역, 힙 영역, 스택 영역으로 나뉘어집니다.
  • 메소드 영역은 static변수들이나 method들이 저장되며, 프로그램 실행부터 종료까지의 생명주기를 갖습니다.
  • 힙 영역은 프로그램이 실행되며 생성된 객체들이 저장됩니다. GC에 의해 관리되어지는 영역입니다.
  • 스택 영역은 메소드가 실행되며 생성된 변수들이 저장되는 공간입니다. 메소드 호출부터 종료까지의 생명주기를 갖습니다.

클래스/객체/인스턴스 의 차이

  • 클래스는 객체를 생성하기 위한 설계도, 틀을 의미합니다.
  • 클래스를 기반으로 생성되는 것을 객체라고 합니다.
  • 객체에 실제 메모리가 할당되어 사용되는 것을 인스턴스라고 합니다.

생성자에 대한 설명

  • 클래스와 같은 이름을 가진 메소드로, 객체를 생성할 때 호출합니다.
  • 명시적으로 생성자를 정의하지 않아도 default로 생성되며, 이 경우에는 파라미터를 아무것도 받지 않습니다.
  • 오버로딩으로 여러 생성자를 생성할 수 있습니다.

Wrapper Class, Boxing과 Unboxing 설명

  • int, long과 같은 기본 자료형을 객체로 표현한 것을 Wrapper Class라고 합니다.
  • 기본자료형을 Wrapper Class로 변환하는 작업을 Boxing, 반대의 작업을 Unboxing이라고 합니다.

Synchronized 설명

  • 멀티스레드 환경에서 한 스레드가 특정 자원을 사용하고 있을 때 다른 자원이 사용하지 못하도록 하는 것입니다.
  • 변수와 메소드에 Synchronized 키워드를 사용해 동기화 할 수 있습니다.
  • Synchronized 키워드 남발 시 프로그램 성능이 저하될 수 있습니다.

new String()과 리터럴("") 차이

  • 리터럴로 생성한 문자열 객체는 힙메모리의 String pool에 저장됩니다.
  • 만약 동일한 값의 문자열을 리터럴로 생성하면, String pool에 저장된 문자열 객체를 동일하게 사용합니다.
  • 생성자를 통해 문자열을 생성하면, 동일한 값의 문자열이여도 새로운 객체를 생성하여 사용하게 됩니다.

String, StringBuffer, StringBuilder의 차이

  • String은 기본적으로 불변객체의 특성을 가집니다. 때문에 값 수정이 불가능합니다.
  • 때문에 문자열 값이 빈번하게 바뀔 경우 String은 새로운 객체를 계속 생성하여 메모리 낭비를 발생시킵니다.
  • StringBuffer와 StringBuilder는 문자열 수정이 자유롭습니다.
  • StringBuilder의 경우 동기화를 지원하지 않아 싱글 스레드 환경에 적합합니다.
  • StringBuffer의 경우 동기화를 지원하여 멀티스레드 환경에 적합합니다.

접근 제한자의 종류

  • private : 해당 클래스에서만 접근 가능.
  • (default) : 해당 패키지에서만 접근 가능.
  • protected : 해당 패키지내에서 접근 가능. 또는 다른 패키지에서 상속받아 자식 클래스에서 접근 가능.
  • public : 접근 제한 없음.

클래스 멤버 변수 초기화 순서

  • static 변수 선언부 : 클래스 로드 될 때 초기화 됩니다.
  • 필드 변수 선언부 : 객체 생성 시 생성자 block보다 먼저 초기화 됩니다.
  • 생성자 block : 객체 생성 시 가장 마지막에 초기화 됩니다.

static 키워드란?

  • static 키워드를 사용한 변수나 메서드는 클래스 로드될 때 생성되어, 로딩이 완료하면 곧바로 사용 가능하다.
  • 모든 객체가 메모리를 공유한다는 특징이 있고, 메소드 영역에 있기 때문에 GC의 관리를 받지 않습니다.
  • 보통 자주 변하지 않는 값이나 공통으로 사용되는 값에 사용됩니다. '전역변수'와 같은 개념으로 접근할 수 있습니다.

Inner Class의 장점

  • 서로 관련있는 클래스를 논리적으로 묶어서 표현할 수 있으므로 응집도를 높일 수 있다.
  • 외부에서 내부 클래스에 접근하지 못하도록 캡슐화 하여, 보안을 높일 수 있다.

Inner Class를 static으로 선언해야 하는 이유

  • 내부 클래스는 암묵적으로 외부클래스 인스턴스를 참조합니다.
  • 외부 클래스가 필요없어질 경우 GC가 이를 제거해야하지만, 내부클래스의 참조로 인해 제거가 되지 않을 수 있습니다.
  • 때문에 static으로 선언하여 외부 클래스와 독립적으로 만드는 것입니다.

리플렉션(Reflection)이란?

  • 리플렉션이란 구체적인 클래스의 타입을 알지 못해도 해당 클래스의 변수, 메소드 등에 접근할 수 있도록 하는 것을 말합니다.
  • 제네릭과 달리 타입안정성을 보장하지 않습니다.
  • 스프링 프레임워크의 어노테이션이 리플렉션을 활용한 기능이라고 알고 있습니다.

Error와 Exception의 차이 설명

  • Error는 실행 중 일어날 수 있는 치명적인 오류를 말합니다. Error가 발생하게되면 프로그램이 비정상적으로 종료됩니다.
  • Exception은 Error에 비해 경미한 오류를 말합니다. 예외 처리를 통해 비정상적 종료를 예방할 수 있습니다.

CheckedException과 UncheckedException

  • CheckedException은 실행 전 예측 가능한 예외들을 말하며, 반드시 예외처리를 수행해야 합니다.
  • UncheckedException의 경우 실행 후에야 알 수 있는 예외들을 말합니다.

Optional API에 대한 설명

  • 개발 시 가장 자주 발생하는 오류는 NullPointException입니다.
  • 하지만 매번 null을 검증하는 코드를 작성해야 하는 경우, 코드가 복잡해지게 됩니다.
  • 이를 보완하고자 Java8부터 등장한 개념입니다.
  • Optional<T>를 통해 null을 사용하지 않고도 빈 값을 표현할 수 있게 하며, null로인한 예외가 발생하지 않게 합니다.

Collection 프레임워크 설명

  • 다수의 데이터를 관리할 수 있는 프레임워크입니다.
  • List, Set, Map, Stack, Queue 등 다양한 자료구조를 지원합니다.

List, Set, Map, Stack, Queue의 특징

  • List: 데이터가 순서를 지키며 나열된 구조입니다. Array와 다르게 크기를 유연하게 조정할 수 있스빈다.
  • Set: 순서와 상관없이 중복을 허용하지 않으며 데이터를 저장합니다.
  • Map: key와 value 쌍으로 이루어진 데이터 구조입니다. key는 순서를 보장하지 않으며 중복을 허용하지 않습니다.
  • Stack: LIFO를 따르는 데이터 구조입니다.
  • Queue: FIFO를 따르는 데이터 구조입니다.

Set과 Map의 타입이 객체를 받을 때 중복 검사 방법

  • Set과 Map의 구현체는 HashSet과 HashMap이 있습니다.
  • 이들이 객체를 받을 때에는 equals를 재정의 하여 내부 데이터가 논리적으로 같은 값인지를 구별해야 합니다.
  • 뿐만 아니라, hash코드로도 값을 비교하기 때문에 hashcode도 함께 재정의해야합니다.

제네릭이란? 왜 사용하는가?

  • 제네릭이란 데이터 타입을 포괄적인 범위로 지정하는 것을 의미합니다.
  • 데이터 범위를 넓히며 타입 안정성을 보장하고, 유연한 프로그래밍이 가능합니다.

final, finally, finalize의 차이 설명

  • final: 불변객체를 만들기 위한 키워드입니다.
  • finally: try-catch문에서 예외 발생 여부와 관계없이 실행되는 블록을 정의할 때 사용합니다.
  • finalize: GC에 의해 사용되는 메소드로 알고 있습니다. 사용하면 안되는 메소드입니다.

직렬화란?

  • 시스템 내부에서 사용되는 객체나 데이터들을 외부에서도 사용할 수 있도록 byte로 변환하는 과정을 말합니다.
  • 반대로 byte데이터를 객체나 데이터로 변환하는 과정은 '역직렬화'라고 합니다.
  • 직렬화 수행 시 SerialVersionUID를 통해 버전을 관리합니다.
728x90
반응형

'Language > Java' 카테고리의 다른 글

equals와 hashCode 오버라이딩  (0) 2025.03.11
[JSP] JSP(JavaServer Pages)의 정의와 기본 구성 요소  (1) 2025.01.02
record 클래스 (Java 14)  (0) 2024.12.13
직렬화(Serialization)  (0) 2024.12.12
동기화(synchronization)와 락(Lock)  (1) 2024.12.11
'Language/Java' 카테고리의 다른 글
  • equals와 hashCode 오버라이딩
  • [JSP] JSP(JavaServer Pages)의 정의와 기본 구성 요소
  • record 클래스 (Java 14)
  • 직렬화(Serialization)
settong
settong
    250x250
  • settong
    개 발 자 국
    settong
  • 전체
    오늘
    어제
    • 전체보기 (202)
      • Computer Science (50)
        • Network (7)
        • Operating System (18)
        • Data Structure (9)
        • Database (11)
        • Algorithm (5)
      • Language (17)
        • Java (17)
        • Javascript (0)
        • Python (0)
      • Devops (20)
        • AWS (0)
        • Naver Cloud (16)
        • CICD (3)
        • 웹 서버 관리 (1)
      • Front (0)
        • React (0)
      • Backend (5)
        • Spring (5)
      • 코딩 테스트 정복기 (110)
        • 백준 (51)
        • 프로그래머스 (53)
        • 기타 (6)
      • etc (0)
      • 경제 상식 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    CI/CD
    해시
    DFS
    BFS
    Spring Boot
    백트래킹
    백준
    lcs
    완전탐색
    다익스트라
    분할정복
    ncp200
    github actions
    Network
    ncp
    프로그래머스
    ncp202
    다이나믹프로그래밍
    집합
    벨만포드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
settong
Java 기술 면접 대비
상단으로

티스토리툴바