면접! 기술 질문 - JAVA

jiji·2023년 10월 31일
0

CS 전공지식 노트

목록 보기
2/12

👉🏻 자세히 공부하기

▪ 자바란?

  • 객체(기능) 중심의 설계
  • 대표적인 언어 : java
    • JVM을 통해 여러 운영 체제에서 실행이 가능하다.
      • 중간 계층으로 인해 악성 코드가 직접 운영 체제에 영향을 미치기 어렵다.(보안성이 뛰어나다.)
    • 가비지 컬렉터를 통해 메모리를 관리해 준다.
      • 사용하지 않는 메모리(더 이상 참조되지 않는) 자원을 자동으로 식별하고 회수
    • 멀티 쓰레드를 지원한다.

thread

스레드란?

프로세스(실행 중인 프로그램) 내에 실제로 작업을 수행하는 주체로서, 두 개 이상의 스레드를 가지는 프로세스를 멀티 스레드 프로세스라고 한다.
프로그램을 실행 시킬 때, 코드의 흐름이 있어. 이 하나의 흐름을 쓰레드라고함.
main 메서드 -> ... 이후 코드가 하나씩 실행되는것.
ex) 예를 들을 여러 for문을 돌릴 때

+) 데몬스레드 역시 멀티 스레드가 지원이 된다면 가능

장점

  • 사용자에 대한 응답성 향상
  • 자원의 효율성(자원 공유)
  • 동시성

단점

  • 스레드 중 하나만 문제가 생기더라도 전체 프로세스에 영향을 끼침(상호 간섭)
  • 스레드를 많이 생성할 경우, Context Switching이 많이 일어나 성능의 저하
  • 여러 스레드가 공유 자원에 동시에 접근 할 경우, 동기화 이슈 발생
    : 여러 쓰레드가 동시에 작업되고, 랜덤하게 끝이남.
    • 이걸 순서를 정해줄 수 있는게 : 싱크로나이즈 - 쓰레드 동기화를 해줄 수 있다.

* 동기화 : 작업들 사이에 실행 시기를 맞추는 것.

💡 즉, 동일한 프로세스 내에서는 다른 스레드들과 전역 메모리를 공유할 수 있다는 장점이 있으나, 스레드 중에 하나가 문제가 있더라도 전체 프로세스에 영향을 끼지기 때문에 교착상태에 빠질 수 있다.

▪ 객체 지향 프로그래밍이란?

💡 OOP(Object Oriented Programming), 객체 지향 프로그래밍

  • 특징
    • 추상화 : 필요한 정보를 간소화, 추상화
    • 캡슐화 : 객체에 필요한 데이터나 기능을 그룹화 (은닉)
    • 상속 : 하위 - 가 상위 클래스의 기능을 사용하는 것, 중복 코드의 재사용성
    • 다형성 : 이러한 특징들을 종합해서, 객체의 관계를 유연하게 해준다

오버로딩,오버라이딩

  • 오버로딩 : 한 클래스 내의 메서드 중복 정의 (다른 인자)
  • 오버라이딩 : 상위 클래스의 메서드를 재정의

추상클레스와 인터페이스

우선, 자바는 복잡성과 충돌 가능성으로 인해 다중 상속을 지원하지 않습니다.

  • 추상 클레스와 인터페이스를 통해 추상화 하는 것은 다형성의 핵심 개념 중 하나 입니다.
  • 인터페이스와 추상 클래스의 추상 메서드는 이를 구현한 클래스에서 반드시 구현해야 합니다.(강제성을 가지고 있습니다)

인터페이스

interface / implements - 다중 구현이 가능
상수와 추상 메서드만으로 이루어져 있다. (빈 틀)
공통의 기능을 정의하여 구현한 객체가 같은 동작을 한다는 것을 보장합니다.
클래스간의 관계를 느슨하게 유지할 수 있습니다.

추상 클래스

abstract / extends
자신의 기능을 하위 클래스로 확장시키는 것입니다.
인터페이스와는 다르게 '클래스로서' 명확한 계층 구조가 필요할 때.
공통의 코드를 공유나 구체적인 구현 공유가 필요할 때 사용합니다.

▪ SOLID 원칙

  • Single : 단일 책임
    : 클래스를 변경하는 이유는 오직 하나여야 한다.
  • Open-Closed : 개방-폐쇄
    : 확장에는 열려있고, 수정에는 닫혀있다.
  • Liskov 치환
    : 하위 타입은 상위 타입을 대체할 수 있어야한다.(상위가 하위로 바뀌더라도 정상 작동)
  • Interface : 인터페이스 분리
    : 사용하지 않는 메서드에 의존하지 않도록 인터페이스를 작게 분리하는 것
  • Dependency Inversion: 의존 역전
    : 상위 모듈은 하위 모듈에 의존하지 않으며, 추상화(인터페이스)에 의존하도록 한다.

▪ 메모리 영역

1) Static Area (스태틱 메모리 영역 = Method Area)

  • static을 통해 field에 선언된 변수 데이터를 저장하는 영역

2) Stack Area (스택 메모리 영역)

  • 지역변수의 데이터 값이 저장되는 메모리 영역
    • 기본 자료형(int, double, byte, long, ...)의 경우 값이 저장
    • 참조형 타입 변수는 참조값만 저장된다.
      이 참조값(=인스턴스의 주소 값)은 Heap 영역에 있는 객체를 가르키는 역할을 한다.

3) Heap Area (힙 메모리 영역)

  • new 연산자를 통해 생성된 객체의 실제 데이터가 담기는 영역

💡 즉, Heap 은 참조형 데이터 객체의 실제 데이터들이 담기는 공간이고, Stack 영역의 객체는 Heap 영역의 참조 값이 갖게 된다.

👉🏻 메모리 영역

▪ 람다식

람다식은 익명 함수의 한 종류로서, 함수를 하나의 식으로 표현한 것입니다.
Stream API를 통해 효과적으로 사용할 수 있으며, 코드를 간결하게 나타내는 장점이 있습니다.

stream

흐름 을 통해

  • map : 기존의 값들을 지정한 요소를 값으로 새로운 stream을 생성하며 변환
  • sorted : 정렬 (기본값 - 오름차순)
  • collector : 값을 수집할 때 사용한다. ex)Collectors.toList()

0개의 댓글

관련 채용 정보