본문 바로가기
  • Where there is a will there is a way.
개발일기

개발자 인터뷰 준비

by 소확행개발자 2020. 3. 6.

 

intro.
동료 개발자는 연마다 면접을 통해서 자기가 얼마나 성장했는지 테스트 해본다고 한다.
많이 털려봐야 부족한 점을 알고 공부하는 자극제가 되기도 하는 것 같다.

 

 

자바 기본

1. 프리미티브타입 (원시타입) 레퍼런스타입 (참조타입) 

자바 jvm 메모리는 3가지 영역으로 나뉘어 진다.

  • 클래스를 저장하는 공간 ( method 영역 )
    • 인스턴스 메소드는 객체마다 존재하지 않고 메소드 영역에 저장되고 공유된다.
  • 힙영역 참조타입이 저장되는 공간
    • 배열
    • 객체 ( String / Integer / Long / .. 등등 )
    • 스텍에 참조하는 데이터가 없을 경우에 가비지 컬렉터가 지운다.
      • 가비지 컬렉터는 수시로 수행되거나 힙 영역에 메모리가 찼을경우에 실행된다.
        • 가장 먼저 생성되는 Young 영역 ( 3개 영역 )  
          • Eden 영역 
            • 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
            • Eden 영역에서 살아남은 객체는 Survivor 영역 중 하나로 이동된다.
          • Survivor 영역 ( 2개 )
            • Survivor 영역 한구데가 가득차면 다음 다음 영역으로 이동한다.
            • 이 과정을 계속해서 살아남아 있는 객체는 Old 영역으로 이동하게 된다.
          • 해당 영역에서 발생되는 GC 를 Minor GC 라고 한다. 
        • Old 영역
          • 생명 주기가 긴 "오래된 객체" 를 GC 대상으로 하는 영역이다.
          • 해당 영역에서 발생되는 GC 를 Major GC 라고 한다
      • 메모리를 고려한 개발이 이루어져야 한다.
    • java 의 enum 같은 경우도 method 영역 
    • Wrapper 클래스의 경우도 힙메모리에 저장되는데 포장객체의 특징은 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없다는 것이다. 만약 내부의 값을 변경하고 싶다면 새로운 포장 객체를 만들어야 한다.
  • 원시타입이 저장되는 스텍 공간
    • 스텍은 스레드 별로 생성된다.
    • 메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행한다
  • 정적 멤버는 클래스에 고정된 멤버로 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말함.
    • 정적 멤버는 객체에 소속된 멤버가 아니라 클래스에 소속된 멤버다
    • 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리된다. 따라서 클래스 로딩이 끝나면 바로 사용할 수 있다.
  • final class , final method , final 변수를 만드는 이유는 멀까?
    • final 클래스 상속하지 못하게 막음
    • final method 오버라이딩 못하게 막음
  • hashCode() 와 Equals() 를 사용하는 이유와 어디서 사용하는지?

 

싱글톤

  • 가끔 전체 프로그램에서 단 하나의 갹체만 만들도록 보장해야 하는 경우가 있는데 그럴 때 사용한다. 
  • 이뮤터블 변수를 사용할때도 응용이 가능하고 spring bean 생성할때도 사용한다.

 

제네릭

 

  • 제네릭을 사용하게 되면 컴파일 시 강한 타입체크를 할 수 있다.
  • 타입 변환을 제거한다.
    • 제네릭 타입
      • 제네릭 타입은 클래스 뒤에 <T> 가 붙는다.
      • 타입이 Object object = 자바 객체 라고 표현하게 되면 자동 타입변환으로 스택영역에 있는 파람들이 힙영역의 자식객체를 바라보게 된다.
      • 제네릭 타입 메소드 <T> 가 메소드 앞에 붙는다.
      • 제한된 타입 파라미터 사용가능 <T extends Number> -> Number 는 example
    • 와일드 카드 타입
      • 코드에서 ?를 일반적으로 와일드 카드 라고 부른다. 

컬렉션

  • 컬렉션
    • List
      • ArrayList
      • Vector
      • LinkedList
    • Set
      • HashSet
      • TreeSet
  • Map
    • HashMap
    • HashTable
    • TreeMap
    • Properties

익명 객체 람다식

  • 객체지향 프로그래밍과 함수적 프로그래밍을 혼합해서 효율적인 프로그래밍을 하기위해 나옴
  • 병렬 처리와 이벤트 지향 프로그래밍에 좀더 적합하다.
  • 익명 객체
    • 매개변수나 로컬변수는 메소드 실행이 끝나면 스택 메모리에서 사라지는데 functional 프로그래밍 힙메모리에서는 사라지지 않기 때문에 fuctional programing 에 사용하는 로컬 변수는 final 로 선언해야 한다. 하지만 자바 8 부터는 없어도 내부적으로 final 로 작동한다
    • 인터페이스에는 무조건 하나의 abstract 메소드만 있어야하고 상황에 따라서 디폴트 메소드는 존재할 수 있다.

 

스트림

  • 스트림은 Iterator 와 비슷한 역할을 하는 반복자이지만, 람다식으로 요소 처리 코드를 제공하는 점과 내부 반복자를 사용하므로 병렬 처리가 쉽다는 점 그리고 중간 처리와 최종 처리 작업을 수행하는 점에서 많은 차이를 가지고 있다. 
  • 개발자가 외부 반복자를 사용하는 것 보다 내부 반복자를 사용해서 효율적으로 요소를 반복시킬 수 있다.
  • 스트림은 중간처리와 최종 처리를 수행할 수 있다. 중간 처리에서는 매핑, 필터링, 정렬을 수행하고 최종 처리에서는 반복, 카운팅, 평균, 총합 등의 집계 처리를 수행한다.
  • 병렬 처리
    • 병렬처리란 멀티 코어 cpu 환경에서 하나의 작업을 분할해서 각각의 코어가 병렬적으로 처리하는 것을 말한다. 병렬 처리의 목적은 작업 처리 시간을 줄이기 위한 것이다.
    • 자바 8부터 요소를 병렬 처리할 수 있도록 하기 위해 병렬 스트림을 제공하기 때문에 컬렉션의 전체 요소 처리 시간을 줄여 준다.
    • 동시성과 병렬성의 차이
      • 동시성은 core 1개에 작업 여러개
      • 병렬성은 코어 갯수 작업 갯구 비례
    • 데이터 병렬성
      • 전체 데이터를 쪼개어 서브 데이터들로 만들고 이 서브 데이터들을 병렬 처리해서 작업을 빨리 끝내는 것을 말한다.
      • 자바 8에서 지원하는 병렬 스트림은 데이터 병렬성을 구현한 것이다.
      • 멀티 코어의 수만큼 대용량 요소를 서브 요소들로 나누고, 각각의 서브 요소들을 분리된 스레드에서 병렬 처리시킨다.
    • 작업 병렬성
      • 서로 다른 작업을 병렬 처리하는 것을 말한다.
      • 대표적으로는 웹서버

객체 지향 설계 ( oop )

스레드

  • 구현하는데 2가지 방법이 존재함
    • runnable interface 를 구현한 뒤에 thread class 생성자에 주입하는 방식
    • thread 클래스를 상속한 뒤에 run() 을 구현하는 방식
  • runnable vs thread 상속
    • runnable 을 선호함
      • 자바는 다중 상속을 지원하지 않기 떄문에

 

알고리즘

 

  • bigO 표기법
    • 시간복잡도
    • 공간복잡도
      • 메모리 사용에 따른 복잡도
  • 정렬
    • 버블 소트 , 향상 된 버블 소트 
    • 합병 정렬
    • 퀵 소트
  •  탐색,그래프
    • 이진탐색
    • 깊이 우선 탐색
    • 넓이 우선 탐색
  • 스택 ( arrayList , LinkedList )
  • Queue ( LinkedList ) , 우선순위 큐
  • 그리드
    • 다익스트라

 

 

스프링

  • 서블릿 서블릿 컨테이너 웹 서버 애플리케이션
    • spring boot 는 tomcat 이 내장되어 있어서 따로 설치하지 않아도 된다.
    • 서블릿은 웹서비스를 위한 자바 인터페이스로 main 메소드가 존재하지 않고 서블릿 컨테이너가 네트워크 통신 및 서블릿의 생명 주기, 스레드 기반 처리를 대신해준다. 
      • 즉 request 가 들어오면 컨테이너가 서블릿의 서비스 메소드를 호출해서 요청을 처리하게 해준다. 대표적인 서블릿 컨테이너가 tomcat 이다.
    • 웹서버 애플리케이션 
      • 웹서버는 정적인 컨텐츠를 내려준다.
      • 웹 애플리케이션 서버는 동적인 컨텐츠를 준다.
        • 웹서버가 정적인 컨텐츠를 미리 내려주어 부하를 줄일 수 있다.
        • 클라이언트가 직접 애플리케이션 서버에 연결되어있지 않으므로 보안적으로의 의미도 있다.
        •  
    • tomcat 은 자바 파일을 컴파일해서 .class 파일로 만들고 서블릿 객체를 만들어서 메모리에 올린다. 
    •  
  • 생성자 주입방식과 @Autowired 방식중 생성자 주입방식을 선호하는 이유
    • NullPointerException 을 방지할 수 있다.
    • 주입받을 필드를 final 로 선언 가능하다.
    • 컴파일시 순환참조 방지할 수 있다.
  •  

데이터 베이스 및 JPA

 

rdb ( sql ) vs nosql

  • sql
    • 명확하게 정의 된 스키마, 데이터 무결성 보장
    • 수직적 확장만 가능함 ( 수직적 확장이란 ? 물리적 성능을 올리는 걸 말한다. )
    • join 문이 많은 복잡한 쿼리가 가능하다. ( 장점? 이자 단점 )
  • nosql
    • 스키마가 없고 컬렉션으로 관리, 상대적으로 유연함
    • 데이터를 읽어오는 속도 상대적으로 빠름
    • 수평적 확장이 가능함.
    • 데이터 중복이 가능함. 따라서 업데이트가 느림
  • 트랜잭션
    • 트랜잭션은 하나의 논리적 작업단위 라고 할 수 있다.
      • acid
      • 원자성 : 트랜잭션 내의 모든 연산이 적용되거나 적용되지 않아야 한다.
      • 일치성 : 트랜잭션 수행 전 DB가 무결한 상태였다면 트랜잭션 수행 후에도 DB는 무결한 상태여야 한다.
      • 고립성 : 여러 트랜잭션이 동시에 실행되고 있어도 사용자는 자신의 트랜잭션만 실행되고 있다고 느껴야 한다.
      • 지속성 :  : 완료된 트랜잭션의 결과는 시스템 장애가 발생하더라도 DB에 반영되어야 한다.
    • 트랜잭션의 상태는 
      • 수행 중 / 부분완료 / 완료 / 실패 / 철회 상태가 있다.
    • 직렬 가능성
      • 컴퓨터 자원을 효율적으로 사용하기 위해 트랜잭션들을 동시 실행할 수 있다. 이 때 트랜잭션을 잘 실행시키기 위해 동시성 제어를 한다
      • Dirty Read
        • 아직 완료되지 않은 값을 읽는 문제
      • Lost Update
        • 어떤 트랜잭션에서 수정한 값을 다른 트랜잭션에서 수정해버려서 이전의 갱신을 읽게되는 문제
      • Unrepeatable read
        • 한 트랜잭션이  처음 읽은 값과 나중에 다시 읽었을 때의 값이 달라지는 문제
      • 이 세가지를 방지하려면
        • 동일한 데이터에 대한 연산이 이뤄질 때, 최소 하나의 연산이 쓰기 연산이면 두 연산은 충돌한다.
        • 동일한 데이터가 아니면 충돌이 아니고, 두 연산이 모두 읽기 연산이어도 충돌이 아니다.
        • 스케쥴에서 비 충돌 연산의 순서를 바꾸어 직렬 스케줄이 되면 충돌 직렬 가능 스케줄이라고 한다.
        • 뷰 동치에 대해서 좀 알아봐야 한다.
          • 같은값을 읽고
          • 하나의 트랜잭션이 쓰기를 했다면 두번째가 그걸 읽는다 
          • 그리고 마지막 쓰기 연산 스케줄러가 동일하다
      • 다른 직렬 가능한 스케줄을 찾는 것은 복잡한 계산을 필요로 한다. 
      • 추가로 회복가능 스케줄 등등
    • 동시성 제어
      • 이런 스케줄은 트랜잭션 전체의 연산을 미리 알지 못하기 대문에 이미 트랜잭션을 실행한 뒤에야 어떤 스케쥴인지 판별 가능하다. 그렇기 때문에 어떠한 규약을 통해 실행하면 원하는 스케쥴대로 실행되게 하는 규약을 찾아야 한다.
      • lcok
        • lock based Protocol
        • 트랜잭션은 모든 읽기/쓰기 연산을 하기 전에 락을 먼저 획득해야 한다. 호환 불가능한 락을 얻으려 할 때는 이전의 락이 풀릴 때까지 기다렸다가 락을 받은 뒤에야 연산을 수행할 수 있다.
    • 트랜잭션 고립성 제어
      • 일치성의 수준이 조금 떨어지더라도 시스템의 성능이 더 향상되는 것을 원할 수도 있다.
      • 트랜잭션을 선언할 때 성능을 위해 고립성 수준을 선택할 수도 있다.
      • Read uncommitted 방식은 읽기 연산에서 LOCK 을 잡기 않기 때문에 읽은 데이터에 신빙성이 전혀 없다.
        • 하지만 데이터 집계 연산 같은 작업을 위해서는 유용하게 쓰일 수 있다. 
      • Read Committed의 경우에는 록을 잡고 읽은 후에 즉시 록을 풀기 때문에 다른 값을 수정하는 도중 문제가 생길 수 있다.
      • Repeatable read 는 한번 읽은 값은 트랜잭션 끝까지 유지가 되므로 처음 트랜잭션이 시작할 때의 값은 그대로 읽을 수 있으나 트랜잭션 실행 도중 생긴 변화는 읽을 수 없다.

 

  • 데이터의 위치
    • db 시스템에서는 동일 데이터를 세곳에 위치시킬 수 있다.
      • 디스크 블록
      • 메인 메모리 상의 데이터 버퍼 블록
        • db 데이터는 기본적으로 디스크 불록에 존재하며 DBMS 에 의해 필요한 경우에만 시스템 버퍼에 로드한다.
      • 트랜잭션 프로세스의 메모리 
        • 트랜잭션은 시스템 버퍼에 있는 값을 직접 참조하지 않고 트랜잭션의 메모리 공간에 복사한 값을 사용한다.
  • 색인 ( index )
    • B+ 트리

 

이직을 결심한 이유

 내가 존경하는 개발자들이 많이 떠났고 개발을 하다보니 어느덧 내가 조언을 해주는 입장에 있게 되었다.

상대적이지만 아직 배우고싶은것도 많고 설계에 대해서도 조언을 구하고 싶은게 많다.

인터넷에 올라와 있는 정보는 많지만 어떤게 우리 비즈니스에 최선인지에 대해서 알려주는 사람은 없다.

현재 회사보다 규모가 크고 좋은 개발자들은 많이 만나고 싶다. 

잠재력이 있는 회사에 더 가고싶다

'개발일기' 카테고리의 다른 글

mojave 업그레이드 후 고통  (0) 2018.11.16

댓글