💡 자바의 특징에 대해서 설명해주세요.
- 자바는 객체지향 프로그래밍 언어입니다.
- 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향 개념의 특징인 캡슐화, 상속, 추상화, 다형성이 잘 적용된 언어입니다.
- 캡슐화란 클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것을 말합니다.
- 상속이란 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소입니다.
- 추상화란 불필요한 세부 사항들은 제거하고 가장 본질적이고 공통적인 부분만 추출하여 표현하는 것을 말합니다.
- 다형성이란 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 말합니다.
💡 자바를 사용했을 때 장점과 단점은 뭐가 있을까요?
- 자바는 JVM 위에서 동작하기 때문에 운영체제에 독립적이며, GarbageCollector를 통한 자동적인 메모리 관리가 가능하다는 장점이 있습니다.
- 운영체제에 독립적이다?: 다른 언어의 경우 플랫폼(window, mac 등)에 따라 코드 및 실행 파일이 달라지기 때문에 플랫폼이 바뀌게 되면 컴파일을 새로 해야한다.
- 다만 JVM 위에서 동작하기 때문에 다른 언어에 비해 실행 속도가 상대적으로 느리며, 다중 상속이나 타입에 엄격하고 제약이 많다라는 단점 또한 있습니다.
💡 JVM의 역할에 대해 설명해주세요.
- JVM은 스택 기반으로 동작하며, Java Byte Code를 OS에 맞게 해석 해주는 역할을 하고 GarbageCollector를 통해 자동적인 메모리 관리를 수행해줍니다.
💡 자바의 컴파일 과정에 대해 설명해주세요.
- 우선 개발자가 자바 소스코드(.java)를 작성합니다.
- 이후 자바 컴파일러가 자바 소스파일을 컴파일합니다. 이때 나오는 파일은 자바 바이트 코드 파일(.class)로 아직 컴퓨터가 읽을 수 없는 코드입니다.
- 다음으로 컴파일된 바이트 코드를 JVM의 클래스 로더(Class Loader)에게 전달합니다.
- 그럼 클래스 로더는 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역, 즉 JVM의 메모리에 올립니다.
- 마지막으로 실행엔진에서 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행합니다.
💡 자바에서 제공하는 원시 타입들에는 무엇이 있고, 각각 몇 바이트를 차지하나요?
- 우선 정수형으로는 1byte 크기의 Byte, 2byte 크기의 short, 4byte 크기의 int, 8byte 크기의 long이 존재하며, 실수형으로는 4byte 크기의 float, 8byte 크기의 double이 존재합니다.
- 다음으로 문자형으로는 2byte 크기의 char, 논리형으로는 1byte 크기의 boolean이 있습니다.
💡 오버라이딩(Overriding)과 오버로딩(Overloading)에 대해 설명해주세요.
- 오버라이딩은 상위 클래스에 있는 메소드를 하위 클래스에서 재정의하여 사용하는 것을 말하며
- 오버로딩은 매개변수의 개수나 타입을 다르게 하여 같은 이름의 메소드를 여러 개 정의하는 것을 말합니다.
💡 객체지향 프로그래밍(OOP; Object-Oriented Programming)에 대해서 설명해주세요.
- 객체 지향 프로그래밍은 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체로 만들고, 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.
- 특징으로는 캡슐화, 상속, 다형성, 추상화 등이 있으며 모듈 재사용으로 확장 및 유지보수가 용이합니다.
💡 try-with-resources에 대해 설명해주세요.
- try-with-resources는 try-catch-finally의 문제점을 보완하기 위해 나온 개념으로
- try 구문 안에 자원 객체를 전달하면, try 블록이 끝나고 자동으로 자원을 해제 해주는 기능을 말합니다.
- 때문에 따로 finally 구문이나 모든 catch 구문에 종료 처리를 하지 않아도 된다는 장점이 있습니다.
💡 불변 객체가 무엇인지 설명하고 대표적인 자바의 예시를 설명해주세요.
- 불변 객체는 객체 생성 이후 내부의 상태가 변하지 않는 객체를 말합니다.
- 자바에서는 필드가 원시 타입인 경우 final 키워드를 통해 불변 객체를 만들 수 있고,
- 참조 타입인 경우 추가적인 작업이 필요합니다.
- 💡 추가적인 작업은 어떤게 있는지 설명해주세요.
- 참조 타입은 대표적으로 객체나 배열, List 등을 참조하는 경우로 나눌 수 있습니다.
- 참조 변수가 일반 객체인 경우 객체를 사용하는 필드의 참조 변수도 불변 객체로 변경해야 합니다.
- 참조 변수가 배열인 경우 배열을 받아 copy해서 저장하고, getter를 clone으로 반환하도록 하면 됩니다.
- 참조 변수가 리스트인 경우에도 배열과 마찬가지로 새로운 리스트를 만들어 값을 복사하도록 하면 됩니다.
- 💡 불변 객체나 final을 굳이 사용해야 하는 이유가 있을까요?
- 불변 객체나 final 키워드를 사용해서 얻는 이점은 다음과 같습니다.
- 우선 Thread-Safe하여 병렬 프로그래밍에 유용하며, 동기화를 고려하지 않아도 됩니다(공유자원이 불변이기 때문에 항상 동일한 값을 반환하기 때문).
- 또한 어떠한 예외가 발생하더라도 메소드 호출 전의 상태를 유지할 수 있어, 예외 발생 전과 동일한 상태로 다음 로직을 처리 할 수 있습니다.
- 이 외에도 부수효과의 피해 오류를 최소화하거나 메소드 호출 시 파라미터 값이 변하지 않는다는 것을 보장할 수 있으며, 가비지 컬렉터가 스캔하는 객체의 수가 줄어들기 때문에 가비지 컬렉션 성능을 높일 수 있습니다.
- 부수효과: 변수의 값이 바뀌거나 객체의 필드 값을 설정하거나 예외나 오류가 발생하여 실행이 중단되는 현상
- 💡 추가적인 작업은 어떤게 있는지 설명해주세요.
💡 추상 클래스와 인터페이스에 대해서 설명하고, 둘의 차이에 대해 설명해주세요.
- 추상 클래스는 클래스 내에 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우를 말하고
- 인터페이스는 모든 메소드가 추상 메소드로만 이루어져 있는 것을 말합니다.
- 이 둘은 모두 인스턴스 생성이 불가능하기 때문에, 사용하기 위해서는 하위 클래스에서 확장 또는 구현해야 합니다.
- 이 둘의 차이점으로는 존재 목적이 있는데
- 인터페이스는 그 인터페이스를 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제함에 있고
- 추상클래스는 상속받는 클래스들의 공통적인 로직을 추상화시키고, 기능 확장을 위해 사용한다는 점입니다.
- 또한 인터페이스는 다중상속이 가능하고, 추상 클래스는 다중상속이 불가능하다는 차이점이 있습니다.
💡 싱글톤 패턴에 대해 설명해주세요.
- 싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴입니다.
- 인스턴스가 1개만 존재해야 한다는 것을 보장하고 싶은 경우와 동일한 인스턴스를 자주 생성해야 하는 경우에 주로 사용합니다.
- 💡 싱글톤 패턴의 대표적인 예시를 간단하게 설명해주세요.
- 싱글톤 패턴의 대표적인 예시로는 Spring Bean이 있습니다.
- 스프링의 빈 등록 방식은 기본적으로 싱글톤 스코프이고, 스프링 컨테이너는 모든 빈들을 싱글톤으로 관리합니다.
- 💡 싱글톤 패턴의 대표적인 예시를 간단하게 설명해주세요.
💡 가비지 컬렉션(Garbage Collection)에 대해 설명해주세요.
- 가비지 컬렉션은 JVM의 메모리 관리 기법 중 하나로, 시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요 없어진 메모리 영역을 회수하여 메모리를 관리해주는 기법입니다.
- 💡 가비지 컬렉션 과정에 대해 설명해주세요.
- 우선 GC의 작업을 수행하기 위해 JVM이 어플리케이션의 실행을 잠시 멈추고, GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업을 중단한 뒤, 사용하지 않는 메모리를 제거하고 작업을 재개합니다.
- 💡 가비지 컬렉션 과정에 대해 설명해주세요.
💡 객체지향의 설계 원칙에 대해 설명해주세요.
- 단일 책임 원칙(SRP): 한 클래스는 하나의 책임만 가져야 한다.
- 개방-폐쇄 원칙(OCP): 확장에는 열려있고, 변경에는 닫혀있어야 한다.
- 리스코프 치환 원칙(LSP): 상위 타입은 항상 하위 타입으로 대체될 수 있어야 한다.
- 인터페이스 분리 원칙(ISP): 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
- 의존관계 역전 원칙(DIP): 하위 클래스보다는 상위 클래스, 인터페이스, 추상 클래스와 같이 변하지 않을 가능성이 높은 클래스와 관계를 맺는 것이 좋다.
💡 자바의 메모리 영역에 대해 설명해주세요.
- 자바의 메모리 공간은 크게 Method 영역, Stack 영역, Heap 영역으로 구분되고, 데이터 타입에 따라 각 영역에 할당됩니다.
- 메소드 영역은 전역변수와 static 변수를 저장하며, 프로그램의 시작부터 종료까지 메모리에 남아있게 됩니다.
- 스택 영역은 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호출될 때 메모리에 할당되고 메소드가 종료되면 메모리가 해제됩니다.
- 힙 영역은 new 키워드로 생성되는 객체, 배열 등이 저장되는 공간이며, 가비지 컬렉션에 의해 메모리가 관리되어 집니다.
- 💡 각 메모리 영역이 할당되는 시점은 언제인가요?
- 메소드 영역은 JVM이 동작해서 클래스가 로딩될 때 할당되고
- 스택 영역은 컴파일 타임(소스코드가 기계어로 변환되어 실행가능한 프로그램이 되는 과정)에 할당되며
- 힙 영역은 런타임(컴파일 타임 이후 프로그램이 실행되는 때)에 할당됩니다.
- 💡 각 메모리 영역이 할당되는 시점은 언제인가요?
💡 클래스와 객체에 대해 설명해주세요.
- 클래스는 객체를 만들어내기 위한 설계도 혹은 틀이라고 할 수 있고
- 객체는 설계도(클래스)를 기반으로 생성되며, 자신의 고유 이름과 상태, 행동을 갖는 것을 말합니다.
- 여기서 상태는 필드(field), 행동은 메소드(method)라고 표현합니다.
- 객체에 메모리가 할당되어 실제로 활용되는 실체는 인스턴스라고 부릅니다.
💡 생성자(Constructor)에 대해 설명해주세요.
- 생성자는 클래스와 같은 이름의 메소드로, 객체가 생성될 때 호출되는 메소드입니다.
- 명시적으로 생성자를 만들지 않아도 default로 만들어지며, 생성자는 파라미터를 다르게하여 오버로딩할 수 있습니다.
💡 Wrapper Class란 무엇이며, Boxing과 UnBoxing은 무엇인지 설명해주세요.
- 기본 자료형에 대한 객체 표현을 Wrapper Class라고 합니다.
- Wrapper Class는 각각의 타입에 해당하는 데이터를 인수로 전달받아, 해당 값을 가지는 객체로 만들어줍니다. 따라서 기본 타입의 데이터를 객체로 취급해야 하는 경우에 사용할 수 있습니다.
- 이때 기본 자료형에서 Wrapper Class로 변환하는 것을 Boxing이라 하며
- Wrapper Class에서 기본 자료형으로 변환하는 것을 UnBoxing이라 합니다.
- 💡 int와 Integer의 차이에 대해 설명해주세요.
- 우선 int는 기본 자료형이며 Integer는 int의 참조형입니다.
- int와 같은 기본 자료형은 특정 타입의 데이터가 저장될 공간과 저장 형식을 정의한 것이며, Integer와 같은 Wrapper Class는 기본 자료형을 객체로 다루고자 할 때 주로 사용합니다.
- 따라서 int는 산술 연산이 가능하며 null로 초기화가 불가능하고, Integer는 UnBoxing하지 않을 경우 산술 연산이 불가능하며 null 값 처리가 가능하다는 차이가 있습니다.
- 💡 int와 Integer의 차이에 대해 설명해주세요.
💡 Synchronized에 대해 아는 대로 말해주세요.
- Synchronized란 여러 개의 쓰레드가 한 개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 쓰레드를 제외한 나머지 쓰레드들은 데이터에 접근할 수 없도록 막는 개념입니다.
- 데이터의 Thread-Safe를 지원하기 위해 자바에서 Synchronized 키워드를 제공해주고 있으며, 이를 사용하면 멀티 쓰레드 환경에서 쓰레드간 동기화를 시켜 데이터의 Thread-Safe를 보장할 수 있습니다.
- Synchronized는 변수와 메소드에 사용해서 동기화할 수 있으며, 너무 남발하여 사용하면 오히려 프로그램의 성능저하를 일으킬 수도 있습니다.
💡 new String()과 리터럴("")의 차이점에 대해 설명해주세요.
- new String()
- new 키워드로 생성한 String 객체는 다른 객체들과 마찬가지로 Heap 메모리 영역에 할당되며, 모든 String 변수의 주소가 다르게 설정됩니다.
- 리터럴("")
- 문자열 리터럴은 선언 시 Heap 내의 String Constant Pool이라는 영역에 따로 할당됩니다.
- 따라서, 이미 같은 값을 가지고 있는 리터럴이 Pool에 존재한다면 새로운 객체를 만들지 않고, 기존에 존재하는 리터럴을 사용하게 됩니다.
- 이 경우, 여러 변수가 리터럴을 통해 같은 주소를 참조할 수 있으므로 서로 영향을 줄 수 있는데, 자바에서는 String을 불변 객체로 설정함으로써 이를 해결하였습니다.
💡 String과 StringBuilder, StringBuffer는 각각 어느 상황에서 사용해야 적절한지 설명해주세요.
- 먼저 String과 다른 두 문자열 클래스의 기본적인 차이점으로, String은 immutable(불변)하고, 다른 두 문자열 클래스는 mutable(가변)함에 있습니다.
- String
- 즉, String 객체는 한 번 생성되면 할당된 메모리 공간이 변하지 않습니다. '+' 연산자 또는 concat 메서드를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열을 붙이는 방식이 아니라, 새로운 String 객체를 만든 후, 해당 객체에 새롭게 연결된 문자열을 저장하고, 그 객체를 참조하도록 합니다.
- String 객체는 이러한 이유로 문자열 연산이 많은 경우, 그 성능이 좋지 않습니다.
- 하지만 Immutable한 객체는 간단하게 사용 가능하고, 동기화에 대해 신경쓰지 않아도 되기 때문에 내부 데이터를 자유롭게 공유할 수 있습니다.
- StringBuilder, StringBuffer
- StringBuilder와 StringBuffer는 String과 달리 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우, 기존의 버퍼 크기를 늘리며 유연하게 동작합니다.
- 두 클래스 간의 차이점으로는 동기화 여부에 있습니다.
- StringBuffer는 각 메서드별로 Synchronized 키워드가 존재하여, 멀티 쓰레드 환경에서 쓰레드간 동기화를 지원합니다. 반면 StringBuilder는 동기화를 지원하지 않습니다.
- 그렇기 때문에 멀티 쓰레드 환경이라면 StringBuffer를 사용하고, 단일 쓰레드 환경이라면 StringBuilder를 사용하는 것이 좋겠습니다.
- 단일 쓰레드 환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder를 사용할 때보다 성능이 떨어질 수 있습니다.
💡 접근 제한자(Access Modifier)에 대해 설명해주세요.
- 접근 제한자란 변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 자바의 예약어를 의미하며, 총 4가지 종류가 있습니다.
- public은 접근 제한이 없다는 것을 의미하며, 같은 프로젝트 내 어디서든 접근이 가능합니다.
- protected는 해당 패키지 내 또는 다른 패키지에서 해당 클래스를 상속받은 자손 클래스만 접근이 가능합니다.
- default는 해당 패키지 내에서만 접근이 가능합니다.
- private는 해당 클래스에서만 접근이 가능합니다.
💡 static에 대해 설명해주세요.
- static 키워드를 사용한 변수나 메소드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로 사용할 수 있습니다. 즉 인스턴스 생성 없이 바로 사용이 가능합니다.
- 모든 객체가 메모리를 공유한다는 특징이 있고, GC 관리 영역 밖에 있기 때문에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재하게 됩니다.
- 💡 static을 사용하는 이유에 대해 설명해주세요.
- static은 자주 변하지 않는 값이나 공통으로 사용되는 값과 같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어들이는 것보다 일종의 전역변수와 같은 개념을 통해 접근하여 비용도 줄이고 효율을 높일 수 있는 경우에 주로 사용합니다.
- 또한 인스턴스 생성 없이 바로 사용 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 사용하기도 합니다.
- 💡 static을 사용하는 이유에 대해 설명해주세요.
💡 내부 클래스(Inner Class)의 장점에 대해 설명해주세요.
- 내부 클래스란 클래스 내에 선언된 또다른 클래스를 말합니다.
- 내부 클래스에서는 외부 클래스 멤버에 손쉽게 접근할 수 있고
- 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써 캡슐화를 증가시키고 코드의 복잡성을 낮출 수 있습니다.
- 또한 외부에서는 내부 클래스에 접근할 수 없으므로 코드의 보안성을 높일 수 있습니다.
💡 리플렉션(Reflection)이란 무엇인지 설명해주세요.
- 리플렉션이란 구체적인 클래스의 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API를 말합니다.
- 코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우 주로 사용됩니다.
- 인텔리제이의 자동완성 기능, 스프링의 어노테이션 또한 리플렉션을 이용한 기능이라고 할 수 있습니다.
💡 Error와 Exception의 차이를 설명해주세요.
- Error는 컴파일 시점에는 체크할 수 없고 오류가 발생하면 프로그램이 비정상 종료되는 치명적 오류를 말하며, 예측 불가능한 UncheckedException에 속합니다.
- 반면, Exception은 Error보다 비교적 경미한 오류이며, try-catch를 이용해 프로그램의 비정상 종료를 막을 수 있습니다.
💡 CheckedException과 UnCheckedException의 차이에 대해 설명해주세요.
- CheckedException은 실행하기 전에 예측 가능한 예외를 말하며, 반드시 예외 처리를 해야 합니다.
- UnCheckedException은 실행하고 난 후에 알 수 있는 예외를 말하며, 따로 예외 처리를 할 필요는 없습니다.
💡 Optional API에 대해 설명해주세요.
- 보통 개발을 할 때 많이 발생하는 예외 중의 하나가 NPE(NullPointerException)인데, 이를 피하기 위해서는 null 여부 검사를 필연적으로 하게 됩니다.
- 이때 만약 검사 해야하는 변수가 많을 경우 코드가 복잡해질 수 있으므로, 이를 해결하기 위해 등장한 것이 Optional 클래스 입니다.
- Optional 클래스는 null 여부 검사를 코드에 포함하면서도 코드의 가독성을 해치지 않도록 여러가지 메소드를 제공해줍니다.
💡 컬렉션 프레임워크에 대해 설명해주세요.
- 컬렉션 프레임워크란 다수의 데이터를 쉽고 효과적으로 관리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다.
- 자바의 컬렉션에는 List, Set, Map 인터페이스를 기준으로 여러 구현체가 존재하고, 이에 더해 Stack, Queue 인터페이스도 존재합니다.
- 💡 List, Set, Map, Stack, Queue의 특징에 대해 설명해주세요.
- List는 순서가 있는 데이터의 집합이며 데이터의 중복을 허용합니다.
- Set은 순서가 없는 데이터의 집합이며 데이터의 중복을 허용하지 않습니다.
- Map은 키와 값의 쌍으로 이루어져 있고, 키를 기준으로 중복을 허용하지 않으며 순서가 없습니다.
- Stack은 직접 new 키워드로 사용할 수 있으며, Queue는 LinkedList에 new 키워드를 적용해 사용할 수 있습니다.
- 💡 List, Set, Map, Stack, Queue의 특징에 대해 설명해주세요.
💡 제네릭의 개념과 사용하는 이유에 대해 설명해주세요.
- 자바에서 제네릭이란 데이터의 타입을 일반화한다는 것을 의미합니다.
- 즉, 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법으로
- 이를 통해 컴파일 시에 미리 타입 검사를 수행함으로써
- 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있고
- 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있습니다.
💡 final, finally, finalize의 차이를 설명해주세요.
- final은 클래스, 메소드, 변수, 인자를 선언할 때 사용할 수 있으며, 불변하는 값을 저장하고 싶을 때 사용합니다.
- finally는 try-catch문과 함께 사용되며, try-catch가 종료될 때 finally block이 항상 수행되기 때문에 마무리 해주어야 하는 작업이 존재하는 경우에 해당하는 코드를 작성해주는 코드 블록을 말합니다.
- finalize는 Object 클래스에 정의되어 있는 메소드이며 GC에 의해 호출되는 메소드로, 임의로 호출할 경우 GC가 지연되면서 에러가 발생할 수 있기 때문에 오버라이딩하여 구현하는 것을 권장하지 않는 메소드입니다.
💡 직렬화(Serialize)에 대해 설명해주세요.
- 직렬화란 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 변환하는 기술이며, 반대로 직렬화된 바이트 형태의 데이터를 다시 객체로 변환하는 과정을 역직렬화라고 합니다.
- 즉, JVM의 메모리에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술이라고 말할 수 있습니다.
💡 SerialVersionUID를 선언해야 하는 이유에 대해 설명해주세요.
- JVM은 직렬화와 역직렬화를 하는 시점에 클래스에 대한 버전 번호를 부여하는데, 만약 그 시점에 클래스의 정의가 바뀌어 있다면 새로운 버전 번호를 할당하게 됩니다. 그래서 직렬화할 때의 버전 번호와 역직렬화할 때의 버전 번호가 다르면 역직렬화가 불가능하게 될 수 있습니다.
- 이러한 문제를 해결하기 위해 변경에 취약한 클래스에 대해 개발자가 직접 serialVersionUID를 관리함으로써 혼란을 줄일수 있습니다.
📌 References
'🎤 Tech Interview' 카테고리의 다른 글
[Tech Interview] Part 6. Operation System (0) | 2023.06.02 |
---|---|
[Tech Interview] Part 5. Network (0) | 2023.05.29 |
[Tech Interview] Part 4. Algorithm (0) | 2023.05.24 |
[Tech Interview] Part 3. Data Structure (0) | 2023.05.22 |
[Tech Interview] Part 2. Database (0) | 2023.05.21 |