항해99 기술면접 대비

23.10.11 항해 99 16기 기술면접 대비

김용글 2023. 10. 11. 23:41

1. Override 와 Overload 를 설명해주실 수 있을까요?

   1) Override

       상위 클래스가 가지고 있는 멤버변수가 하위 클래스로 상속되는 것처럼

       상위 클래스가 가지고 있는 메서드도 하위 클래스로 상속되어 하위 클래스에 사용가능하며, 하위 클래스에서 

       메서드를 재정의해서도 사용이 가능하다

       쉽게 이야기헤서 메서드의 이름이 같고, 매개변수가 같고, 반환형이 같은 경우에 상속받은 메서드를

       덮어쓴다 라고 생각하면 된다 '부모클래스에서의 메서드는 무시하고,

       자식 클래스의 메서드 기능을 사용하겠다'와 같다

 

         * 사용조건

            (1) 메소드의 이름이 일치해야 함

            (2) 메소드 매개변수의 개수, 순서 그리고 데이터 타입이 일치해야 함

            (3) 메소드의 return 타입이 일치해야 함

예제)

class Car {
    int speed = 0;

    public void setSpeed(int speed_change) {
        this.speed += speed_change;
        System.out.println(this.speed);
    }
}

class Sonata extends Car {
    final int MAX_SPEED = 150;

    public int setSpeed(int speed) {
        this.speed += speed;

        if (this.speed > MAX_SPEED) {
            this.speed = MAX_SPEED;
        }

        return this.speed;
    }
}

public class CarOverridingTest {
    public static void main(String[] args) {
        Car car = new Car();
		car.setSpeed(30);

        Sonata sonata = new Sonata();
		sonata.setSpeed(180);
    }
}

   

2) Overload

        두 메서드가 같은 이름을 가지고 있으나 인자의 수나 자료형이 다른 경우 

        

        * 사용조건

           (1) 메소드의 이름이 일치 해야함

           (2) 메소드의 매개변수의 개수 또는 타입이 달라야함 (개수가 같다면 타입, 타입이 같다면 개수를 다르게 해야함)

           (3) 메소드의 return 타입이 달라야 함

예제)

class OverloadingTest{
    //이름이 cat인 메서드
    void cat(){
        System.out.println("매개변수 없음");
    }
    
    //매개변수 int형이 2개인 cat 메서드
    void cat(int a, int b){
        System.out.println("매개변수 :"+a+", "+b);
    }
    
    //매개변수 String형이 한 개인 cat 메서드
    void cat(String c){
        System.out.println("매개변수 : "+ c);
    }    
}
 
public class OverTest {
 
    public static void main(String[] args) {
        
        //OverloadingTest 객체 생성
        OverloadingTest ot = new OverloadingTest();
        
        //매개변수가 없는 cat() 호출
        ot.cat();
        
        //매개변수가 int형 두개인 cat() 호출
        ot.cat(20, 80);
        
        //매개변수가 String 한개인 cat() 호출
        ot.cat("오버로딩 예제입니다.");
    } 
}

 

2. JPA의 더티 체킹이란 무엇인가요?

    영속성 컨테이너가 관리하는 엔티티 상태를 감지하여 변경된 부분이 있다면 자동으로 트랜잭션이 끝나는 시점에

    데이터 베이스에 반영하는 기능

    더티는 "엔티티 데이터의 변경되는 부분"을 뜻하기 때문에 더티 체킹은 변경된 부분을 감지한다는 의미이다

   

    * 조건

      1) 영속성 컨텍스트에서 관리되는 엔티티

           영속성 컨텍스트는 엔티티를 처음 조회할 때 시작되며, 이후 변경을 감지한다. 준영속 / 비영속 상태의 엔티티는

           더티 체킹의 대상이 되지 못한다

      2) 트랜잭션이 커밋되었을 때

          트랜잭션이 커밋되기 전까지 영속성 컨텍스트는 변경사항을 추적하기만 하고, DB에 반영하지는 않는다

          따라서, 트랜잭션이 커밋될 때 영속성 컨텍스트는 엔티티의 변경된 상태를 DB에 반영한다

 

     * 영속성 컨텍스트란?

        엔티티를 영구 저장하는 환경

        애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역활을 한다.

        엔티티 매니저를 통해 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리함

   

3. JVM 이란 무엇이고 왜 필요한지 설명해주실 수 있을까요?

    Java Virtual Machin 즉 자바 가상머신의 약자를 따서 부르는 용어로 OS와 Java 애플리케이션 사이의 중재자 역활

    자바 바이트코드를 실행할 수 있는 환경을 제공해주고 이를 통해 자바 바이트 코드가 플랫폼에 독릭적으로 어디서든

    실행될 수 있게 한다

 

    1. 구성

     1) 바이트 코드

         내가 작성한 코드가 운영체제가 읽을 수 있는 코드로 Java 컴파일러가 변환한 코드

         Java 컴파일러 : 내가 작성한 Java 코드들 (. java 파일)을 운영체제가 읽을 수 있는 바이트 코드 ( .class 파일) 로

                                   변환하는 변환기

     2) 인터프리터

         운영체제가 읽은 바이트 코드를 기기가 실행할 수 있는 기계어로 번역

     3) JIT 컴파일러

         인터프리터의 효율을 높여주는 서포터 해석기

     4) 메모리 영역

         운영체제로 부터 JVM이 할당 받은 영역

     5) 클래스 로더

         JVM으로 바이트 코드 ( class ) 를 불러와서 메모리에 저장함

     6) 가비지 컬렉터

         메모리 영역에서 안쓰는 데이터를 주기적으로 흡수해 가는 청소기

 

4. Java가 컴파일되는 과정은 어떻게 되는지 설명해주실 수 있을까요?

    1) 개발자가 자바 소스코드 ( .Java)를 작성

    2) 자바 컴파일러가 자바 소스코드 ( .Java)를 읽어 바이트코드 (.class)로 컴파일함

    3) 컴파일된 바이트코드 (.class)를 클래스 로더에게 전달

    4) 클래스로드는 동적로딩을 통해 필요한 클래스들을 로딩 및 링크해서 런타임 데이터 즉 JVM 메모리에 올림

        (1) 세부 동작

           a. 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드

           b. 검증 : 자바 언어 명세 및 JVM 명세에 명시된 대로 구성되어 있는지 검사

           c. 준비 : 클래스가 필요로 하는 메모리 할당 (필드, 메서드, 인터페이스 등등)

           d. 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경

           e. 초기화 : 클래스 변수들을 적절한 값으로 초기화함 (static 필드)

    5) 실행엔진은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행

       이때, 실행엔진은 두가지 방식으로 변경함

       (1) 인터프린터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다.

                                  하나하나의 실행은 빠르지만 전체적인 실행속도가 느리다는 단점이있다

       (2) JIT 컴파일러 : 인터프린터의 단점을 보완하기 위해 도입됨

                                    바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에 해당 메서드를 더이상

                                    인터프린팅 하지 않고, 바이너리 코드로 직접 실행하는 방식

                                    바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이므로 전체적인 실행속도가

                                    인터프리터 방식보다 빠르다