[cs] java 면접 질문(기술면접 대비)

 

목차

  1. Java의 특징
  2. Java, C++ 공통점, 차이점
  3. Java 메모리 구조-Stack/Heap 차이
  4. Garbage Collector(GC)란?
  5. Java 자료형 - Primitive/Reference Type
  6. Class(클래스)와 Structure(구조체)의 차이
  7. Overloading과 Overriding의 차이

1. Java의 특징

1-1. 객체지향

객체지향이란? 현실세계를 모티브로 함.

객체란, 현실세계에 존재하는 모든 것들. 속성(data)와 행위(method)로 구성된다.

​ 생성될 때(new)기본값으로 초기화 된다.


객체지향의 특징

더 자세한 내용은

  • Abstraction(추상화)

    : 현상에 존재하는 객체의 주요 특징을 추출하는 과정.

  • Encapsulation(캡슐화)

    : 하나의 클래스 안에 데이터, 기능을 담아 정의하고(속성), 중요한 데이터나 복잡한 기능 등은 숨기고(private/protected), 외부에서 사용에 필요한 기능만을 공개하는 것.

  • Inheritance(상속)

    : 객체 정의 시 기존에 존재하는 객체의 속성과 기능을 상속받아 정의 하는 것.

    특정 Class를 상속 받아 그 Class의 변수와 기능을 재사용한다. Java에서는 다중상속이 불가능하다.

    sub객체 생성 시 super도 함께 생성된다.

    • Generalization : 추출된 class의 공통적인 특성을 모아 super class로 정의.
    • Specialization : 비슷한 속성과 기능을 가지고 있는 다른 class를 상속받아 새로운 class를 정의할 수 있음.
  • Polymorphism(다형성)

    : 상속이 전제가 되어야 한다. 같은 타입 또는 같은 기능의 호출로 다양한 효과를 가져오는 것.

    : 같은 타입의 변수가 다양한 형태의 객체를 참조하는 것.

    즉, super타입의 변수가 다양한 sub타입을 참조하는 것을 의미한다.

    Member mem = new Member();
    Member memc = new MainMember(); 
    
    • 장점

      super 클래스와 sub클래스를 다형성에 의해 super 클래스 타입으로 한꺼번에 관리 및 저장 가능.


1-2. 플랫폼 독립적이다.

​ JVM(Java Virtual Machine) 위에서 동작하므로 컴파일 시 코드를 JVM이 번역한다. 따라서 OS에 상관없이 어떠한 환경에서도 동작할 수 있다.

1-3. 간단하다.

​ C, C++의 복잡한 점, 메모리 관리의 어려움을 해결하여 쉽게 접근 가능하도록 설계되어 있다.

1-4. 분산 프로그래밍 지원

1-5. 멀티 스레드

​ Thread API를 제공하여 운영체제에 종속적이지 않은 독립적 설계와 JVM에 의해 스케줄링이 되도록 구현되어있다.





2. Java, C++ 차이점

공통점

  자바와 C++은 문법적으로 상당히 유사하다. 애초에 자바를 설계할 때 C++ 개발자들이 쉽게 배울 수 있도록 설계했기 때문이다.

차이점

  1. 설계 목표 관점

    설계 시 자바는 보안, 이식성, 빠른 개발에 비중을 두었고 C++은 C언어와의 하위 호환성에 중점을 두었다. 따라서 C++은 C에서 사용하는 포인터, 전처리기 같은 기능을 모두 이용할 수 있다.

  2. 컴파일

    자바는 JVM이라는 가상 머신 위에서 동작하며, 가상 머신 바이트 코드로 컴파일 되면 각 운영체제에 맞는 JVM을 통해 실행할 수 있다. 반면에 C++은 각 OS에 맞는 기계어로 컴파일된다. 따라서 일반적으로 C++이 자바보다 빠르다.

  3. 상속

    C++은 다중상속이 가능하지만 자바는 다중상속이 불가능하다. 다중상속을 지원하는 경우 다이아몬드 문제가 발생할 수 있다. 이를 방지하기 위해 자바에서는 애초에 다중상속을 막아버렸다. 단 자바에서도 인터페이스는 다중상속이 가능하다.

  4. 메모리

    자바는 객체를 Heap영역에만 할당할 수 있으나, C++은 Heap과 Stack 모두에 할당이 가능하다. 메모리 관리의 경우에도 자바는 개발자가 직접 메모리를 해제할 수 있으나 Java는 Garbage Collection을 이용해 자동으로 불필요한 메모리를 해제한다.

3. Java 메모리 구조-Stack/Heap

메모리 구조

  • Class Area(=Method Area) : 메모리로 읽어온 클래스의 정보를 기억한다.

  • heap : 클래스의 객체를 생성하여 기억한다.

  • stack : 메소드 수행 시마다 프레임이 할당되어 메서드 수행에 필요한 변수나(로컬변수), 중간 결과 값을 임시 기억한다. 메소드가 종료될 경우 할당된 메모리가 자동 제거된다.

Java_Memory_GC

4. Garbage Collector(GC)란?

자바는 메모리 관리를 개발자가 아닌 GC(Garbage Collector)라는 쓰레드를 생성하여 사용하지 않는 객체들을 제거한다.

일반적으로 자바에서는 JVM에 의해 자동으로 Garbage Collection이 실행된다. 더 이상 사용되지 않은 객체들을 점검하여 제거한다.


GC(Garbage Collection)

  • Heap영역(class 영역 포함)에 생성된 객체들의 메모리 관리를 담당하는 프로그램.

  • 더 이상 사용되지 않은 객체들을 점검하여 제거한다.

  • JVM에 의해 자동적으로 실행되며, CPU가 한가하거나 메모리가 부족할 때 실행된다.

  • GC를 수행하는 동안 GC를 수행하기 위한 Thread 이외의 모든 Thread 작업이 멈추기 때문에 시스템에 큰 영향을 미치게 된다.

    Java_GarbageCollection


    Young Generation

    • 객체 사용 시간이 짧은 객체들이 위치한다.
    • EdenSurvivor0(S0), Survivor1(S1) 으로 구성된다.

    • 새롭게 생성된 객체는 Eden에서 생성된다. 이 영역에서 객체가 사라질 경우 Minor GC가 발생했다고 한다.

    Old Generation

    • Young 영역에서 살아남은 객체가 여기로 복사된다.
    • Young 영역보다 메모리는 크게 할당되며 GC가 적게 발생된다.

    Permenant Generation(Non-heap)

    • JVM에 의해 사용하는 클래스와 메소드 객체 정보를 담고 있다.


  • Garbage Collection 타입

      Minor GC Major GC Full GC
    대상 Young Generation Old Generation 전체 Heap + Meta Space
    (Permanent 영역)
    트리거 되는 시점 Eden이 full일 경우 Minor GC가 실패할 때 Minor/Major GC가 실패할 때

5. Java 자료형 - Primitive/Reference Type

5-1. Primitive Data Type

  • 기본적인 값을 기억하는 변수 타입.

  • byte, short, int, float, double, char, boolean


   Implicit Type Casting(암시적 형 변환)

   : 작은 크기의 타입은 큰 크기의 타입으로 자동 형 변환 된다.

   Explicit Type Casting(명시적 형 변환)

   : 큰 크기의 타입을 작은 크기의 타입으로 변경할 경우

  int intNum = (int)doubleNum;

5-2. Reference Data Type

  • 객체의 참조값을 기억하는 변수.

  • class, interface, 배열

1) 1차원 배열

    • 배열 선언, 생성, 값 할당
    • 자바는 배열 선언 시 크기를 지정해주지 않아도 된다.
    • 자바에서는 배열의 마지막에 배열의 크기값이 저장된다. 따라서 arr.length를 이용해 배열 크기를 사용할 수 있음.

※ arr.length()가 아님을 주의!!

int[] arr = {10, 20, 30, 40}; //선언과 생성, 값 할당을 동시에
int[] arr1 = new [5]; //선언과 생성을 동시에
int[] arr2;
arrw = new int[3]; //배열의 크기를 선언 이후 지정해주어도 된다.

int arr2[]; //c에서와 마찬가지로 변수명 뒤에 []를 붙여도 된다.

2) 다차원 배열

    • 배열의 배열로 저장됨. 행의 크기는 필수이나 각 열의 크기는 서로 달라도 됨.
    • 자바에서는 다차원 배열이 참조 형식으로 되어있기 때문에 열의 크기가 고정되지 않아도 된다.(즉, 행의크기만 선언해도 됨

자바_다차원 배열.img

  
  int[][] arr = new int[5][];		//열의 크기가 확실하지 않을 때
  
  //열의 크기가 각자 달라도 된다. 
  int[][] brr = {{10, 20, 30, 40, 50}
                ,{20, 30}
                ,{20, 30, 40, 50}};
  


6. Class(클래스)와 Structure(구조체)의 차이

6-1. Class(클래스)

 어떤 특정 종류의 모든 객체들에 대해 일반적으로 적용할 수 있는 변수와 메소드를 정의하고 있는 설계도이다.


6-2. Structure(구조체)

 연관성이 있는 서로 다른 자료형을 하나의 집합으로 묶어 새롭게 정의한 사용자 정의 자료형이다.

차이점

클래스 구조체
참조 형식
Heap할당 사용
상속가능
생성자 필요
메소드 포함
값 형식
스택할당 사용
상속 불가능
생성자 X
메소드 없음

7. Overloading과 Overriding의 공통점, 차이점

  • 공통점
    • method 정의 시 이름을 같게 정의한다.
    • 사용이 편리하다.
    • 다형성 효과


  • Overriding(메소드 재정의)

    super class의 메소드를 sub class에서 재정의해서 사용하는 것.

    • 상속이 전제가 되어야 한다.
    • 상속 받은 메소드와 전체적인 기능은 동일하지만 상세 구현이 조금 다를 경우 기존의 상속 받은 메소드로 사용할 수 없으므로 새로운 메소드를 추가로 선언해야 한다.


    규칙

    • 메소드명, 인자, 리턴타입을 동일하게 선언한다.

    • access modifier(접근 제한자)

      부모와 같거나 보다 넓은 범위로 정의해야 한다.

    • 예외 던지기

      부모 메소드와 같은 예외를 던지거나 예외를 안던진다.

    • 리턴 타입

      1.7 버전 : 상속 받은 메서드와 리턴 타입이 반드시 같아야 한다.

      1.8 버전 : 상속 받은 메서드와 리턴 타입이 같거나 sub를 리턴한다.

      부모 ----------------- public Customer getCustomer()
      자식에서 override ----- public Customer getCustomer() //리턴타입이 super와 같음.
          		----- public MainCustomer getCustomer() //리턴타입이 sub
      

    효과

    • 상속받은 메소드와 이름, 인자가 같으므로 메소드 호출 방법이 기존의 코드와 동일하고 리턴 타입이 동일하므로 호출 후 처리 방법이 기존의 코드와 동일하므로 기존의 코드를 수정하지 않고 변경된 내용을 반영할 수 있다.
    • 부모 객체인지 자식 객체인지 구별하지 않고 기능이 같으면 동일한 이름으로 메소드를 호출해서 사용한다. => 메소드 호출에 대한 편리성 제공


  • Overloading

    한클래스 내에, 메소드명이 같은 메소드들을 여러개 정의 하는 것. (즉, 메소드의 인자를 다르게 전달받고 싶을 경우 메소드의 이름을 같게 하고 파라미터 타입을 다르게 해서 사용하는 것.)

    • 상속이 아니어도 사용이 가능하다. 단, 인자가 달라야 함.
    • 같은 기능을 하는 메소드를 다양한 타입의 인자로 사용하고 싶을 경우.
    • 자바의 대표적인 overloading 함수는 println이 있다.(이클립스에서 ctrl+space bar를 이용해서 확인.)


    ==+ 클래스 내의 메인 메소드도 오버로드 할 수 있다.==

    규칙

    • 파라미터의 개수를 다르게 선언.
  • 파라미터의 타입을 다르게 선언.

  private static void sum(int a, int b){
      System.out.println("a+b = ", a+b);
}
  private static void sum(int a, int b, int c){ //파라미터의 개수를 다르게 선언.
      System.out.println("a+b+c = ", a+b+c);
  }
  private static void sum(double a, double b){ //파라미터의 타입을 다르게 선언.
      System.out.println("a+b = ", a+b);
  }