의문점 공부하기/🧾공부하며

면접대비 java

아리빠 2023. 12. 6. 02:24

자바(Java)

OOP란

객체지향 프로그래밍이란 인간 중심적 프로그래밍 패러다임이라고 할 수 있습니다. 즉, 현실 세계를 프로그래밍으로 옮겨와 프로그래밍하는 것을 말합니다. 현실 세계의 사물들을 객체라고 보고 그 객체로부터 개발하고자 하는 애플리케이션에 필요한 특징들을 뽑아와 프로그래밍 하는 것입니다.

대표적인 특징으로 추상화, 상속, 캡슐화, 다형성이 있습니다.

객체 지향적 설계 원칙의 종류

  1. SRP(Single Responsibility Principle) : 단일 책임 원칙
    클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유이어야 합니다.
  2. OCP(Open-Closed Principle) : 개방-폐쇄 원칙
    확장에는 열려 있어야 하고 변경에는 닫혀 있어야 합니다.
  3. LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
    상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 합니다.
  4. ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
    인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 합니다.
  5. DIP(Dependency Inversion Principle) : 의존 역전 원칙
    고수준 모듈은 저수준 모듈의 구현에 의존해서는 안됩니다.

JVM의 구조

  1. 프로그램이 실행되면 OS로부터 프로그램이 필요로 하는 메모리를 먼저 할당 받습니다.
  2. 그리고 자바 컴파일러를 통해 개발자가 작성한 코드(.java)를 바이트 코드(.class)로 변환합니다.
  3. 다음 Class Loader에서 바이트 코드를 JVM에 로딩 시킵니다.
  4. 로딩 된 바이트 코드를 execution engine을 통해 기계어로 해석됩니다.
  5. 해석된 바이트 코드들은 runtime data areas에 배치되어 실질적인 수행이 이루어집니다.

직렬화(serialization)란?

자바에서 입출력을 할 때에는 스트림이라는 통로를 통해 데이터가 이동합니다. 하지만 객체는 바이트형이 아니라서 스트림을 통해 파일에 저장하거나 네트워크로 전송할 수 없습니다.

따라서 객체를 스트림을 통해 입출력하려면 바이트 배열로 변환하는 것이 필요한데, 이를 '직렬화' 라고 합니다. 반대로 스트림을 통해 받은 직렬화된 객체를 원래 모양으로 만드는 과정을 역직렬화라고 합니다.

박싱과 언박싱이란?

기본 자료형(Primitive data type)을 Wrapper class로 바꾸어 주는 것을 박싱, Wrapper class를 기본 자료형(Primitive data type)으로 바꿔주는 것을 언박싱 이라고 합니다.

HashMap vs HashTable vs ConcurrentHashMap

  • HashMap
    • 주요 메서드에 synchronized 키워드 없습니다
    • key, value에 null을 입력할 수 있습니다.
  • HashTable
    • 주요 메서드에 synchronized 키워드가 선언 되어 있습니다.
    • key, value에 null을 허용하지 않습니다.
  • ConcurrentHashMap
    • HashMap thread-safe 하도록 만든 클래스
    • key, value에 null을 허용하지 않습니다.

접근 제어자

  • public : 어디서든 접근이 가능합니다.
  • protected : 동일 패키지 혹은 상속받은 외부 패키지 클래스에서 사용 가능합니다.
  • (default) : 동일 패키지 내에서만 접근 가능합니다.
  • private : 해당 클래스 내에서만 접근 가능합니다.

interface vs abstract

  • interface(인터페이스)
    • 다중 상속
    • 추상 메서드, 상수만 선언 가능
    • 생성자, 일반 변수를 가질 수 없음
    • 팀별 협업시 추상메서드를 통해 결과를 예측하고 작업이 가능함(구현 객체의 동일성 보장)
  • abstract(추상 클래스)
    • 다중 상속 불가
    • 추상 메서드 1개 이상, 일반 변수, 일반 메서드 선언 가능
    • 생성자, 일반 변수 가질 수 있음
    • 메서드의 부분 구현이 가능(부분 구현된 메서드를 상속받아 확장시키기 위함)

String vs StringBuffer vs StringBuilder

  • String
    • immutable(불변)
    • 객체를 한 번 할당할시 메모리 공간에 변동이 없습니다.(할당시 Heap String Pool영역에 생성되어 그 값을 계속 사용합니다.)
    • 동기화를 신경쓰지 않아도 됩니다.
    • 엄청나게 많은 문자열을 선언 및 연산할 시 성능저하를 고려해야합니다.
  • StringBuffer
    • mutable(가변)
    • 각 메서드별로 Synchronized Keyword가 존재합니다.
    • 멀티스레드 환경에서도 동기화를 지원합니다.(thread-safe)
  • StringBuilder
    • mutable(가변)
    • 동기화를 지원하지 않습니다.

try-with-resource란?

try-with-resources는 자동으로 자원을 해제해주는 기능입니다. try에서 선언된 객체가 AutoCloseable을 구현하였다면 Java는 try구문이 종료될 때 객체의 close() 메소드를 호출해 줍니다.

Synchronized(동기화)란?

동기화는 여러 개의 쓰레드가 하나의 자원에 접근하려 할 때 주어진 순간에는 단 하나의 쓰레드만이 접근 가능하도록 하는 것입니다.

둘 이상의 쓰레드가 공동의 자원(파일이나 메모리 블록)을 공유하는 경우, 순서를 잘 맞추어 다른 쓰레드가 자원을 사용하고 있는 동안 한 쓰레드가 절대 자원을 변경할 수 없도록 해야합니다. 만얃 한 쓰레드가 파일에서 레코드를 수정하는데, 다른 쓰레드가 동시에 같은 레코드를 수정하면 심각한 문제가 발생할 수 있기 때문입니다.

이런 상황을 처리할 수 있는 한 방법은 관련된 쓰레드에 대한 동기화(synchronization)를 하는 것입니다.

Synchronized(동기화)를 하기 위한 방법

  • synchronized 함수(메서드)를 만들어 사용합니다.
  • synchronized 블록(block) 사용합니다.

자바의 메모리 영역

  • 메서드 영역
    • static 변수, 전역 변수, 코드에서 사용되는 Class 정보 등이 할당됩니다.
  • 스택(Stack)
    • 지역 변수, 함수(메서드) 등이 할당되는 LIFO(Last In First Out) 방식의 메모리입니다.
  • 힙(Heap)
    • new 연산자를 통한 동작할당된 객체들이 저장되며, 가비지 컬렉션에 의해 메모리가 관리됩니다.

컬렉션 프레임워크란?

컬렉션 프레임워크(collection framework)란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다.

컬렉션 프레임워크에서는 데이터를 저장하는 자료 구조에 따라 다음과 같은 핵심이 되는 주요 인터페이스를 정의하고 있습니다.

  1. List 인터페이스
  2. Set 인터페이스
  3. Map 인터페이스

 

제네릭이란?

제네릭은 자바에서 안정성을 맡고 있다고 할 수 있습니다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안전성을 높이고 형변환의 번거로움을 덜어주어 자연스럽게 코드도 더 간결해집니다.

 

 

Vector vs ArrayList

동적인 배열을 다루는 컬렉션 프레임워크로서 둘의 차이점을 알아보겠습니다.

  • Vector
    • 동기화된 상태입니다.(Thread safe)
    • 상대적으로 속도가 느립니다.(동기화 되어있기 떄문)
  • ArrayList
    • 동기화가 안된 상태입니다.
    • 상대적으로 속도가 빠릅니다.(동기화가 안되어있기 때문)
    • 멀티쓰레드 환경이 아닐 경우 사용 권장합니다.
    •  

ArrayList와 LinkedList의 차이

LinkedList와 ArrayList는 모두 Java에서 제공하는 List 인터페이스를 구현한 Collection 구현체입니다.

  • ArrayList
    • 내부적으로 데이터를 배열로 관리하고 데이터 추가/삭제 시 임시 배열을 생성해 데이터를 복사합니다.
    • 데이터별 인덱스가 있어 검색에는 유리
    • 임시 배열을 사용하기 때문에 데이터 추가/삭제의 경우에는 불리
  • LinkedList
    • 내부적으로 노드 단위로 데이터를 관리합니다. 자신의 앞 뒤 노드만 인지하는 상태입니다.
    • 인덱스가 따로 없기 때문에 검색 시 전 노드를 순회해야하여 검색시 불리
    • 데이터 추가/삭제 시 불필요한 데이터 복사가 없어 유리

 

오버로딩(Overloading)과 오버라이딩(Overriding)의 차이

  • 오버로딩(Overloading) :
    상위 클래스의 메소드와 이름, return 값은 동일하지만, 매개변수만 다른 메소드를 만드는 것을 의미합니다. 다양한 상황에서 메소드가 호출될 수 있도록 한다.
  • 오버라이딩(Overriding) :
    상위 클래스에 존재하는 메소드를 하위 클래스에서 필요에 맞게 재정의하는 것을 의미합니다.

 

 

final / finally / finalize() 차이

  • final
    • final class : 다른 클래스에서 상속하지 못합니다.
    • final method : 다른 메소드에서 오버라이딩하지 못합니다.
    • final variable : 변하지 않는 상수값이 되어 새로 할당할 수 없는 변수가 됩니다.
  • finally : try-catch or try-catch-resource 구문을 사용할 때, 정상적으로 작업을 한 경우와 에러가 발생했을 경우를 포함하여 마무리 해줘야하는 작업이 존재하는 경우에 해당하는 코드를 작성해주는 코드 블록입니다.
  • finalize() : GC에 의해 호출되는 함수로 절대 호출해서는 안 되는 함수입니다. 이유는 GC가 발생하는 시점이 불분명하기 때문에 해당 메소드가 실행된다는 보장이 없습니다.

'의문점 공부하기 > 🧾공부하며' 카테고리의 다른 글

🧾스프링  (1) 2023.12.08
🧾리액트 정리  (0) 2023.12.08
🧾 HTTP VS HTTPS  (0) 2023.12.04
🧾면접 대비  (0) 2023.12.02
🧾NCA 취득 완료  (0) 2023.11.30