- 주 언어가 뭔지, 왜 자바를 선택했는지, 다른 언어보다 좋은 이유가 무엇인지 말해주세요.
- 자바를 선택한 이유는, 객체 지향 언어로서 코드의 재사용성과 유지보수성이 높기 때문입니다
- 객체 지향 특성 덕분에 프로젝트에서 코드를 모듈화하고 재사용할 수 있어, 개발 효율성을 크게 향상시킬 수 있었습니다. 또한, 유지보수가 용이해 프로젝트의 버그를 더 빠르고 효과적으로 수정할 수 있었습니다
- Java의 특징을 설명해주세요.
- 자바는 객체지향 프로그래밍 언어입니다.
- JVM에서 실행되므로, 다양한 플랫폼에서 동일한 코드가 실행될 수 있습니다.
- 가비지 컬렉션을 통해 자동으로 메모리를 관리합니다.
- Java의 컴파일 과정에 대해 설명해주세요.
- 자바의 컴파일 과정은 소스 코드를
.java
파일에서 바이트코드가 포함된 .class
파일로 변환하는 단계로 이루어집니다. 이 바이트코드는 JVM에서 실행되며, 플랫폼에 독립적으로 동작할 수 있게 합니다.
- JVM의 역할에 대해 설명해주세요.
- JVM이란 자바 가상 머신입니다.
- JVM은 메모리를 Heap과 Stack으로 나누어 관리합니다. Garbage Collection은 Heap 영역에서 사용되지 않는 객체를 자동으로 정리해 메모리 누수를 방지합니다.
- 스택 기반으로 동작하며, 자바 바이트 코드를 OS에 맞게 해석해주는 역할을 하고, 가비지컬렉션을 통해서 자동적인 메모리 관리를 해줍니다.
- 객체지향의 설계원칙(SOLID)에 대해서 설명해주세요.
- 단일 책임 원칙: 한 클래스는 하나의 책임만 가져야 합니다.
- 개방-폐쇄 원칙: 확장에는 열려있고, 수정에는 닫혀있어야 합니다.
- 리스코프 치환 원칙: 하위 타입은 항상 상위 타입을 대체할 수 있어야 합니다. 하위 클래스는 상위 클래스의 동작을 변경하지 않고 확장해야 합니다.
- 인터페이스 분리 원칙: 인터페이스는 가능한 최소한의 메소드만 포함해야 합니다.
- 의존관계 역전 원칙: 추상화(인터페이스나 추상 클래스)에 의존하도록 설계하되, 구체적인 클래스(구체적인 구현)에 직접 의존하지 말아야 한다.
- OOP(객체 지향 프로그래밍)이란?
- 데이터와 그 데이터를 처리하는 메소드를 객체로 묶어, 코드의 재사용성과 유지보수성을 높이는 프로그래밍 패러다임입니다.
- OOP의 4가지 원칙에 대해서 설명해주세요.
- 캡슐화: 데이터와 메소드를 하나의 객체로 묶어 외부에서 접근을 제한하고, 내부 구현을 숨깁니다.
- 상속: 기존 클래스의 속성과 메소드를 새로운 클래스가 물려받아 재사용하고, 계층 구조를 형성합니다.
- 다형성: 동일한 인터페이스를 통해 다양한 구현체를 사용할 수 있어 코드의 유연성을 높입니다.
- 추상화: 복잡한 시스템을 단순화하여 핵심 개념만을 모델링하고, 세부 구현을 숨깁니다.
- 객체지향 프로그래밍의 장점은?
- 상속이 가능해 코드의 재사용성이 높고, 객체 단위로 코드가 나눠져 작성되기 때문에 디버깅이 쉽고 유지보수가 용이합니다.
- 객체지향 vs 절차지향
- 객체지향 프로그래밍은 데이터와 기능을 객체로 묶어 코드의 재사용성과 유지보수성을 높이는 반면,
- 절차지향 프로그래밍은 데이터를 처리하기 위한 함수 중심으로 프로그램을 구조화하여 순차적으로 실행합니다.
- 오버라이딩과 오버로딩에 대해 설명해주세요.
- 오버라이딩은 상위 클래스의 메소드를 하위 클래스가 재정의하는 것을 말합니다.
- 오버로딩은 같은 이름의 메소드를 매개변수의 종류나 개수에 따라 여러 개 정의하는 것을 말합니다.
- 불변 객체가 무엇인지 설명하고 대표적인 Java의 예시를 설명해주세요.
- 생성 후 상태가 변하지 않는 객체로, 대표적인 예로 String 클래스가 있습니다.
- 추상 클래스와 인터페이스를 설명하고, 차이에 대해 설명해주세요. Reference
- 추상 클래스는 일부 메소드가 구현된 클래스이며, 공통 기능을 제공하면서 서브 클래스에서 추가 구현을 요구합니다.
- 자전거는 기본적으로 페달, 바퀴, 핸들이 있는데, 너는 자전거에 벨이나 바구니를 추가할 수 있어
- 인터페이스는 모든 메소드가 추상 메소드로만 구성된 구조로, 클래스가 구현해야 할 동작을 정의합니다.
- 모든 게 설계도처럼 비어있어서, 너가 모든 동작을 직접 만들어야 해라고 요구하는 구조
- 추상 클래스는 추상 메서드 말고 변수, 일반 메서드 등이 작성이 가능하지만, 인터페이스는 상수, 추상 메서드만 작성이 가능합니다.
- 인터페이스는 다중 상속이 가능하고, 추상 클래스는 단일 상속만 가능합니다.
- 인터페이스 : implements 라는 키워드처럼 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현하는 느낌
- 추상 클래스 : extends 키워드를 사용해서 자신의 기능들을 하위 클래스로 확장 시키는 느낌
- 가비지 컬렉션에 대해 설명해주세요.
- 자바의 메모리 영역에 대해 설명해주세요. Reference
- 자바의 메모리 공간은 크게 메소드, 스택, 힙 영역으로 구분됩니다.
- 메소드 영역은 프로그램이 시작될 때부터 종료될 때까지 메모리에 존재하는 영역으로, 클래스에 대한 정보와 전역변수(static 변수)를 저장합니다.
- 스택 영역은 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리에서 사라집니다.
- 힙 영역은 런타임시 동적으로 생성되는 객체와 배열을 저장하는 공간으로, 가비지 컬렉션에 의해 메모리가 관리됩니다.
- 각 메모리 영역이 할당되는 시점은 언제인가요?
- 메소드 영역은 프로그램이 시작될 때, 클래스가 로딩될 때 생성
- 스택 영역은 각 메소드가 호출될 때 할당되며, 메소드가 종료되면 해제됩니다.
- 힙 영역은 new 키워드를 사용하여 객체나 배열을 생성할 때 할당됩니다. (런타임시 할당)
- 프로세스와 스레드의 차이에 대해 설명해주세요. Reference
- 프로세스는 실행 중인 프로그램의 인스턴스이며 독립적인 메모리 공간을 갖고, 스레드는 프로세스 내에서 실행되는 작은 실행 단위로 프로세스의 메모리를 공유합니다.
- 프로세스는 각각 별도의 자원을 사용하지만, 스레드는 같은 프로세스 내에서 자원(코드,데이터,힙)을 공유합니다.
- 클래스와 객체에 대해 설명해주세요.
- 클래스는 객체를 만들기 위한 설계도로, 코드에서 데이터와 기능을 정의합니다.
- 객체는 클래스 설계도를 바탕으로 실제로 생성된 실체로, 메모리에서 데이터와 기능을 가진 인스턴스입니다.
class Car {
Car(String color, String model) {
this.color = color;
this.model = model;
}
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car("Red", "Toyota");
}
}
- 생성자에 대해 설명해주세요.
- 생성자는 객체가 생성될 때 자동으로 호출되어 객체의 초기화 작업을 수행하는 특수한 메소드입니다.
- 생성자는 클래스와 같은 이름의 메서드, 객체가 생성될 때 호출되는 메서드입니다.
- 주로 초기화 작업에서 사용합니다.
- 기본 생성자는 작성하지 않아도 기본적으로 만들어지고, 매개 변수를 다르게 하여 매개 변수가 다른 생성자를 생성할 수 있습니다.
- Wrapper Class란 무엇이며, Boxing과 UnBoxing은 무엇인지 설명해주세요.
- Wrapper Class는 기본 자료형을 객체로 다룰 수 있게 해주는 클래스이며, Boxing은 기본 자료형을 Wrapper Class 객체로 변환하는 과정이고, UnBoxing은 Wrapper Class 객체를 기본 자료형으로 변환하는 과정입니다.
- Synchronized에 대해 아는대로 말해주세요.
- 여러 개의 쓰레드가 한 개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 쓰레드를 제외하고 나머지 쓰레드들은 데이터에 접근할 수 없게 막는 개념입니다.
- 자바에서 스레드 간의 동기화를 지원하는 키워드로, 멀티스레드 환경에서 데이터의 일관성을 유지하기 위해 특정 코드 블록이나 메소드에 대한 접근을 동기화하여 여러 스레드가 동시에 실행되지 않도록 합니다.
- new String()과 리터럴("")의 차이에 대해 설명해주세요.
- new String()은 힙 영역에 새 객체를 생성하지만, 리터럴""은 문자열 풀에서 이미 존재하는 문자열 객체를 재사용합니다.
- String, StringBuffer, StringBuilder의 차이를 설명해주세요.
- String: 한 번 생성되면 변경할 수 없고, 문자열을 수정하면 새로운 String 객체가 생성됩니다.
- StringBuffer: 생성 후에도 문자열을 변경할 수 있고, 여러 스레드에서 동시에 사용해도 안전합니다.
- StringBuilder: 문자열을 변경할 수 있고, 스레드 안전성을 제공하지 않습니다.
- String 객체가 불변인 이유에 대해서 설명해주세요.
- String 객체는 보안성, 스레드 안전성을 위해서 불변으로 설계되었습니다.
- Call by Reference와 Call by Value의 차이가 무엇인가요?
- Call by Value는 값의 복사본을 전달하여 함수 내부의 변경이 원본에 영향을 미치지 않습니다.
- Call by Reference는 변수의 주소를 전달하여 함수 내부의 변경이 원본에 영향을 미칩니다.
- 기본 자료형 (Primitive Types)
public class Test {
public static void main(String[] args) {
int x = 5;
changeValue(x);
System.out.println("After changeValue: " + x);
}
public static void changeValue(int num) {
num = 10;
}
}
- 객체 (Reference Types)
public class Test {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
changeArray(arr); "배열을 가리키는 주소가 복사되어 넘어감"
System.out.println("After changeArray: " + arr[0]);
}
public static void changeArray(int[] array) {
array[0] = 10;
}
}
기본 자료형은 값 자체를 복사하여 전달하므로, 함수 내에서 변경해도 원본 값은 변하지 않습니다.
객체는 참조 값(주소)을 복사하여 전달하므로, 함수 내에서 객체의 상태를 변경하면 원본 객체도 영향을 받습니다. 하지만 여전히 참조 값 자체는 복사된 것이죠.
- Java는 멀티 스레드(Multi Thread) 환경인데 멀티스레드란 무엇인가?
- 멀티스레드(Multi-Thread)는 하나의 프로세스 내에서 여러 스레드를 동시에 실행하여 병렬로 작업을 처리하는 방식으로, 자바에서는 이러한 스레드를 생성하고 관리하여 프로그램의 성능을 향상시키고 자원을 효율적으로 사용할 수 있습니다.
- 인터페이스 추상클래스에 대해서 설명하세요
-
인터페이스: 메서드의 선언만 포함하며, 구현은 해당 인터페이스를 구현하는 클래스에서 제공됩니다.
-
추상 클래스: 추상 메서드(구현 없는 메서드)와 일반 메서드(구현 있는 메서드) 모두 포함할 수 있으며, 상속을 통해서만 인스턴스화될 수 있습니다.
-
인터페이스는 "이런 기능을 해야 한다"는 규약을 정의하며, 다양한 클래스가 특정 기능을 구현하도록 강제할 때 사용됩니다.
implements
키워드를 사용해서 인터페이스에 정의된 메스드를 각 클래스의 목적에 맞게 기능을 구현한다.
-
추상 클래스는 공통된 속성과 동작을 여러 클래스에 제공하면서, 서브클래스가 구체적인 동작을 정의하도록 할 때 사용됩니다.
extends
키워드를 사용해서 자신의 기능들을 하위 클래스로 확장시킨다.
- 스크립트 언어와 컴파일언어의 차이
- 스크립트 언어
- 인터프리터가 한 라인 한 라인 기계어로 번역하며 실행합니다.
- 우리가 컴파일 에러라고 부르는 문법 오류를 사전에 방지하지 못하기 때문에 주의해야 합니다.
- 컴파일 언어
- 실행 전 소스코드를 컴파일하여 기계어로 변환 후 해당 파일을 실행합니다.
- 이미 기계어로 변환된 것을 실행하므로 비교적 빠릅니다.
- 컴파일 과정을 거쳐 기계어 코드로 번역이 되기 때문에 사전에 검증을 할 수 있고, 최적화를 해줄 수 있습니다.
- Error와 Exception의 차이를 설명해주세요.
-
Error는 시스템 수준에서 발생하는 문제로, 일반적으로 복구할 수 없으며, 프로그램의 중단을 초래합니다.
- 컴파일 시점에 체크할 수 없기 때문에 개발자가 예외 처리를 통해 해결할 수 없는 경우가 많습니다.
- 오류가 발생하면 프로그램은 비정상 종료됩니다.
- 예측 불가능한 UncheckedException에 속합니다.
-
Exception은 프로그램 내에서 발생하는 문제로, 개발자가 이를 처리하여 프로그램을 계속 실행할 수 있습니다.
- checked Exception과 unchecked Exception의 차이
-
checked Exception은 값 넣기 전에 에러나는 것, unchecked Exception은 runtimeException과 같이 실행후에 알 수 있는 것. 값 넣으면 에러나는 것
-
CheckedException은 실행하기 전에 예측 가능한 예외를 말하고, 반드시 예외 처리를 해야 합니다.
-
UncheckedException은 실행하고 난 후에 알 수 있는 예외를 말하고, 따로 예외처리를 하지 않아도 됩니다.
- Java 접근 제어자에 대해서 각각 설명해 주세요.
- public: 모든 클래스에서 접근 가능
- protected: 같은 패키지 또는 하위 클래스에서 접근 가능
- default: 같은 패키지 내에서만 접근 가능
- private: 동일 클래스 내에서만 접근 가능
- JVM의 구조에 대해서 설명해 주세요.
- 클래스 로더: 클래스 파일을 메모리로 로드하고, 연결 작업을 수행합니다.
- 메모리 영역: 메소드 영역, 힙, 스택, 네이티브 메소드 스택, 프로그램 카운터(PC) 레지스터로 구성됩니다.
- 실행 엔진: 바이트코드를 실행하고, JIT 컴파일을 수행하여 성능을 최적화합니다.
- Garbage Collector 에 대해서 설명해 주세요. 어떻게 동작하나요?
- GC의 종류에 대해서 말해보세요.
- Java 버전 별 특성에 대해서 아는대로 말해주세요.
- Java는 Call By Value일까요, Call By Reference 일까요?
- Java는 Call By Value로, 기본 자료형은 값 자체가 복사되어 전달되고, 객체는 참조 값이 복사되어 전달되어 참조하는 객체를 수정할 수 있습니다.
- 리플렉션(Reflection)이란 무엇인가요?
- 구체적인 클래스 타입을 알지 못해도 클래스의 메서드, 타입, 변수들을 접근할 수 있게 해주는 Java API
- JVM에서 실행되는 애플리케이션의 런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 프로그램에서 사용됩니다.
- 본인 관점에서, 인터페이스는 주로 어떨 때 사용하나요?
- 구현과 인터페이스의 분리를 통해 코드의 유연성과 재사용성을 높이기 위해 사용합니다. 예를 들어, 서로 다른 클래스들이 공통의 메소드 집합을 구현하게 하여 다양한 객체를 동일한 방식으로 처리할 때 유용합니다.
- equals와 ==의 차이는 무엇인가요?
- ==: 두 객체가 동일한 메모리 주소를 참조하는지 비교합니다.
- equals: 두 객체의 내용을 비교하여 동등성을 판단합니다.
- Wrapper Class란 무엇인가요?
- Wrapper Class는 기본 자료형을 객체로 감싸서, 객체 지향적 기능(예: 메소드 호출)을 제공하는 클래스입니다. 예를 들어, int는 Integer로, char는 Character로 감싸집니다.
- 클래스, 객체, 인스턴스 차이에 대해서 설명해 주세요.
- 클래스: 객체를 생성하기 위한 설계도나 틀로, 속성과 메소드를 정의합니다.
- 객체: 클래스의 설계도를 바탕으로 메모리에 생성된 실체로, 실제 데이터와 기능을 가지고 있습니다.
- 인스턴스: 객체와 동일한 의미로 사용되며, 클래스에서 생성된 개별 객체를 지칭합니다.
- Stream API란 무엇인가요?
- Lambda란 무엇인가요?
- 함수형 인터페이스란 무엇인가요?
JVM 기동시 주로 사용되는 옵션들을 아는대로 말해보세요.
foreach를 사용할 수 있는 자료구조는 어떤 인터페이스를 상속받고 있나요?
iterator와 iterable 차이는 무엇인가요?
synchronized 키워드에 대해 설명해 주세요.
volatile 키워드에 대해 설명해 주세요.
final 키워드에 대해서 설명해주세요. 각각의 쓰임에 따라 어떻게 동작하나요?
Java의 제네릭(Generics)에 대해 설명하세요.
- 제네릭은 Java의 타입 안정성을 맡고 있습니다.
- 컴파일 과정에서 타입 체크를 해주는 기능으로 객체의 타입을 컴파일 시에 체크하기에 객체의 타입 안정성을 높이고 형 변환의 번거로움을 줄여줍니다.
static을 사용하는 이유에 대해 설명하세요.
- static(정적)이란 고정된 의미를 뜻하고, 인스턴스를 생성하지 않아도 접근이 가능합니다.
- 모든 객체가 메모리를 공유한다는 특징이 있고, GC 관리 영역 밖이기에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재합니다.
- 객체 생성 없이 바로 사용이 가능하기에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용하면 좋습니다.
컬렉션 프레임워크(Collection FrameWork)에 대해 설명하세요. Reference
- 컬렉션 프레임워크란 데이터의 집합, 그룹을 의미하며 자료 구조를 바탕으로 객체나 데이터들을 효율적으로 관리할 수 있는 자료 구조들이 있는 라이브러리이다.
- 컬렉션 프레임워크는 Java의 인터페이스를 사용해서 구현된다.
- 대표적으로 List, Set, Map, Stack, Queue 등이 있다.
왜 불변 객체나 final을 굳이 사용해야 하는지 설명하세요.
- 메서드 호출 시 파라미터 값이 변하지 않는다는 것을 보장할 수 있기 때문입니다.
직렬화(Serialize)와 역직렬화에 대해 설명하세요.
- 직렬화(Serialize)란 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 시스템에서도 사용할 수 있도록 바이트(Byte) 형태로 데이터를 변화하는 과정을 뜻한다.
- 역직렬화란 직렬화된 바이트(Byte) 형태의 데이터를 다시 객체로 변환하는 과정을 뜻한다.
Array와 ArrayList의 차이점에 대해 설명하세요.
- Array는 인덱스(Index)로 접근하고, ArrayList는 메서드를 통해 접근한다.
- Array는 Object 뿐만 아니라 원시 타입(int, long, double 등)도 담을 수 있지만,
- ArrayList는 Object만 담을 수 있다. 그래서 정수를 ArrayList에 넣을 경우 Integer형은 가능하지만 int 형은 불가능하다.
JVM이란?