본문 바로가기
면접 준비

기술면접 질문 정리 - 자바

by MoonGa 2024. 4. 17.

자바의 특징?

  • 자바는 객체지향프로그래밍 언어로  캡슐화, 상속, 다형성의 특징을 가지고 있습니다. 
  • 장점은 JVM위에서 동작하기에 os에 독립적이고 가비지컬렉터를 통한 자동 메모리 관리가 가능합니다.
  • 단점은 JVM위에서 동작하기에 실행속도가 조금 느리고, 다중 상속이나 타입에 엄격하며 제약이 많습니다.

JVM의  역할?

  • 스택기반으로 동작하며, 자바바이트코드를 os에 맞게 해석해주는 역할을 합니다.

자바의 컴파일 과정? 

  • 소스파일(.java)을 생성하고 컴파일러(javac)로 바이트코드를 생성합니다.
  • 클래스 로더를 통해 JVM 메모리 내로 로드하고, 실행엔진을(java.exe) 통해 기계어로 해석됩니다.

자바에서 제공하는 원시타입? 몇바이트 차지?

  • 정수형에는 byte, short, int, long이 있고 실수형에는 float, doble 문자형 char 논리형 boolean이 있습니다.
  • 각각의 타입은 1,2,4,8(정수),  4,8(실수),  2(문자형),  1(논리형) 

오버라이딩과 오버로딩의 차이점?

  • 오버라이딩은 상위 클래스에서 정의한 메소드를 하위클래스에서 재정의하는 것을 뜻하고
  • 오버로딩은 매개변수의 타입과 갯수에 따라 같은 이름의 메소드를 여러개 정의하는 것을 뜻합니다.

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

  • 프로그램에 필요한 객체를 파악하고, 상태(변수)와 행위(함수)를 가진 객체를 만들고, 역할이 무엇인지를 정의하여, 객체들간의 상호작용을 통해 프로그램을 만드는 것을 말합니다.
  • 기능이 아닌 객체 중심으로, 누가 어떤 일을 할 것인가가 핵심입니다.
  • 특징으로는 캡슐화, 다형성, 추상화, 상속등이 있고, 모듈 재사용으로 확장 및 유지보수가 용이합니다.

객체지향의 특징 설명?

  • 캡슐화? 클래스 안에 관련 데이터와 함수를 하나의 캡슐로 만들어 외부로부터 보호하는 것을 말합니다. 이때 캡슐화된 멤버를 숨길것인지 노출할것인지를 결정하기 위해 접근 제어자를 사용합니다.
  • 다형성? 하나의 타입을 여러 객체에 대입할 수 있는 성질을 가지고 있습니다.
  • 추상화? 객체의 공통적인 특징을 하나의 개념으로 다루는 것을 의미합니다.
  • 상속? 부모클래스와 자식클래스가 있으면, 부모클래스의 필드와 메소드를 자식클래스에서 사용할 수 있는 것을 뜻합니다.

접근제어자의 종류?

  • public, protected, private, default
  • private은 해당 클래스 내에서만 접근이 가능하고, default는 해당 패키지, protected는 해당 패키지와 자식클래스까지 접근이 가능하고, public은 전체 영역에서 접근이 가능합니다.

try-with-resurces?

  • try-catch-finally의 문제점을 보완하기 위해 나온 개념입니다.
    • fianlly블록은 옵션으로 생략 가능하며, try와 catch에서 return을 처리해도 항상 실행됨.
    • 다중 catch 블록 주의점: 예외 클래스가 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야함.
  • try안에 자원 객체를 전달하면, try블록이 끝나고 자동으로 자원을 해제해줍니다.
  • 따로 finally 구문이나 모든 catch 구문에 종료 처리를 하지 않아도 되는 장점이 있습니다.
    • try안에서 예외가 발생하면 우선 close()로 리소스를 닫고, catch블록을 실행합니다.

싱글톤 패턴?

  • 단 하나의 인스턴스를 생성해서 사용하는 디자인 패턴입니다. 
  • 인스턴스가 1개만 존재해야 한다는 것을 보장하고 싶은 경우와 동일한 인스턴스를 자주 생성해야 하는 경우에 메모리 낭비 방지를 위해 주로 사용합니다.

가비지 컬렉션이란?

  • JVM의 메모리 관리 기법 중 하나로, 힙 영역에서 사용하지 않는 객체들을 제거하여 메모리를 관리해주는 기법입니다.

객체지향의 설계원칙?

  • srp(단일 책임의 원칙): 한 클래스는 하나의 책임만 가져야 합니다.
  • ocp(개방폐쇄의 원칙): 확장에는 열려있고, 수정에는 닫혀있어야 합니다.
  • LIP(리스코프 치환 원칙): 하위 타입은 항상 상위 타입을 대체할 수 있어야 합니다.
  • DIP(의존관계 역전 원칙): 상위 모듈은 하위 모듈에 의존하면 안되고, 추상화는 세부사항에 의존해서는 안됩니다. DIP원칙을 따르는 가장 인기 있는 방법은 의존성 주입(DI)입니다.
  • ISP(인터페이스 분리 원칙): 인터페이스내에 메소드는 최소한 일수록 좋습니다. 즉, 하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스가 좋습니다.

자바의 메모리 구조?

  • 메소드, 스택, 힙영역으로 구분되고, 데이터 타입에 따라 할당됩니다.
  • 메소드영역에는 전역변수와 static변수를 저장하며, 프로그램의 시작부터 종료까지 남아있습니다.
  • 스택영역에는 지역변수와 매개변수값을 저장하며, 메소드 호출 시, 메모리에 할당되고 종료되면 메모리가 해제됩니다. LIFO 구조를 갖고, 변수에 새로운 데이터가 할당되면 이전 데이터는 지워집니다.
  • 영역에는 new 키워드로 생성되는 객체(인스턴스), 배열 등이 저장되며, 가비지 컬렉터에 의해 메모리가 관리됩니다.

static이란?

  • static키워드를 사용한 변수나 메소드는 클래스가 메모리에 올라갈때, 자동으로 생성되며 바로 사용할 수 있습니다. 즉, 인스턴스 생성 없이 바로 사용 가능합니다.
  • 모든 객체가 메모리를 공유하고, GC관리 밖에 있기에 프로그램이 종료될때까지 값이 존재합니다.

java의 main메소드가 static인 이유?

  • static 멤버는 프로그램 시작 시, 클래스 로더에 의해 메모리에 로드되어 인스턴스를 생성하지 않아도 호출이 가능하기 때문입니다.

static을 사용하는 이유?

  • static은 자주 변하지 않는 값이나 공통으로 사용되는 값 접근에 있어서, 매번 메모리에 값을 읽어들이는 것보다 전역변수와 같은 개념으로 접근하는 것이 효율을 높일 수 있기 때문입니다.
  • 인스턴스 생성 없이 사용 가능하기에, 공통으로 사용되는 데이터들을 관리할 때 사용합니다.

final, finally, finalize의 차이점?

  • final 키워드는 변수, 메서드, 클래스가 변경 불가능하도록 만듭니다.
    • final 변수: 한번 초기화되면 변경 불가
    • final 메서드: 오버라이딩 불가
    • final 클래스: 상속 불가
  • finally 키워드는 try catch 블록 뒤에서 항상 실행될 코드 블록을 정의하기 위해 사용합니다.
  • finalize 메서드는 가비지 컬렉터가 더이상의 참조가 존재하지 않는 객체를 메모리에서 삭제하겠다고 결정하는 순간 호출됩니다.

클래스와 객체란?

  • 클래스는 객체를 만들어내기 위한 틀이고, 객체를 생성하는데 사용합니다.
  • 객체는 클래스를 기반으로 생성되며, 고유한 이름과 상태, 행동을 갖습니다.
  • 상태는 필드, 행동은 메소드라고 표현합니다.
  • 객체에 메모리가 할당되어 실제로 활용되는 실체는 인스턴스라고 부릅니다.

생성자란?

  • 클래스로부터 객체를 생성할때 호출되어, 객체의 초기화를 담당합니다.

wrapper class란? Boxing과 UnBoxing이란?

  • 기본 자료형에 대한 객체 표현을 뜻합니다.
  • Boxing은 기본자료형을 wrapper class로 변환하는 것을 뜻하고
  • UnBoxing은 wrapper class를 기본 자료형으로 변환하는 것을 뜻합니다.

synchronized란?

  • 멀티쓰레드환경에서 한 자원에 대해서 한 프로세스만이 접근가능하도록 하는 것입니다.
  • 데이터의 thread-safe를 위해 자바에서 synchronized키워드를 제공해 멀티쓰레드환경에서 쓰레드간 동기화를 시켜 데이터의 thread-safe를 보장합니다.
  • 변수와 메소드에 사용해서 동기화할 수 있고, 해당 키워드를 남발하게 되면 프로그램의 성능저하를 일으킬 수 있습니다.

내부 클래스(inner class)의 장점?

  • 내부 클래스에서 외부 클래스의 멤버에 접근할 수 있다.
  • 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 캡슐화를 증가시키고 코드의 복잡성을 낮출 수 있다.
  • 외부에서 내부 클래스에 접근할 수 없으므로, 코드의 보안성을 높일 수 있다.

reflection이란?

  • 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들에 접근할 수 있게 해주는 자바 API입니다.

Optional API란?

  • nullpointerException을 방지하기 위해 null 여부 검사를 하는데, 변수가 많을 수록 코드가 번거롭습니다.
  • 이에 optional<T>를 사용하여 Null로 인한 예외가 발생하지 않도록 도와줍니다.

컬렉션 프레임워크란?

  • 다수의 데이터를 효과적으로 쉽게 관리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 뜻합니다.
  • List, set, map 인터페이스를 기준으로 여러 구현체가 존재하고, 이에 더해 stack, queue인터페이스도 존재합니다.

제네릭이란? 왜사용?

  • 클래스 내부에서 타입을 지정하는 것이 아닌, 외부에서 사용자에 의해 지정되는 것을 의미합니다.
  • 이를 사용함으로써 잘못된 타입이 사용될 있는 문제를 컴파일 시 체크하여 에러를 사전에 방지할 있습니다.

자바에서 ==와 equals의 차이는?

  • ==는 참조 비교로, 두 객체가 같은 메모리 공간을 가리키는지 확인하는 연산자로 주소값을 비교합니다.
  • equals는 두 객체의 값이 같은지 비교합니다.

자바의 hashcode()란?

  • 두 객체가 동일한 객체인지 비교할때 사용하고, 힙영역에 저장된 객체의 메모리 주소를 반환합니다.

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

  • 추상 클래스는 클래스 내 추상 메소드가 하나 이상 포함되어 있는 경우를 말하고, 인터페이스는 모든 메소드가 추상 메소드로 이루어져 있는 것을 말합니다.
  • 추상클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할때 사용합니다. 단일 상속만 가능합니다.
  • 인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용합니다. 다중 상속이 가능합니다.
  • 추상클래스는 추상메소드를 자식 클래스가 구체화하여 그 기능을 확장하는데 목적을 가지고 있고
  • 인터페이스는 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 구현해야하는 경우에 사용합니다.

원시 타입과 참조 타입의 차이점?

  • 자바에서 8개만 존재하는 타입이고, 그 외에 모든 것이 참조 타입입니다.
  • 원시 타입은 기본값을 가지지만, 참조타입은 null 포인터를 가집니다.

자바에서 직렬화, 역직렬화란?

  • 직렬화는 객체를 바이트코드로 변환하여 전송하는 것을 말하고
  • 역직렬화는 직렬화된 바이트코드를 다시 객체로 변환하는 과정입니다.