feature/ 2.기술면접 레퍼런스2

✓ 구글링 하던중, 잊고 있고 있었던 지식들을 정석책 처럼 잘 정리해주신 분의 게시물을 참고하였습니다.

1편과 이어서 갈게요!

💡 Synchronized에 대해 아는 대로 말해주세요.

여러 개의 쓰레드가 한 개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 쓰레드를 제외하고 나머지 쓰레드들은 데이터에 접근할 수 없게 막는 개념입니다.
데이터의 thread-safe를 하기 위해 자바에서 Synchronized 키워드를 제공해 멀티 쓰레드 환경에서 쓰레드간 동기화를 시켜 데이터의 thread-safe를 보장합니다.
Synchronized는 변수와 메소드에 사용해서 동기화 할 수 있으며, Synchronized 키워드를 남발하게 되면 오히려 프로그램의 성능저하를 일으킬 수 있습니다.

💡 new String()과 리터럴("")의 차이에 대해 설명해주세요.

new String()은 new 키워드로 새로운 객체를 생성하기 때문에 Heap 메모리 영역에 저장되고,
""는 Heap 안에 있는 String Constant Pool 영역에 저장됩니다.

💡 String, StringBuffer, StringBuilder의 차이를 설명해주세요.

String은 불변의 속성을 가지며, StringBuffer와 StringBuilder는 가변의 속성을 가집니다.
StringBuffer는 동기화를 지원하여 멀티 쓰레드 환경에서 주로 사용하며,
StringBuilder는 동기화를 지원하지 않아 싱글 쓰레드 환경에서 주로 사용합니다.

💡 String 객체가 불변인 이유에 대해 아는대로 설명해주세요.

  1. 캐싱 기능에 의한 메모리 절약과 속도 향상
  • Java에서 String 객체들은 Heap의 String Pool 이라는 공간에 저장되는데, 참조하려는 문자열이 String Pool에 존재하는 경우 새로 생성하지 않고 Pool에 있는 객체를 사용하기 때문에 특정 문자열 값을 재사용하는 빈도가 높을 수록 상당한 성능 향상을 기대할 수 있다.
  1. thread-safe
  • String 객체는 불변이기 때문에 여러 쓰레드에서 동시에 특정 String 객체를 참조하더라도 안전하다.
  1. 보안기능
  • 중요한 데이터를 문자열로 다루는 경우 강제로 해당 참조에 대한 문자열 값을 바꾸는 것이 불가능하기 때문에 보안에 유리하다.

💡 클래스 멤버 변수 초기화 순서에 대해 설명해주세요.

static 변수 선언부 : 클래스가 로드 될 때 변수가 제일 먼저 초기화 된다.
필드 변수 선언부 : 객체가 생성될 때 생성자 block 보다 앞서 초기화 된다.
생성자 block : 객체가 생성될 때 JVM이 내부적으로 locking( thread-safe 영역 )

💡 static에 대해 설명해주세요.

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

💡 static을 사용하는 이유에 대해 설명해주세요.

static은 자주 변하지 않는 값이나 공통으로 사용되는 값 같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어들이는 것보다 일종의 '전역변수'와 같은 개념을 통해 접근하는 것이 비용도 줄이고 효율을 높일 수 있습니다.
인스턴스 생성 없이 바로 사용 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용합니다.

💡 Inner Class(내부 클래스)의 장점에 대해 설명해주세요.

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

💡 리플렉션(Reflection)이란 무엇인지 설명해주세요.

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

💡 리플렉션은 어떤 경우에 사용되는지 설명해주세요.

코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우 사용됩니다.
프레임워크나 IDE에서 이런 동적인 바인딩을 이용한 기능을 제공합니다. intelliJ의 자동완성 기능, 스프링의 어노테이션이 리플렉션을 이용한 기능이라 할 수 있습니다.

💡 Optional API에 대해 설명해주세요.

개발할때 가장 많이 발생하는 예외 중 하나가 NPE(NullPointerException)입니다.NPE를 피하려면 null 여부 검사를 필연적으로 하게 되는데 만약 null 검사를 해야하는 변수가 많은 경우 코드가 복잡해지고 번거롭습니다. 하지만 Java8 부터 Optional을 제공하여 null로 인한 예외가 발생하지 않도록 도와주고, Optional 클래스의 메소드를 통해 null을 컨트롤 할 수 있습니다.

💡 제네릭에 대해 설명해주시고, 왜 쓰는지 알려주세요.

제네릭은 데이터의 타입을 하나로 지정하지 않고 사용할 때마다 범용적이고 포괄적으로 지정한다는 의미입니다.
제네릭 타입을 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있어 에러를 사전에 방지할 수 있습니다.

💡 직렬화(Serialize)에 대해 설명해주세요.

시스템 내부에서 사용되는 객체 또는 데이터를 외부의 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술이며, 반대로 직렬화된 바이트 형태의 데이터를 다시 객체로 변환하는 과정을 '역직렬화'라고 합니다.
(간단히) JVM의 메모리에 상주(힙 or 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술

출처: https://dev-coco.tistory.com/153 [슬기로운 개발생활:티스토리]

profile
개발자와 커뮤니케이션 안되서 개발자가 되었습니다.

0개의 댓글