기술면접용 자바 정리

이성준·2022년 5월 27일
0

면접

목록 보기
3/6

자바

  • 메모리 누수
    힙영역에 할당된 부분이 참조되지 않는데도 해제되지 않은 채로 메모리를 계속 점유하고 있는 것입니다.

  • 리플렉션
    구체적인 클래스 타입을 몰라도 run time에 동적으로 특정 클래스의 정보를 추출해 내는것 입니다. 동적으로 클래스를 사용해야 할때 필요합니다.

  • 자바
    옛날에는 운영체제마다 코드를 다르게 짜주었는데 자바가 JVM을 이용해서 개발자들이 운영체제별로 다른 코드를 짤 필요가 없어졌다.

  • JVM
    자바와 운영체제 사이에서 중재자 역할을 해주고 자바가 운영체제에 구애받지않고 프로그램을 실행 할수 있게 도와줍니다. 가비지 컬렉션을 통한 메모리 관리도 자동으로 수행합니다.

  • 자바파일 실행과정
    컴파일러가 자바소스를 바이트코드로 변환합니다 그리고 클래스 로더가 바이트 코드를 런타임 데이터 영역에 로드시키고요 로딩된 바이트코드를 실행엔진에 의해서 실행되게 합니다.

  • static
    static 인스턴스 생성 없이 바로 사용이 가능하다. Method 영역에 할당된다 Method영역에 있는 메모리는 모든 객체가 공유해서 어디서든지 참조가 가능하다 하지만 프로그램 종료시까지 메모리가 할당되있는 상태로 존재하기 때문에 너무 static을 남발하면 악영향을 준다.
    이유 : 공통되는 데이터들을 관리할때

  • final
    final
    변수 - 한번 정의하고 다시 바꾸고싶지않을때
    메서드 - 오버라이딩 못하게 만들때
    클래스 - 상속을 하지 못하게 만들고 싶을때
    static final
    모든 영역에서 고정된 값으로 사용하는 상수를 만들고 싶때

  • 제네릭
    클래스 내부에서 타입을 정하지않고 컴파일 시점에 미리 지정하는 방법이다, 코드의 재사용성이 늘고 타입안정성(컴파일시에 에러를 내주고(ClassCastException), 요소를 찾아올때 타입변환을 할 필요가 없음)을 제공한다.

  • 어노테이션
    컴파일 과정이나 실행 과정에서 코드를 어ㄸ쩧게 처리해야하는지 알려주기 위한 추가 정보
    @Override : 오버라이딩을 올바르게 했는지 컴파일러가 체크합니다.

자바에서 동시성 이슈를 해결하는 방법

synchronized 를 걸어서 원자성을 보장시킵니다.

자바의 실행방식

1.먼저 자바의 JVM이 자바코드를 읽어 자바 바이트코드로 변환시킨다.
2.클래스로더의 클래스파일들을 JVM으로 로딩한다.
3.로딩된 class파일들은 실행엔진을 통해 실행된다.

자바 JVM 구조는?

classloader : 운영체제의 JVM ClassLoader가 이 바이트코드의 파일을 RunTime Data Areas로 로딩하여서 프로그램을 구동한다.
Execution Engine : ClassLoader가 RunTime Data Areas에 불러온 바이트코드를 실행한다.
garbage collector : JVM이 메모리를 관리해주는 모듈입니다. heap 메모리를 재활용하기 위해서 더이상 참조되지않는 객체를 메모리에서 제거합니다. 처음에 eden 영역에 올라간후 eden영역이 꽉차면 minorgc가 일어나고 서바이버0 영역으로 이동시킵니다 앞에껄 반복하다가 서바이버0영역이 꽉차면 서바이버1영역으로 이동시키고 또 1영역 꽉차면 0으로 이동시키고 이 과정을 반복하다 오래 살아남은 객체는 old 영역으로 이동합니다 old 영역에 있는 모든 객체들을 검사하여 참조되지 않고있는 객체들을 한번에 삭제합니다.

  • 런타임 데이터 영역
    Method 영역 : 클래스가 로딩될때 생성되고, 전역변수와 static변수를 저장하며, 시작부터 종료까지 메모리에 남아있습니다.
    Stack 영역 : 런타임시 할당되고, 지역변수와 매개변수 데이터 값이 저장되는 공간, 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제됩니다.
    Heap 영역 : new 키워드로 생성되는 객체, 배열 등이 Heap 영역에 저장되며, 가비지 컬렉션에 의해 메모리가 관리되어 집니다.
    PC Register :쓰레드가 현재 실행되고 있는 부분의 주소를 저장한다. OS는 PC Register를 참고해 CPU 스케줄링 시 해당 쓰레드가 어떤 명령어를 수행하는지 알 수 있다.
    Native Method Stack :자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역을 말한다.

컬렉션 프레임워크

자바에서 Collection이란 자료구조를 쉽게 다룰수있는 다양한 인터페이스와 클래스를 제공해주는것 라이브러리를 말한다.

  • List
    순서가 있는 데이터를 나열하는 방식으로 만들어진 인터페이스, 객체를 인덱스로 관리합니다. 그리고 동일한 객체를 중복 저장할 수 있습니다. thread-safe를 만족시켜야하는 환경이면 vector를 사용하고 아니면 arraylist를 사용합니다.
  1. ArrayList : 검색이 빠릅니다. index 중간에 값을 추가하면 중간 뒤의 원소를 한칸씩 밀고 그 빈공간에 값을 넣기때문에 O(n)이 걸린다.
    1-1. ArrayList와 List의 차이 : 일반배열은 처음 메모리를 할당할때 크기를 지정해야하지만, ArrayList는 크기를 지정하지 않고 동적으로 값을 삽입 삭제할수 있다. 그리고 객체만을 담을수 있다.
  2. LinkedList : 양방향의 연결리스트로 구성되어있다. 순차적접근이여서 검색이 느림, 데이터를 추가 삭제 할때 주소값만 바꾸면 되니까 조금더 빠르다.
  • Set
    객체를 중복 저장할수 없고 저장 순서가 유지 되지 않습니다. 구현클래스는 어떻게 중복을 제거하는거가 차이입니다.
  1. HashSet : 해쉬(어떤 데이터가 있는데 이 데이터를 어떤 숫자로 변환하는것) hashcode()로 비교를 하고 해쉬값이 같으면 equals 메소드로 또 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않습니다.
  2. TreeSet : 트리셋은 compareto로 비교하고 이진탐색트리로 저장한다
  • Map
    키와 밸류로 저장하는데 키는 중복이 안되고 데이터의 순서를 보장하지 않습니다.
  1. HashMap : null값가능, 멀티쓰레드에서는 HashTable 사용, 검색과 삽입에 O(1)
  2. TreeMap : 이진 검색 트리형태로 저장, 동기화 처리가 되어있습니다. 검색과 삽입에 O(logN)

추상클래스와 인터페이스의 차이는 무엇인가?

추상클래스는 공통기능을 만들어놓고 기능을 공유하고 싶을때 (확장성),인터페이스는 설계도를 만들어주는것이다. (동일한 목적 하에 동일한 동작 보장)
추상클래스는 추상메소드를 0개 이상 가지고있고 상속받은 클래스는 반드시 추상 메소드를 구현해야한다. 인스턴스를 만들수 없다,
목적 : public 이외의 접근 제어자를 사용해야 할때
인터페이스는 모든 멤버 변수는 public static final이고 생성자를 가질수 없다, 어떠한 클래스가 해당 인터페이스를 구현하고자 한다면 인터페이스의 모든 메소드를 구현해야 한다. 다중상속이 가능합니다.
목적 : 클래스간 관련성은 없지만, 동일한 동작을 보장하고 싶을때, 다중상속을 하고싶을때ㅣ

에러와 예외의 차이는 무엇인가요?

에러 : 메모리가 부족하거나, 스택오버플로우 같이 발생하면 복구할수 없는 심각한 오류를 뜻한다.
예외 : 발생하더라도 수습할수 있을 정도로 비교적 덜 심각한 오류를 말한다. 예외처리를 통해서 비정상적 종료를 막을수 있다.

오버라이딩과 오버로딩의 차이는?

오버로딩: 같은 클래스 내에서 하나의 메소드이름으로 매개변수의 갯수나 타입을 다르게 하여 여러 기능을 구현하는 것, 즉 정적으로 다형성을 구현하는거고
사용하는 이유 : 같은 동작을 해야하는 메소드를 작성해야 하는데 매개변수가 다른 경우.
오버라이딩 : 상위클래스로 부터 상속받은 메소드를 하위 클래스에서 재정의 하는것
사용하는 이유 : 상속받은 메소드를 상황에 맞게 재정의해서 사용해야 할때 사용한다.

String,StringBuffer,StringBuilder 차이

String : 불변객체이기때문에 수정하면 새로운 String 인스턴스가 생성된다. 안 변하는걸 자주 읽을때 사용하면 좋다.
StringBuffer : 가변객체여서 문자열의 변경이 빈번할때 사용하면 좋다. 동기화를 지원해서 thread-safe 하다.
StringBuilder : 동기화를 지원하지 않는다. thread-safe하지 않다.

접근 제어자

접근제어자를 사용하여서 객체를 캡슐화 하기 위해 사용합니다.
public : 외부클래스 어디에서나 접근이 가능합니다.
protected : 같은 패키지 내부, 상속받은 외부패키지의 클래스에서 접근이 가능
default : 같은 패키지 내부, 에서 접근이 가능
private : 같은 클래스 내부, 에서 접근이 가능합니다. -> getter setter를 이용해 클래스의 필드에 직접 접근하는걸 막는다.

0개의 댓글