[기술면접] JAVA

ryudjae
|2022. 1. 24. 00:57
728x90

자바의 실행 과정

  1. 자바 소스 파일을 javac로 컴파일하여 클래스 파일을 생성함
  2. 클래스 로더가 컴파일된 자바 바이트코드를 런타임 데이터 영역으로 로드함
  3. 실행 엔진이 자바 바이트 코드를 실행함

자바의 장단점

장점

  • 자바는 자바 가상 머신에서 동작하기 때문에 OS에 독립적이다.
  • 가비지 컬렉터가 메모리를 관리해주기 때문에 편리하다.
  • 스프링과 같은 자바를 지원하는 많은 오픈소스 프로젝트가 존재해서 짧은 개발 시간 내에 안정적인 프로그램 구현이 가능하다.

 

단점

  • 자바 가상 머신에서 동작하기 때문에 실행 속도가 상대적으로 느리다.
  • 다중 상속이나 타입에 엄격한 제약이 있는 것들이 많다.

 

JVM 구조

  • 메서드 영역 :  static 변수, 전역 변수,  class 정보들 저장
  • 스택 영역 : 지역변수, 함수 등이 할당
  • 힙 영역 : new 연산자를 통한 동적 할당된 객체 저장. 가비지 컬렉션에 의해 관리됨
  • PC 레지스터 : 현재 스레드가 실행되는 부분의 주소와 명령을 저장한다.
  • Native Method Stack : 자바 외의 언어로 작성된 코드를 위한 메모리 영역이다.

pojo란 무엇인가

Plain Old Java Object. 간단히 포조라는 말 그대로 해석하며 오래된 방식의 자바 오브젝트로서 J2EE 등의 중량 프레임워크들을 사용하면서 해당 프레임워크에 종석 된 무거운 객체를 만들게 된 것에 반발하여 특정 자바 모델이나 기능, 프레임워크 등을 따르지 않는 자바 오브젝트를 지칭하는 말로 사용되었다.



Primitive type , Reference type

  • 기본형(primitive type) :  스택 메모리 영역에 실제 값을 저장하는 데이터 타입. byte, float, int, long, string, double, char, boolean // call by value(값 호출) 방식 사용
  • 참조형(reference type) : 메모리 상에 객체가 있는 위치를 저장하는 것. String, 클래스, 인터페이스, new 연산자로 정의. 실제 값은 힙 영역에 저장되고 스택 영역에는 주소만 저장됨 call by reference(주소 호출) 방식 사용

Garbage Collector

가비지 컬렉터는 더 이상 참조되지 않는 메모리를 청소해주는 JVM의 실행 엔진의 한 요소이다. JVM은 new와 같은 연산에 의해 새롭게 생성된 객체들 중에 더 이상 참조되지 않는 객체를 정리해준다. 가비지 컬렉터는 Heap 영역을 위주로 탐색하여 메모리를 정리한다.

전역 변수 , 지역변수

전역변수 :  함수 바깥에 선언하여 클래스 전체에서 사용 가능한 변수. 여러 메소드에서 공통적으로 사용가능

지역변수 :  함수 내부에서 선언하여 해당 함수 속에서만 사용 가능한 변수

static

정적 멤버 : 메모리 공간 할당 시 처음 설정된 메모리 공간이 변하지 않는 것

객체를 생성하지 않고도 사용할 수 있는 필드와 메서드. 객체마다 가지고 있을 필요가 없는 공용적인 데이터라면 static으로 선언

 

String, StringBuilder, StringBuffer

  • String은 new 연산자를 통해 생성하게 되면 메모리 공간이 절대 변하지 않으므로 연산 시 메모리의 값이 변하는 것이 아니라 새로운 String인스턴스가 생성된다. 이러한 상황이 발생하면 가비지 컬렉터에 의해 제거되야하고 연산이 많아지면 성능이 저하된다.
  • StringBuilder, StringBuffer는 새로운 인스턴스를 생성하는 것이 아닌 메모리의 값을 변경하므로 문자열 연산이 자주 있을 때 사용하면 좋다.
  • StringBuffer는 멀티 스레드 환경에서 동기화가 가능하다. 그러나 StringBuilder는 동기화를 지원하지 않기 때문에 멀티 스레드 환경에서 적합하지 않다.

접근 제한자

  • public : 모든 클래스 접근 가능
  • protected : 같은 패키지, 해당 클래스를 상속받은 외부 패키지의 클래스 접근 가능
  • private : 같은 클래스에서만 접근 가능
  • default : 같은 패키지에서만 접근 가능

클래스/ 인스턴스

  • 클래스 : 객체를 만들어내기 위한 설계도 혹은 툴
  • 인스턴스 : 객체에 메모리가 할당되어 실제로 활용되는 실체
  • 객체 : 클래스를 기반으로 선언된 대상
  • + wapper class : 기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스를 래퍼 클래스(Wrapper class)라고 한다.

상속

  • 부모 클래스가 가지고 있는 상수, 메서드를 자식 클래스에서 물려 받아 같이 공유하면서 확장하는 것
  • 자식 클래스의 부모클래스 메서드 재정의

캡슐화

  • 객체의 필드(속성), 메소드를 하나로 묶고, 실제 구현 내용을 외부에 감추는 것을 말한다.
  • 외부 객체는 객체 내부의 구조를 얻지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다.

다형성

하나의 객체 여러 가지 타입을 가질 수 있는 것을 의미한다. 자바에서는 다형성을 부모 클래스 타입의 참조변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 구현.

추상 클래스와 인터페이스

  • 추상클래스 
    • 추상 메서드를 하나 이상 가진 클래스
    • 직접적으로 객체 생성이 불가능하고 클래스를 상속받아 오버 라이딩을 하여 사용해야 함
    • 추상 메서드와 일반 메서드 모두 선언 가능
  • 인터페이스
    • 모든 메서드가 구현부가 없는 추상 메서드로 이루어진 클래스
    • 다중 구현이 가능하다.
    • 상수만 선언할 수 있다.

오버 로딩과 오버 라이딩

  • 오버 라이딩 : 상위 클래스가 가지고 있는 메서드를 하위 클래스에서 재정의하여 사용하는 기술
  • 오버 로딩 : 매개변수 타입과 개수를 변경하면서 같은 이름의 메서드를 여러 개 사용하는 기술

Generic(제너릭)

클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법

객체 타입을 컴파일 시에 확인하고 형 변환을 하지 않아도 되기 때문에 코드의 안정성과 재사용성을 높여준다.

Stream API

  • stream API는 자바 8부터 추가된 기능으로 컬랙션, 배열등의 저장 요소를 하나씩 참조하며 함수형 인터페이스를 적용하며 반복적으로 처리할 수 있도록 해주는 기능이다.
  • 스트림을 사용하면 코드를 간결하게 작성하여 가독성을 높일 수 있다.
  • 그러나 잘못 사용하면 기존의 자바 방식보다 오히려 성능이 떨어질 수 있다.

JAVA Collection

  • Set : 순서를 유지하지 않는 데이터의 집합으로 중복을 허용하지 않는다.
    • HashSet : 가장 빠른 임의 접근 속도, 순서 예측불가
    • TreeSet : 정렬방법 지정 가능
  • Map : Key-Value의 쌍으로 이루어진 데이터 집합으로 순서가 유지되지 않으며 값의 중복은 value만 허용한다. 
    • HashMap : 중복이 안되고 순서가 없다. null값 가능
    • Hashtable : HashMap보다 느리지만 동기화 지원. null불가
    • TreeMap : 정렬된 순서대로 key-value를 저장해서 검색이 빠름
  • List : 순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다. 
    • ArrayList : 단방향 포인터 구조로 각 데이터마다 인덱스를 가지고 있어 조회 성능이 뛰어남
    • LinkedList :  양방향 포인터 구조로 삽입, 삭제가 빈번할 경우 위치 정보만 수정하면 되기 때문에 유용하다.
    • Vector : 내부에서 자동으로 동기화 처리가 일어나 비교적으로 성능이 좋지 않고 무거움

 

Synchronized

자바에서 지원하는 synchronized 키워드는 여러 스레드가 하나의 자원을 이용하고자 할 때, 한 스레드가 해당 자원을 사용 중인 경우, 데이터에 접근하지 못하도록 막는 키워드이다.

  • 메서드 Synchronized :  한 시점에 하나의 스레드만이 해당 메서드를 실행할 수 있다.
  • 변수 Synchronized : 한 시점에 하나의 스레드 만이 해당 변수를 참조할 수 있다.

싱글톤

  • 하나의 클래스에 대해 하나의 인스턴스만 만들어서 사용하기 위한 패턴이다.
  • 해당 인스턴스가 정대적으로 1개만 존재한다는 것을 보증하고 싶은 경우나 동일한 인스턴스를 자주 생성해주어야 하는 경우 사용한다.
  • 하지만 이러한 싱글톤 패턴은 객체 지향 설계의 원칙에 적합하지 않으며, LifeCycle 제어가 힘들고, 멀티스레드 환경에서 여러 개의 객체가 생성되는 문제가 발생할 수 있습니다. 그러한 이유로 멀티스레드 환경이라면 static 앞에 synchronized 키워드를 붙여 동기화 작업을 추가해주어야 합니다.

더보기

Thread-safe 멀티 스레드 환경에서 동작해도 원래 의도한 형태로 동작하는 코드

직렬화

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

Servlet , JSP

  • Servlet : 자바 언어로 웹 개발을 위해 만들어진 것으로, 컨테이너가 이해할 수 있게 구성된 순수 자바 코드로만 이루어진 것이다.
  • JSP : html 기반에 자바 코드를 블록화 하여 삽입한 것으로 Servlet을 좀 더 쉽게 접근할 수 있도록 만들어진 것이다.

JDBC

JDBC는 자바에서 DB의 종류에 상관없이 데이터 베이스에 더욱 쉽게 접근할 수 있도록 하는 API

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

현실 세계를 프로그래밍으로 옮겨와 현실세계의 사물들을 객체로 보고, 그 객체로부터 개발하고자 하는 특징과 기능을 뽑아와 프로그래밍하는 기법이다.

 

OOP 장점

  • 유지보수가 용이하다.
  • 캡슐화, 상속 , 다형성 등과 같은 기법을 이용할 수 있다.

OOP의 5가지 설계 원칙

  • SRP(Single Responsibility Principle, 단일 책임원칙) : 클래스는 단 하나의 목적을 가져야 한다.
  • ISP(Interface Segregation Principle, 인터페이스 분리 원칙) :  클라이언트는 이용하지 않는 메서드에 의존하지 않도록 인터페이스를 분리하여야 한다.
  • LSP(Liskov Substitution Principle, 리스 코프 치환 원칙) :  상위 타입 객체를 하위 타입으로 바꿔도 프로그램은 일관되게 동작해야 한다.
  • OCP(Open-Close Principle, 개방 폐쇄 원칙) : 클래스 확장에는 열려있고, 변경에는 닫혀 있어야 한다.
  • DIP(Dependency Inversion Principle, 의존 역전 법칙) : 클라이언트는 추상화에 의존해야 하며, 구체화에 의존해선 안된다.

 

728x90