기술 면접(자바 1)

유요한·2023년 11월 8일
0

기술면접

목록 보기
1/27
post-thumbnail

면접 시 TIP

나의 대답이 맞는데도 고개를 갸웃한다거나 "정말요?"라고 확신이 있는지 이중체크하는 면접관도 있는데 이 때 만약 틀릴것 같아서 대답을 바꾼다면 감점입니다. 모르는 것은 모른다고하고 아는 것은 이 정도까지 안다며 겸손함을 보일 줄 알아야 합니다. 또한 모르는 것이 나왔을 때 바로 모른다고 대답하는 것이 아니라 어느 정도 고민후 대답할 줄 아는 침착함이 필요합니다. 공식 사이트를 봐야한다. 면접 전에 그 회사에 대해서 조사할 필요가 있습니다. 그 회사가 무엇을 지향하는지 숙지할 필요가 있습니다.

자신이 프로젝트에서 썻던 기술의 장점, 단점, 차이를 외우는 것이 좋습니다. 업무를 예측해야 합니다. 채용공고를 보면 업무에 관한 내용이 나와 있고 이를 통해 업무에 관한 것을 예측할 수 있는데 이를 예측하고 거기에 대한 답변을 준비해가는 것이 좋습니다.

정리

  • 지원하는 회사의 정보를 조사
  • 지원하는 업무의 정보를 조사
  • 프로젝트 사용했던 기술의 장, 단점
  • 공부했던 기술들의 지식

Java의 특징

  • Java는 객체지향 프로그래밍 언어입니다.
  • 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어입니다.

장점

  • JVM(자바가상머신)에서 동작하기 때문에 운영체제에 독립적이다.
  • GabageCollector를 통한 자동적인 메모리 관리가 가능하다.

단점

  • JVM 위에서 동작하기 때문에 실행 속도가 상대적으로 느리다.
  • 다중 상속이나 타입에 엄격하며, 제약이 많다.

JVM(Java Virtual Machine) : 자바 가상 머신

  • 자바로 만들어진 프로그램을 실행하는 os
  • 플랫폼 독립적인 실행 환경을 실행한다.
  • 자동 메모리 관리(GC)를 수행한다.

JRE(Java Runtime Environment) : 자바 런타임 환경

  • JVM을 실행하기 위한 자바 실행 환경
  • 자바 실행에 필요한 장비들을 가지고 있다.

JDK(Java Development Kit) : 자바 개발 킷

  • 자바 프로그램을 만들기 위한 개발 도구
  • 자바 개발에 필요한 라이브러리를 가지고 있다.

Java의 컴파일 과정에 대해 설명해주세요

  • 개발자가 .java파일을 생성한다.
  • build를 한다.
  • java compiler의 javac의 명령어를 통해 바이트코드(.class)를 생성한다.
  • Class Loader를 통해 JVM 메모리 내로 로드한다.
  • 실행엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석된다.


빌드

  • 배포(Deploy) 하기 위한 과정을 빌드
  • 소스 코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 과정과 그 결과를 말한다.
  • 사용자가 실행할 수 있는 파일 하나로 제공하기 위함
  • 프로그래밍 코드들을 압축해서 전체 크기를 줄인다.
  • 다른 사람이 알아보지 못하도록 난독화

작업하는 프로젝트 파일들을 출시하기 적합한 형태로 포장하는 일이라고 할 수 있습니다.


배포

코딩해서 빌드한 결과물을 사용자에게 전달하는 과정


ASIS

개발 전 단계, 즉 현재 시스템


TOBE

개발 이 후 바뀌는 것 또는 새로 신규 도입될 것


환경 변수

환경이란 건 소프트웨어가 동작하는 공간을 말합니다. 환경 변수란 컴퓨터마다 지정된 값입니다.


디버깅

소프트웨어에 발생하는 에러의 원인을 찾는 것


컴파일러

코드를 미리 번역해서 출시하면 컴파일 언어

컴파일

소스코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 작업


인터프리터

실행할 때마다 통역을 쓰면 인터프리터 언어


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

  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) : 의존 역전 원칙
    고수준 모듈은 저수준 모듈의 구현에 의존해서는 안됩니다.

객체지향 프로그래밍(OOP)란 무엇인가?

자바는 흔히 객체지향 프로그래밍 언어라고 합니다. 객체지향 프로그래밍이란 생활에 존재하는 것들 사이의 관계를 매핑하여 컴퓨터에 구현하고자하는 뜻에서 개발된 것이다. 객체지향은 인간이 구분할 수 있는 요소를 객체로 표현한 인간 중심적 프로그래밍 패러다임입니다. 객체지향 프로그래밍은 프로그래밍에서 필요한 데이터를 추상화 시켜 상태(변수)와 행위(메소드)를 가진 객체를 만들고 그 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다. 특징으로는 캡슐화, 상속, 다형성, 추상화 등이 있고, 모듈 재사용으로 확장 및 유지보수가 용이합니다.

객체지향 프로그래밍은 객체를 이용하는 프로그래밍 설계 기법입니다. 객체란 무형, 유형 모든것을 뜻합니다. 즉, 실제나 추상적인 것 모두를 뜻한다는 것인데 이러한 객체를 컴퓨터 프로그램에 생성하기 위해서 클래스라는 것에 객체가 어떤 정보를 갖고 어떻게 행동하는지 정의해야 합니다.

이제 OOP의 특징에 대해 자세히 말하자면, 상속, 다형성, 추상화, 캡슐화 이렇게 4가지 특징이 있습니다.

  1. 상속
    클래스 사이에서 관계가 발생할 수 있다. 쉽게 말하자면, 부모 클래스와 자식클래스 처럼 부모와 자식의 관계처럼 관계가 발생하는 것입니다. 여기서 같은 기능을 할 때, 같은 기능을 또 만들 필요 없이 부모 클래스에서 구현한 것을 가져다가 사용하면 됩니다. 부모가 자식에게 DNA를 물려주듯 공통적인 속성을 부모 클래스를 자식 클래스가 상속받아 사용하는 것입니다. 이렇게 상속받아 사용하면 중복된 코드를 작성할 필요가 없어서 중복성을 최소화할 수 있습니다.

  2. 다형성
    다형성은 같은 모양의 코드가 다른 기능을 하는 것을 의미합니다. 다형성을 활용하는 방법은 두 가지가 있습니다.

1) 오버로딩(Overloading)

오버로딩은 하나의 클래스에 같은 이름의 메소드를 여러개를 구현하는 것입니다. 이름은 같지만 매개 변수의 개수나 매개 변수의 타입이 달라야 합니다. 컴퍼일러는 매개변수로 메소드를 구분하기 때문에, 매개 변수가 같고 메소드의 반환형(리턴 타입)이 다르면 동작하지 않습니다.

2) 오버라이딩(Overriding)

오버라이딩은 부모 클래스에서 상속받은 메소드를 서브 클래스에서 새롭게 재정의하는 것을 의미합니다. 부모 클래스의 메소드가 가진 이름, 매개 변수와 똑같은 메소드를 자식 클래스에서 새롭게 재정의 하는 것입니다. 같은 메소드지만 부모 클래스에서와 자식 클레스에서의 역할은 다릅니다.

  1. 추상화
    객체를 만드는 과정에서 공통된 부분을 추출하여 추상화하는 것이다. 예를들어 남/여를 추상화하면 공통적인 부분인 인간이라는 개념을 만드는 것이다. 재사용을 고려해서 설계된 개념이다. 추상화는 사물들의 공통적인 특징을 파악해서 하나의 개념으로 묶는 것입니다. 다시 말하면, 객체의 공통적인 특징을 파악해서 속성과 기능을 추출하는 것입니다.

  2. 캡슐화
    캡슐화는 데이터와 코드 형태를 외부로부터 알 수 없게 하고 데이터의 구조와 역할 기능을 하나의 형태로 묶어주는 방법입니다. JAVA의 경우 접근 제어자(private)를 통해 데이터를 보호하고 getter를 통해 데이터를 얻고 setter를 통해 간접적으로 데이터를 변경할 수 있습니다. 불필요한 정보를 감출 수 있기 때문에 정보를 은닉할 수 있다는 특징이 있습니다.

OOP의 장점은 코드의 재사용성 증가, 중복된 코드 작성이 최소화, 생산성이 향상되고 자연스러운 모델링이 가능하며 효율적인 유지보수가 가능해집니다.


try-with-resources에 대해 설명해주세요.

  • try-with-resources는 try-catch-finally의 문제점을 보완하기 위해 나온 개념입니다.

  • try( ... ) 안에 자원 객체를 전달하면, try블록이 끝나고 자동으로 자원 해제 해주는 기능을 말합니다.

  • 따로 finally 구문이나 모든 catch 구문에 종료 처리를 하지 않아도 되는 장점이 있습니다.


불변 객체가 무엇인지 설명하고 대표적인 JAVA의 예시를 설명해주세요

  • 불변 객체는 객체 생성 이후 내부의 상태가 변하지 않는 객체를 말합니다.
  • Java에서는 필드가 원시 타입인 경우 final 키워드를 사용해 불변 객체를 만들 수 있고, 참조 타입일 경우 추가적인 작업이 필요합니다.

추가적인 작업

참조 타입은 대표적으로 객체를 참조할 수도 있고, 배열이나 List 등을 참조할 수 있습니다.

  1. 참조 변수가 일반 객체인 경우 객체를 사용하는 필드의 참조 변수도 불변 객체로 변경해야 합니다.
  1. 배열일 경우 배열을 받아 copy해서 저장하고, getter를 clone으로 반환하도록 하면 됩니다.

    배열을 그대로 참조하거나, 반환할 경우 외부에서 내부 값을 변경할 수 있음. 때문에 clone을 반환해 외부에서 값 변경하지 못하게 함

  1. 리스트인 경우에도 배열과 마찬가지로 생성시 새로운 List를 만들어 값을 복사하도록 해야 합니다.

배열과 리스트는 내부를 복사하여 전달하는데, 이를 방어적 복사(defensive-copy)라고 합니다.

불변 객체나 final을 굳이 사용해야 하는 이유가 있을까요?

불변 객체나 final 키워드를 사용해 얻는 이점은 다음과 같습니다.

  1. Thread-Safe하여 병렬 프로그래밍에 유용하며, 동기화를 고려하지 않아도 된다.

    공유 자원이 불변이기 때문에 항상 동일한 값을 반환하기 때문

Thread-Safe

멀티 쓰레드 프로그래밍에서, 어떤 공유 자원에 여러 쓰레드가 동시에 접근해도, 프로그램 실행에 문제가 없는 상태를 의미합니다.

  1. 실패 원자적인 메소드를 만들 수 있다.

    어떠한 예외가 발생되더라도 메소드 호출 전의 상태를 유지할 수 있어 예외 발생 전과 똑같은 상태로 다음 로직 처리 가능

  1. 부수효과를 피해 오류를 최소화 할 수 있다.

    ※ 부수효과 : 변수의 값이 바뀌거나 객체의 필드 값을 설정하거나 예외나 오류가 발생하여 실행이 중단되는 현상

  2. 메소드 호출 시 파라미터 값이 변하지 않는다는 것을 보장할 수 있다.

  3. 가비지 컬렉션 성능을 높일 수 있다.

    가비지 컬렉터가 스캔하는 객체의 수가 줄기 때문에 GC 수행 시 지연시간도 줄어든다.

final이란?

모든 변수, 클래스, 메소드 등의 앞에 사용가능하고 기본적인 개념은 최종이라는 개념을 가지고 있습니다. final을 붙이면 상수가 된다. 클래스에 붙이면 상속이 불가능한 클래스가 되고 메소드에 사용시 오버라이딩을 할 수 없습니다.

JAVA의 final 키워드 (final/finally/finalize)

final 키워드

  • 개념
    변수나 메서드 또는 클래스가 변경 불가능하도록 만든다.

  • 원시 (Primitive) 변수에 적용시
    해당 변수의 값은 변경이 불가능 하다.

  • 참조 (Reference) 변수에 적용시
    참조 변수가 힙(heap)내의 다른 객체를 가리키도록 변경할 수 없다.

  • 메서드에 적용 시
    해당 메서드를 Override 할 수 없다.

  • 클래스에 적용 시
    해당 클래스의 하위 클래스를 정의 할 수 없다.

finally 키워드

  • 개념
    try/catch 블록이 종료될 때 항상 실행될 코드 블록을 정의하기 위해 사용한다.

  • finally 는 선택적으로 try 혹은 catch 블록 뒤에 정의할 때 사용한다.

  • finally 블록은 예외가 발생하더라도 항상 실행된다.

    단, JVM이 try 블록 실행 중에 종료되는 경우는 제외한다.

  • finally 블록은 종종 뒷 마무리 코드를 작성하는데 사용된다.

  • finally 블록은 try 와 catch 블록 다음과, 통제권이 이전으로 다시 돌아가기 전 사이에 실행된다.

finalize() 메서드

  • 개념
    쓰레기 수집기 (GC, Garbage Collector) 가 더이상의 참조가 존재하지 않는 객체를 메모리에서 삭제하겠다고 결정하는 순간 호출된다.

  • Object 클래스의 finalize() 메서드를 오버라이드해서 맞춤별 GC를 정의할 수가 있다.


직렬화란?

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

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


박싱과 언박싱이란?

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


Synchronized(동기화)란?

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

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

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


자바의 메모리 영역에 대해 설명해주세요.

  • 자바의 메모리 공간은 크게 Method 영역, Stack 영역, Heap 영역으로 구분되고, 데이터 타입에 따라 할당됩니다.

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

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

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

💡각 메모리 영역이 할당되는 시점은 언제인가요?

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

  • Stack 영역
    컴파일 타임 시 할당

  • Heap 영역
    런타임시 할당

※ 컴파일 타임
소스코드가 기계어로 변환되어 실행가능한 프로그램이 되는 과정

※ 런타임
컴파일 타임 이후 프로그램이 실행되는 때


컬렉션 프레임워크란?

컬렉션 프레임워크란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다. 컬렉션 프레임워크에서는 데이터를 저장하는 자료 구조에 따라 다음과 같은 핵심이 되는 주요 인터페이스를 정의하고 있습니다.

  1. List 인터페이스

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

  2. Set 인터페이스

    순서가 없는 데이터의 집합, 데이터의 중복 허용하지 않음

  3. Map 인터페이스

    키와 값이 한 쌍으로 이루어져 있는 데이터의 집합, 순서가 없고 키는 중복을 허용하지만 값은 중복되지 않음

💡List와 Map의 차이점은?

  • Map은 검색할 수 있는 인터페이스이고, 데이터를 삽일할 때 Key와 Value의 형태로 삽입되어, Key를 이용해서 Value를 얻을 수 있다. 데이터 순서를 보장하지 않고, Key값은 중복 허용X , Value값은 중복 허용

  • List는 순서가 있는 Collection이고, 데이터 중복이 허용된다.

  • List와 Map의 차이점은 List는 데이터 순서를 보장하지만, Map은 순서를 보장하지 않는다.

💡컬렉션 프레임워크를 사용하는 가장 큰 이유

실행중에 크기를 변경할 수 없는 배열과 달리 실행중에 데이터의 크기를 동적으로 마음데로 변경이 가능하다. 즉, 이것은 실행중 데이터의 삽입/수정/삭제/추가에 대한 유연성이 높다는 것이다.

💡언제 Set 또는 List를 사용해야 할까요?

  • 저장되는 데이터의 순서를 보장해야한다면 List를 사용해야 합니다.

  • contains(element)는 Collection에 데이터가 존재하는지 확인하는 메소드입니다.

  • List의 contains 실행 속도는 O(n)이지만, Set는 O(1)으로 매우 빠릅니다.

  • 탐색이 잦다면 Set를 고려해볼 수 있습니다. 데이터가 많지 않다면 성능보다, 구조가 간단한 List를 고려해볼 수 있습니다.

  • 중복을 허용하지 않는 Collection이 필요하다면 Set를 고려해볼 수 있습니다.


CheckedException과 UnCheckedException의 차이


new String()과 “”의 차이

Java에서 문자열은 Heap 영역 내의 String Pool이라는 곳에서 따로 관리하게 됩니다. ""으로 선언된 String은 String Pool에 추가가 되고 해당 값을 참조 값으로 가지게 됩니다.

반면 new String()으로 생성된 String은 String Pool이 아닌 Heap 영역에 새로운 객체를 등록하게 됩니다.

즉, 위 두 방법으로 객체를 생성하였을 경우 각 객체의 메모리상의 위치가 다른 것입니다.

new를 붙여주는 의미?

new라는 키워드는 메모리에 새로운 저장공간을 만들어달라는 의미이다.
정확히는 힙 메모리에 새로운 저장공간을 만들어달라고 하는 것이다.


클래스(Class) 란?

변수함수를 사용하기 편리하게 재사용이 가능하도록 모아 놓은 것이고 객체를 생성하는데 사용한다. 클래스는 객체의 상태를 나타내는 필드와 객체의 행동을 나타내는 메소드로 구성된다. 클래스는 추상화라는 개념을 직접 구현한 것이다.


객체란?

  • 실제로 존재하는 사물 또는 개념을 구체화한 물체
  • 설계도로 구현한 모든 대상

인스턴스란?

클래스가 붕어빵 틀이라면 그 틀을 통해 생성된 객체(붕어빵) 하나 하나를 해당 클래스의 인스턴스(Instance)라고 부른다. Java 프로그램 실행 시 클래스는 JVM 메모리의 클래스 영역(Class Area)에 로드되고 이 클래스를 사용하여 힙 영역(Heap Area)에 새로운 인스턴스(객체)를 생성할 수 있다. 즉, 인스턴스란 현실의 객체를 소프트웨어 내에서 구현한 실체라고 볼 수 있다. 이렇게 생성된 인스턴스들은 각자 고유의 특성을 가지고 독립적으로 존재한다.

객체 VS 인스턴스

  • 클래스의 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.
  • 객체는 현실 세계에 가깝고, 인스턴스는 소프트웨어 세계에 가깝다.
  • 객체는 실체, 인스턴스는 관계에 초점을 맞춘다.
    객체를 클래스의 인스턴스라고도 부른다.

생성자란?

메소드와 동일한 기능을 가지고 있으며 객체를 생성시 초기화를 담당하고 있다. 하지만 리턴을 할 수 없기 때문에 메소드라고는 부르지 않는다. 생성자는 객체화의 목적과 초기화의 목적을 가지고 있다.

profile
발전하기 위한 공부

0개의 댓글