본문 바로가기
공부

[Java] 기술 면접 질문 대비

by BeforB 2020. 3. 21.
728x90

 

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

 

1. Java의 특징

1-1. 객체지향

 

객체란? 현실세계에 존재하는 실체 및 개념들을 뜻한다. 속성(data)와 행위(method)로 구성된다.

 

객체지향 프로그래밍(OOP)이란? 

 이러한 현실세계의 실체 및 개념들을 객체라는 독립된 단위로 구성하고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

 

 OOP의 기본 구성요소는 클래스, 객체, 메소드이다.

 

객체지향의 특징

1. Abstraction(추상화)

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

 

2. Encapsulation(캡슐화)

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

 

3. Inheritance(상속)

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

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

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

 - Generalization : 추출된 class의 공통적인 특성을 모아 super class로 정의.

 - Specialization : 비슷한 속성과 기능을 가지고 있는 다른 class를 상속받아 새로운 class를 정의할 수 있음.

 

4. Polymorphism(다형성)

 상속이 전제가 되어야 한다. 같은 타입 또는 같은 기능의 호출로 다양한 효과를 가져오는 것을말한다. 같은 타입의 변수가 다양한 형태의 객체를 참조한다.

 

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

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

// Member가 super 타입인 경우
Member mem = new Member();
Member mmem = new MainMember();

 

 

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

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

 

1-3. 간단하다.

 

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

 

1-5. 멀티 스레드 환경에서 동작한다.

 

 

 

2. Java와 C++의 공통점과 차이점

공통점

 

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

 

 차이점

 

 1. 설계 목표 관점

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

 

 2. 컴파일

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

 

 3. 상속

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

 

 4. 메모리

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

 

 

 

 

3. Java의 메모리 구조 - Stack과 Heap의 차이점

메모리 구조

 

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

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

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

 

 

 

4. Garbage Collector(GC)란?

자바는 메모리 관리를 개발자가 아닌 GC(Garbage Collector)라는 쓰레드를 생성하여 사용하지 않는 객체들을 제거한다. 일반적으로 자바에서는 JVM에 의해 자동으로 Garbage Collection이 실행되어 더 이상 사용되지 않는 객체들을 점검하여 제거한다.

 

Garbage Collector

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

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

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

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

  Young Generation

  - 객체 사용 시간이 짧은 객체들이 위치한다.

  - Eden과 Survivor0(S0), Survivor1(S1)으로 구성된다.

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

 

  Old Generation

  - Young 영역에서 살아남은 객체가 여기로 복사된다.

  - Young 영역보다 메모리는 크게 할당되며 GC가 적게 발생된다.

 

  Permenant Generation(Non-heap)

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

 

 Garbage Collection 타입

 

 

 

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를 이용해 배열 크기를 사용할 수 있다.

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

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

 

 2) 다차원 배열

 - 배열의 배열로 저장된다. 행의 크기느 ㄴ필수이나 각 열의 크기는 서로 달라도 된다.

 - 자바에서는 다차원 배열이 참조 형식으로 되어 때문에 열의 크기가 고정되지 않아도 된다.(즉, 행의크기만 선언해도 됨)

 

 

 

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

6-1. Class(클래스)

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

 

6-2. Structure(구조체)

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

 

차이점

 

 

 

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

공통점

 - method 정의 시 이름을 같게 정의한다.

 - 사용이 편리하다.

 - 다형성 효과

 

차이점

Overriding(메서드 재정의)

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

 - 상속이 전제가 되어야 한다.

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

 

 규칙

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

 - access modifier(접근 제한자)는 부모와 같거나 보다 넓은 범위로 정의.

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

 - 리턴타입

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

   1.8 버전 : 상속 받은 메서드와 리턴 타입이 같거나 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);
  }
728x90

댓글