JVM 에 대해서 설명을 간단하게 해주세요.
자바를 실행하기 위한 가상 기계(컴퓨터)입니다.자바는 OS에 종속적이지 않기 때문에 CPU가 자바를 인식하고 실행할 수 있게 하는 가상 컴퓨터가 JVM입니다.
자바 직렬화가 어떤 건지 설명해주시고 어디에 쓰이는지 말해주세요.
직렬화란 자바 언어에서 사용되는 Object, Data를 다른 컴퓨터의 자바 시스템에도 사용할 수 있도록 바이트 스트림 형태로 영속적인 데이터로 변환하는 포멧 변환 기술입니다.서블릿 세션, 캐시, 자바 RMI 등에 사용됩니다.
가비지 컬렉션이 무엇인가요?
프로그램을 개발하면서 발생한 유효하지 않은 메모리인 가비지를 개발자 대신 정리해주는 것이 가비지 컬렉션입니다.
종류로는 Minor GC, Major GC가 있습니다.
자바의 메모리 영역에 대해서 설명해 주세요.
자바 프로그램을 실행하면 JVM(자바 가상 머신)은 OS로부터 메모리를 할당 받고, 그 할당 받은 메모리를 자바 프로그램에 맞게 여러 영역으로 나누어 사용하게 되며 메모리 공간은 크게 메서드(정적) 영역, 스택 영역, 힙 영역으로 구분됩니다.
Method(Static) 영역은 JVM이 동작해서 클래스가 로딩될 때 생성되며 JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수, static 변수, 생성자, 메서드 같은 것들을 저장하는 공간입니다. 해당 메서드 영역의 데이터들은 어디에서나 접근 가능하며 프로그램이 시작하고 종료될 때 까지 메모리에 남아있기 때문에 static 메모리의 데이터들은 프로그램이 종료될 때까지 어디서든 사용이 가능합니다. 그렇기 때문에 static 데이터를 무분별하게 사용할 경우 메모리 부족 현상이 일어날 수 있습니다.
Stack 영역은 메서드 내에서 정의하는 기본 자료형에 해당되는 지역변수의 데이터 값이 저장되는 공간입니다. 메서드가 호출될 때 스택 영역에 스택 프레임이라는 하나의 메서드에 필요한 메모리 덩어리가 생성되며 그 안에 메서드를 호출합니다. 메서드가 호출될 때 메모리에 할당되며 메서드가 종료되면 메모리에서 삭제됩니다.
Heap 영역은 JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역으로 참조형 데이터 타입을 갖는 객체의 실제 데이터가 저장되는 공간입니다. 힙 영역의 데이터들을 가리키는 Reference(참조 주소)는 스택 영역에 적재됩니다. 스택 영역과 다르게 호출이 종료되어도 메모리가 삭제되지 않으며 어떤 참조 변수도 힙 영역의 인스턴스를 참조하지 않는다면 GC(가비지 컬렉터)에 의해 청소됩니다.
정리하면 스택 메모리는 하나의 스레드가 실행될 때 사용되기 때문에 힙과 메서드 공간에 저장된 객체는 어디서든지 접근이 가능하지만 스택 메모리는 다른 스레드가 접근할 수 없다는 차이가 존재합니다.
자바의 추상 클래스와 인터페이스를 설명하고, 차이를 설명해주세요.
인터페이스는 모든 메서드가 구현부가 없는 추상 메소드로만 구성되며, 구현 세부사항 없이 메서드의 시그니처만을 가지므로, 다양한 구현체를 가질 수 있게 합니다. 즉 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용하는 것에 초점이 맞춰져 있습니다. 인터페이스끼리 다중 상속이 가능합니다.
추상 클래스는 하위 클래스들의 공통점들을 모아 추상화하여 만든 클래스로, 서브 클래스에서 공통적으로 사용될 수 있는 메소드나 필드를 정의하는 데 사용됩니다. 추상 메서드 외에 일반 클래스와 같이 일반적인 필드, 메서드 생성자를 가질 수 있으며 이러한 특징으로 추상 클래스는 추상화를 하면서 중복되는 클래스 멤버들을 통합 및 확장할 수 있습니다.
인터페이스나 추상 클래스나 똑같이 추상 메서드를 통해 상속이나 구현 규칙을 가지는 추상화 클래스지만 각각 목적과 사용 시나리오가 릅니다. 주요 차이점으로는 인터페이스는 모든 메서드가 추상 메서드이지만, 추상 클래스는 일반적인 메서드를 포함해 공통 기능이나 상태를 제공할 수 있다는 점과, 클래스는 여러 인터페이스를 구현할 수 있지만, 추상 클래스는 하나만 상속받을 수 있다는 점이 있습니다.
이런 차이점으로 인해 인터페이스는 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현하는 느낌으로 사용할 수 있으며 추상 클래스는 공통적인 기능이나 상태를 정의해 하위 클래스로 확장 시키는 느낌으로 사용될 수 있다고 생각합니다.
Serializable (직렬화) 은 무엇일까요?
자바 직렬화
란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술 및 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 칭한다.
시스템적으로 JVM의 Runtime Data Area(Heap 또는 스택 영역)에 상주하고 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태를 말하기도 한다.
[ 바이트 스트림 이란? ]
스트림은 클라이언트나 서버 간에 출발지 목적지로 입출력하기 위한 데이터가 흐르는 통로를 말한다.
자바는 스트림의 기본 단위를 바이트로 두고 있기 때문에, 네트워크, 데이터베이스로 전송하기 위해 최소 단위인 바이트 스트림으로 변환하여 처리한다.
Wrapper class란 무엇이며, Boxing과 Unboxing이 무엇인가?
기본 자료형(Primitive data type)에 대한 객체 표현을 Wrapper class라고 한다.
Boxing: 기본 자료형 → Wrapper class로 변환하는 것
UnBoxing: Wrapper class → 기본 자료형으로 변환하는 것
객체지향 설계 원칙(SOLID) 중, SRP 원칙이 무엇인가?
단일 책임 원칙(SRP): 한 클래스는 하나의 책임만 가져야 한다.
자바의 ==와 equals의 차이가 무엇인가?
==
연산은 참조 비교로, 두 객체가 같은 메모리 공간을 가리키는 지를 확인하는 연산이다.
equals
연산은 두 객체의 내부 값이 같은 지 내용을 비교한다.
- 기본 타입에 대해서는 사용할 수 없고, 객체 비교시 override해서 원하는 방식으로 수정이 가능하다.
==
: 본질까지 같음. (같은 메모리 내의 데이터)
equals
: 값만 같음.
참고
- https://doozi0316.tistory.com/entry/1주차-JVM은-무엇이며-자바-코드는-어떻게-실행하는-것인가
- https://mangkyu.tistory.com/118
- https://lucas-owner.tistory.com/38
- https://f-lab.kr/insight/java-interface-abstract-class-20240521?gad_source=1&gclid=CjwKCAiAzPy8BhBoEiwAbnM9O5IFzOQFmBAVvsmPPwBRGR5J09Elw_NhEqA3_TFUIRLMzxO3CBxMaBoCI5MQAvD_BwE
- https://inpa.tistory.com/entry/JAVA-☕-인터페이스-vs-추상클래스-차이점-완벽-이해하기
- https://inpa.tistory.com/entry/JAVA-☕-직렬화Serializable-완벽-마스터하기
- https://velog.io/@whitebear/자바-직렬화-확실히-알고-가기