jacketList

기술면접 준비 - Java 본문

면접

기술면접 준비 - Java

ukkkk7 2023. 8. 23. 13:00
728x90
반응형

23.09.25ver

 

 

Java의 장단점

장: JVM(자바 가상 머신)위에서 실행되기 때문에 OS(운영체제)에 독립적으로 실행될 수 있다.

      자동으로 메모리를 관리해준다

단: 바이트 코드로 변환 후 JVM에 의해서 기계어로 번역되기 때문에 실행 속도가 상대적으로 느리다.

 

 

Java8의 특징?

java에 함수형 프로그래밍이 처음 도입된 버전이며 새롭게 추가된 기능으로 Stream API, Lamda표현식, Method Reference,Default Method,Optional Class 등이 있음

 

  • Stream API
    • 자바에서 일련의 데이터 요소인 배열이나 컬렉션 등의 데이터를 처리하기 위한 api
    • 멀티스레드를 활용해서 병렬로 연산을 수행할 수 있고, 코드가 간결해짐
  • Lamda 
    • 특정 메소드 사용을 위해 일회용 객체를 만들지 않고 익명 함수를 하나의 식으로 표현할 수 있도록 단수화
    • 간단하게 작성 가능, 가독성 증가 but 남용하면 디버깅이 어려워짐

 

 

 

JVM?

JVM은 OS와 Java Application 사이를 중재해주는 가상 머신 = Java Byte Code를 OS에 맞게 해석 해주는 역할을 하고 가비지 컬렉터를 통해 자동적인 메모리 관리를 해준다.

Runtime Data Area, Class Loader, Execution engine, Garbage Collector로 구성되어 있음

 

 

 

자바의 메모리 영역은 어떻게 이루어져있는지?

 

메소드(Method)영역 - 전역 변수와 static 변수를 저장하고, 프로그램의 시작부터 종료까지 메모리에 남아있음

 

스택(stack)영역 - 지역변수, 매개변수, 데이터 값이 저장되는 공간, 메소드가 호출될 때 메모리에 할당되고 종료되면 해체 LIFO구조를 갖고 변수에 새로운 데잍가 할당되면 이전 데이터는 지워진다.

 

힙(Heap)영역 - new 키워드로 생성되는 객체(인스턴스), 배열 등이 저장되며 가비지 컬렉션에 의해 메모리가 관리되어 진다.

 

메모리 영역이 할당되는 시점

Method영역 - JVM이 동작해서 클래스가 로딩될 때

Stack영역 - 컴파일 시 

Heap영역 - 런타임 시 

 

 

가비지 컬렉션(Garbage Collection) 이란?

가비지 컬렉션은 JVM 메모리 관리 기법 중 하나로 시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요없어진 메모리 영역을 회수하여 메모리를 관리 해주는 기법

 

 

가비지 컬렉션의 메모리 관리 과정?

GC의 과정을 수행하기 위해 JVM이 어플리케이션의 실행을 잠시 멈춤, GC을 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업을 중단사용하지 않는 메모리 제거 후 작업 재개

 

 

 

 

 

 

자바의 컴파일 과정이 어떻게 되는가?

  1. 자바 클래스 파일(.java)을 생성한다.
  2. 자바 컴파일러가 소스파일(.java)을 읽어 바이트코드(.class)로 컴파일 한다. -> 아직 컴퓨터가 읽을 수 없고 JVM(자바 가상 머신)이 읽을 수 있는 코드
  3. 컴파일된 바이트코드(.class)를 JVM의 클래스 로더에게 전달
  4. 클래스 로더는 런타임 데이터 영역(Runtime Data Area의 Method Area), 즉 JVM의 메모리영역에 올립니다.
  5. 실행엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석된다.(각 운영체제에 맞는 기계어)

 

객체지향 프로그래밍(OOP)?

객체지향 프로그래밍이란 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 객체들간의 유기적인 상호작용을 통해 로직을 구성하는 방식입니다.

 

절차지향 과 객체지향의 차이점

절차지향: 수행되어야 할 기능을 순차적인 처리 과정으로 프로그래밍 하는 방식

객체지향: 객체들의 유기적인 상호작용을 통해 프로그래밍 하는 방식

 

 

객체지향(OOP)의 4가지 원칙

 

캡슐화

데이터와 코드의 형태를 외부로부터 알 수 없게 하고, 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 것

 

추상화

클래스들의 공통적인 특성(변수, 메소드)을 인터페이스로 묶어 표현하는 것 

 

상속

이미 정의한 클래스의 모든 속성을 하위 클래스가 물려받는 것

 

다형성

하나의 참조변수로 여러 타입의 객체를 참조하는 것

 

 

오버로딩과 오버라이딩

오버로딩: 하나의 클래스에 (매개변수의 개수, 타입이 다른)같은 이름의 메소드를 여러개 정의하는 것

오버라이딩: 상위 클래스에서 상속받은 메소드를 클래스에 맞게 재정의 하는 것

 

클래스와 객체

클래스: 객체를 정의하는 틀 혹은 설계도

객체: 설계도를 기반으로 생성되고 고유의 상태(fields)와 행동(Method) 특성을 가진다

 

 

 

OOP의 5가지 원칙[SOLID]

SRP(단일 책임 원칙): 한 클래스는 하나의 책임만 가져야 한다.

OCP(개방-폐쇄 원칙): 확장에는 열려있고, 수정에는 닫혀있어야 한다.]

LSP(리스코프 치환 원칙): 하위 타입은 항상 상위 타입을 대체 할 수 있어야 한다.

ISP(인터페이스 분리 원칙): 하나의 범용적인 인터페이스 보다 여러개의 구체적인 인터페이스가 낫다

DIP(의존관계 역전 원칙): 구체적인 클래스보다 추상 클래스, 인터페이스 등과 같이 변하지 않는 클래스와 관계를 맺는것 

 

 

추상 클래스와 인터페이스의 차이

추상 클래스: 클래스 내 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우

인터페이스: 클래스 내 모든 메소드가 추상 메소드로만 이루어져 있는 것

 

차이점

인터페이스 다중상속 가능 추상 클래스 다중상속 불가

추상 클래스는 변수를 가질 수 있지만 인터페이스는 불가

인터페이스는 구현된 모든 메소드를 overriding 해야함

 

직렬화(serializable)와 역직렬화

직렬화: 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용 가능하게 바이트 형태로 데이터를 변경해 준다.

 

역직렬화: 바이트로 변환된 데이터를 다시 객체로 변환하는 기술

 

String, StringBuilder, StringBuffer의 차이

String 새로운 인스턴스 생성시

String

불변성을 가지기 때문에 멀티쓰레드 환경에서 Thread-safe하다

새로운 값을 할당할 때마다 새로운 인스턴스를 생성한다

기존의 객체들은 가비지 컬렉터에 의해 삭제될 때까지 힙 메모리 영역에 남겨져 저장 공간을 차지한다

= 메모리 관리 측면에서 치명적

 

StringBuilder

String과 다르게 가변성을 가지는 클래스

동기화를 지원하지 않기 때문에, 멀티 쓰레드 환경에서 사용하는 것은 적합하지 않음

단일 쓰레드 상황인 경우 StringBuffer보다 성능이 뛰어남

 

StringBuffer

String과 다르게 가변성을 가지는 클래스

동기화를 지원하기 때문에 멀티 쓰레드 환경에서 Thread-safe하다

 

Thread-safe: 쓰레드 안전

 

멀티 쓰레드 프로그래밍에서 일반적으로 어떤 함수나, 변수 혹은 객체가 여러 쓰레드로부터 동시에 접근이 이루어져도 프로그램 실행에 문제가 없음

 

제네릭(Generics) 이란?

  • 컴파일 과정에서 타입 체크를 해주는 기능 -> 컴파일 시 객체의 타입을 체크해 주기 떄문에 타입 안정성을 높이고 형 변환의 번거로움을 줄여준다.

 

컬렉션 프레임워크(Collection Framework)란

  • 다수의 데이터를 쉽고 효과적으로 관리할 수 있는 표준화된 방법을 제공하는 클래스의 집합

 

컬렉션의 인터페이스 List, Set, Map, Stack, Queue

 

List

순서가 있는 데이터의 집합, 데이터 중복 허용

ArrayList, Vector, LinkedList, Stack, Queue

 

Set

순서가 없는 데이터의 집합, 데이터 중복 X

HashSet, LinkedListHashSet, TreeSet

 

Map

순서가 없음, key-value 한 쌍, 키를 기준으로 중복 허용 X, value 중복은 허용

HashMap, TreeMap, HashTable 

 

Stack

한 쪽 끝에서만 자료를 넣고 빼는 작업이 이루어지는 자료구조

LIFO - 마지막에 삽입된 자료가 가장 먼저 삭제되는 구조 - ex 엘리베이터 , 브라우저 뒤로가기 

장:  top 위치의 데이터에 바로 접근이 가능하기 때문에 데이터 접근, 삽입, 삭제가 빠름

단: top 위치 이외의 데이터에 접근 불가 - > 탐색하려면 모든 데이터를 꺼내야 한다.

 

Queue

한쪽으로 삽입된 자료가 다른쪽으로 나가는 자료구조

FIFO -  먼저 들어온 것이 먼저 삭제되는 구조 - ex 식당 줄 , 컴퓨터 프로세스

장: 데이터 접근, 삽입, 삭제가 빠름

단: 중간에 위치한 데이터에 대한 접근이 불가 능하다.

 

Static이란?

클래스가 메모리에 올라갈 때 자동으로 생성되며 바로 사용가능 - 인스턴스(객체) 생성 없이 바로 사용가능

프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재한다.

 

왜 사용 하는지?

자주 변하지 않거나 공통으로 사용되는 값 같은 공용자원에 매번 접근하는 것 보다 비용을 줄이고 효율을 높일 수 있음

인스턴스 생성없이 바로 생성 가능하기 때문에 공통으로 사용되는 데이터를 관리할 때 이용

 

final / finally / finalize의 차이점

 

final - 클래스, 메소드, 변수 를 선언할 때 사용하며 한 번만 할당하고 싶을 때 사용함

  • final 변수: 한 번 초기화되면 그 이후에 변경할 수 없다
  • final 메소드: 메소드 오버라이딩 금지
  • final 클래스: 다른 클래스에서 이 클래스 상속 금지 - setter를 통한 접근은 허용

finally - try-catch와 함께 사용되며, try-catch가 종료될 때 finally block이 항상 수행되기 때문에 마무리해야 하는 작업이 있을 때 해당하는 코드를 작성

 

finalize - object 클래스에 정의되어 있는 메소드, GC에 의해 호출되는 메소드이므로 호출하지 말아야 할 메소드

GC가 발생하는 시점이 불분명하기 때문에 해당 메소드가 실행된다는 보장이 없고, finalize()메소드가 오바라이딩 되어 있으면 GC가 지연될 수 있으며 이때 메모리 누수가 발생할 수 있음

 

 

Wrapper Class란 무엇이며, Boxing과 UnBoxing은 무엇인지

기본 자료형에 대한 객체 표현을 Wrapper Class라고 함

기본 자료형 -> Wrapper class로 변환하는 것을 Boxing 

Wrapper class -> 기본 자료형 UnBoxing

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

References

  • https://dev-coco.tistory.com/153
728x90
반응형

'면접' 카테고리의 다른 글

기술면접 - 운영체제  (0) 2023.09.07
기술면접 - 네트워크  (0) 2023.08.28
기술면접 - Spring  (0) 2023.08.22
기술면접 - 데이터베이스  (0) 2023.08.22