면접 준비

[면접준비] 신입 개발자 면접 예상 질문 정리 - JAVA

다아빈 2025. 4. 17. 19:57
728x90
반응형

면접 스터디를 준비하며, 공부한 내용을 정리하는 글입니다.

면접 예상 질문과 그에 대한 답변을 정리할 것이며, 스터디가 끝날 때까지 예상 질문을 꾸준히 추가될 예정입니다!

 

혹시 틀리거나 보완할 부분이 있다면 친절히 알려주세요.

감사합니다!


자바의 특징에 대해서 설명해주세요.

더보기

자바는 객체지향 프로그래밍 언어 중의 하나로, 객체지향개념의 특징인 상속, 캡슐화, 다형성이 잘 적용되어 있습니다.

 

  • 자바는 JVM 위에서 동작하기 때문에 운영체제에 독립적입니다.
  • Garbage Collection기능이 있어 자동적으로 메모리를 관리해줍니다.
  • 멀티쓰레드를 지원합니다.
  • 동적 로딩을 지원합니다.
JVM이란 자바 가상 머신으로 자바 코드를 각 운영체제에 맞게 해석해주는 역할을 합니다. 따라서 자바는 운영체제에 독립적이지만 JVM은 운영체제에 영향을 받습니다.

 

Garbage Collection은 더 이상 참조되지 않는 객체를 JVM이 자동으로 제거해주는 메모리 관리 기능입니다. 자바에서 객체를 생성하면 힙영역에 올라가는데, 이 객체가 더 이상 참조되지 않는다면 JVM은 쓸모없는 객체라고 스스로 판단하여 Garbage Collector가 찾아서 제거해줍니다.
쓰레드란 프로세스 안에서 실제로 작업이 실행되는 단위를 말합니다. 단일 쓰레드는 순차적으로 한 작업만 처리합니다. 따라서 하나의 작업이 끝나기 전까지 다른작업을 처리하지 못한다는 단점이 있습니다. 반면에 멀티 쓰레드는 여러 작업을 병렬로 처리할 수 있어 프로그램의 효율성을 높일 수 있습니다. 하지만 동기화 문제, 공유 자원 충돌 등의 상황이 발생할 수 있다는 단점이 있습니다.
동적 로딩이란 런타임 시점에 필요한 클래스나 자원을 동적으로 불러오는 것을 말합니다. 

 

자바의 컴파일 과정

더보기
  1. 개발자는 .java 파일을 작성합니다.
  2. 자바 컴파일러는 javac라는 명령어를 사용하여 컴파일을 진행합니다. 이때, 소스 파일은 바이트 코드로 변환되는데, 이 바이트코드는 JVM이 이해할 수 있는 코드입니다.
  3. 컴파일된 바이트코드는 JVM의 클래스 로더를 통해 JVM 메모리에 올라갑니다.
  4. 바이트코드는 JVM의 실행 엔진에 의해 기계어로 변환됩니다.

 

객체지향언어의 특징

더보기

객체지향언어의 특징은 추상화, 상속, 캡슐화, 다형성이 있습니다.

  • 추상화: 체들의 공통된 특성을 뽑아내는 것을 말합니다.
  • 상속: 기존에 있던 클래스를 재사용하여 새로운 클래스를 작성하는 것입니다.
  • 캡슐화: 객체의 속성(data fields)과 행위(methods)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추는 것입니다.
  • 다형성: 하나의 메서드나 객체가 다양한 방식으로 동작할 수 있는 성질을 말합니다. 대표적으로 오버라이딩, 오버로딩이 있습니다.

 

좋은 객체지향 설계의 5가지 원칙(SOLID)

더보기

좋은 객체지향 설계 원칙으로는 단일 책임 원칙, 개방-폐쇄 원칙, 리스코프 치환 원칙, 인터페이스 분리 원칙, 의존 역전 원칙으로 구성되어 있습니다.

  • SRP (단일 책임 원칙): 하나의 클래스는 하나의 책임만 가져야 한다.
  • OCP (개방-폐쇄의 원칙): 확장에는 열려 있고, 변경에는 닫혀 있어야 한다.
  • LSP (리스코프 치환 원칙): 자식 클래스는 언제나 부모 클래스를 대체할 수 있어야 한다.
  • ISP (인터페이스 분리 원칙): 일반적인(기능이 여러 개인) 하나의 인터페이스보단 여러 개의 구체적인 인터페이스로 분리하는 것이 좋다.
  • DIP (의존 역전 원칙): 구체적인 클래스에 직접 참조하는 것보단 상위 클래스를 참조해야 한다.

 

오버로딩(overloading)과 오버라이딩(overriding)이란?

더보기
  • 오버로딩: 하나의 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 말합니다. 자바에서는 매개변수의 타입이나 개수를 다르게 하여 오버로딩을 진행합니다.
  • 오버라이딩: 부모 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 말합니다. 자식 클래스에서 오버라이딩할 때는 매개변수와 반환타입, 메서드 이름이 같아야 합니다.

 

생성자란?

더보기

생성자는 클래스 이름과 같은 특수한 메서드로, 객체를 생성할 때 자동으로 호출됩니다. 별도로 생성자를 정의하지 않으면, 컴파일러가 매개변수가 없는 기본 생성자를 자동으로 만들어줍니다.

 

상속의 정의와 장점

더보기

상속이란 기존에 있던 클래스를 재사용하여 새로운 클래스를 작성하는 것을 말합니다.

상속을 통해 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있으며, 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이합니다. 이러한 특징으로 코드의 재사용성을 높이고 중복 코드를 제거하여 프로그램의 생산성과 유지보수에 크게 기여합니다.

 

접근 제어자 정의와 종류

더보기

접근 제어자는 멤버 또는 클래스에 사용되어, 외부에서 접근하는 것을 제한하는 역할을 합니다. 접근 제어자의 종류로는 private, default, protected, public 이 있습니다.

  • private: private로 선언된 멤버는 외부에서 접근할 수 없으며, 같은 클래스 내에서만 접근이 가능합니다.
  • default: 같은 패키지 내에서만 접근이 가능하며, default는 멤버에 따로 붙이지 않습니다.
  • protected: protected로 선언된 멤버는 같은 패키지 내에서, 그리고 다른 패키지의 자식 클래스에서 접근이 가능합니다.
  • public: 접근 제한이 전혀 없습니다.

 

final, finally, finalize 차이점

더보기
  • final: final은 '변경될 수 없는'을 의미하며, 클래스, 메서드, 변수에서 사용할 수 있습니다.
    변수에서 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩이 불가능해지고, 클래스에서 사용되면 상속을 금지하여 더 이상 클래스를 확장할 수 없습니다.
  • finally: try-catch문과 함께 사용되며, 예외의 발생여부와 상관없이 항상 실행되어야 하는 코드를 포함하는 블록입니다.
  • finalize: 객체가 메모리에서 제거되기 되기 직전에 JVM이 자동으로 호출하는 Object 클래스의 메서드입니다. 하지만 finalize()는 호출 시점을 예측할 수 없고, 성능 저하를 유발할 수 있어 사용이 권장되지 않습니다.

 

다형성이란?

더보기

다형성이란 하나의 객체가 여러 가지 형태로 동작할 수 있는 객체지향의 성질을 의미합니다. 이를 통해 부모 클래스 타입의 참조 변수로 자식 클래스 객체를 참조할 수 있으며, 메서드를 호출할 때 실제 객체 타입에 따라 오버라이딩된 메서드가 동적으로 실행되는 구조를 만들 수 있습니다.

다형성은 크게 정적 다형성과 동적 다형성으로 나눌 수 있는데, 정적 다형성의 대표적인 예로는 오버로딩, 동적 다형성의 대표적인 예로는 오버라이딩이 있습니다. 이러한 다형성은 객체 간의 결합도를 낮추고, 코드의 유연성과 확장성을 높일 수 있어 유지보수에 유리한 구조를 만들 수 있다는 장점이 있습니다.

 

❓추상클래스와 인터페이스

더보기

추상클래스란 하나 이상의 추상 메서드를 포함하거나 abstract 키워드를 가진 클래스를 말합니다. 공통된 필드나 메서드를 묶어서 추상화시키고, 기능 확장을 위해 사용합니다.

반면 인터페이스는 어떤 동작이 가능한지를 정의하는 일종의 ‘기능 명세서’ 역할을 하며, 내부의 모든 메서드는 추상 메서드로 구성되어 있어서 구현체에서 반드시 오버라이딩해야 합니다.

둘 다 new 연산자로 인스턴스를 생성할 수 없으며, 사용하기 위해서는 하위 클래스에서 확장 및 구현을 해야한다는 공통점이 있습니다. 차이점으로는 추상 클래스는 다중 상속이 불가능하지만, 인터페이스는 다중 상속이 가능합니다.

 

❓ new String과 ""(리터럴)의 차이점

더보기

자바에서는 문자열을 생성할 때 리터럴("")로 생성하는 방식과 new 키워드로 생성하는 방식이 있습니다.

리터럴로 생성한 문자열은 문자열 상수풀에 저장되어, 동일한 문자열이 여러 번 등장해도 JVM이 같은 객체를 재사용하여 메모리 사용이 효율적입니다.

반면에 new 키워드로 생성된 문자열은 힙 메모리에 새로운 String 객체를 따로 생성합니다. 따라서 비교연산자를 사용하게 되면 만약 문자열이 같더라도 주소값이 다르기 때문에 false가 나올 수 있습니다.

그렇기 때문에 문자열을 비교할 때는 비교연산자를 사용하는 것보다는  equals()사용하는 것이 좋습니다.

 

제네릭스(Generics)란?

더보기

제네릭스는 클래스나 메서드를 정의할 때 사용할 데이터 타입을 컴파일 시점에 정할 수 있는 기능입니다 자바에서는 타입 변수를 사용하여 타입을 일반화하며, 제네릭스를 통해 코드의 재사용성을 높이고 타입의 안정성도 확보할 수 있습니다. 또한 불필요한 형변환을 줄이고 코드의 유연성을 향상시킨다는 장점도 있습니다.

 

열거형이란?

더보기

열거형이란 서로 관련된 상수들을 하나의 타입으로 묶어 표현하는 특별한 클래스입니다. 자바에서는 enum 키워드를 사용해 열거형을 정의하며, 일반 클래스처럼 필드와 메서드를 가질 수 있습니다. 열거형은 타입 안정성을 제공하기 때문에 코드의 가독성과 안정성이 높아진다는 장점이 있습니다.

 

애너테이션이란?

더보기

애너테이션은 코드의 메타데이터를 추가해 컴파일러나 프레임워크가 특정 동작을 하도록 알려주는 기능입니다. 클래스, 메서드, 변수 등에 붙여 부가적인 의미를 부여하거나 자동 처리를 유도할 수 있습니다.

728x90
반응형