[CS/면접준비] 자바언어

bye9·2021년 3월 25일
0

CS

목록 보기
6/10
post-custom-banner

https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Java
https://mangkyu.tistory.com/94


JVM(Java Virtual Machine)

  • 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것.
  • JAVA와 OS 사이에서 중개자 역할을 수행하여 재사용을 가능하게 해준다.
  • 메모리 관리, Garbage Collection 수행.
  • 스택기반의 가상머신

자바 프로그램 실행과정

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받는다.
    JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
  2. 자바 컴파일러가 자바 소스코드를 읽어들여 자바 바이트코드로 변환시킨다.
  3. 클래스 로더를 통해 클래스 파일들을 JVM으로 로딩한다.
  4. 로딩된 클래스 파일들은 Execution engine(실행 엔진)을 통해 해석된다.
  5. 해석된 바이트코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이뤄진다.

* Runtime data Area: 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간

Garbage Collectior(가비지 컬렉터)

  • Java에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에 가비지 컬렉터(Garbage Collector)가 더 이상 필요 없는 (쓰레기) 객체를 찾아 지우는 작업을 한다.

  • '더이상 참조되지 않는 메모리'인 가비지를 청소해주는 JVM의 실행 엔진의 한 요소입니다. JVM은 new와 같은 연산에 의해 새롭게 생성된 객체들 중에서 더이상 참조되지 않는 객체를 정리해줍니다. 가비지 컬렉터는 Heap 영역을 위주로 탐색하며 메모리를 정리해줍니다.


오버라이딩(Overriding) vs 오버로딩(Overloading)

오버라이딩(Overriding)

상위 클래스의 메소드를 하위 클래스에서 재정의하여 사용하는 것
-> 다형성

오버로딩(Overloading)

메소드의 이름은 같지만 서로 다른 매개변수 형식을 가고 있는 메소드를 여러 개 정의하는 것
-> 프로그램의 가독성

public class Person {
    public void print() {
    	System.out.println("나는 사람입니다");
    }
}

public class Student extends Person {
    // Overriding
    public void print() {
    	System.out.println("나는 학생입니다.");
    }
    
    // Overloading
    public void print(String name) {
    	System.out.println(name + "는 학생입니다");
    }
}

클래스, 객체, 인스턴스의 개념

  • 클래스(Class): 객체를 만들어내기 위한 설계도 혹은 틀, 연관되어 있는 변수(필드)와 메소드의 집합
  • 객체(Object): 설계도(클래스)를 기반으로 선언된 대상, 클래스의 인스턴스라고도 부름
  • 인스턴스(Instance): 객체를 소프트웨어에 실체화하면 그것을 인스턴스, 객체가 메모리에 할당되어 실제로 활용되는 실체

* 메소드: 클래스 내부에 구현된 함수

// 클래스
public class Person {
    private String name;
}

public class Main {

    public static void main(String[] args) {
        // 객체 = 클래스의 인스턴스
        Person person;
        
        // 인스턴스
        person = new Person();
    }
    
}

추상클래스 vs 인터페이스

  • 공통점: 선언만 있고 구현내용이 없다, 인스턴스화 될 수 없다.(new로 객체 생성 X)

추상클래스

  • 하나 이상의 추상메소드를 포함하는 클래스이다. (일반 메소드, 변수 가질 수 있다.)
  • 선언 시 abstract 키워드를 사용한다.
abstract class Animal {

	abstract void bark();

	void feed() {
    	.....
	}
}
  • 상속하기 위해서 extends 키워드를 사용한다.
  • 상속받은 경우 일반 메소드가 아닌 추상 메소드만 구현했다.(feed메소드는 물려받았기에 구현할 필요 없다.)
    -> 목적: 상속을 받아 기능을 확장(부모-자식 관계)
  • 단일 상속만 가능
class Dog extends Animal {

	Dog() {}

	void bark() {
  		....
	}
}

인터페이스

  • 모든 메소드가 추상 메소드이고 일반 변수를 가질 수 없다.
  • 선언 시 interface 키워드를 사용한다.
interface Vehicle {
    abstract void run ();

    abstract void move ();
}
  • 상속하기 위해서 implements 키워드를 사용한다.
  • 상속받은 경우 모든 메소드를 구현해줘야한다.
    -> 목적: 동일한 동작을 위한 구현을 강제화
  • 다중 상속 가능
class Car implements Vehicle {
    Car() {}
    
    void run() {
		....
 	}
    
 	void move() {
		....
    }
}

참고
https://asfirstalways.tistory.com/158
https://d2.naver.com/helloworld/1329
https://mygumi.tistory.com/257


Vector vs ArrayList

  • 동적인 배열을 사용할 때 주로 사용하는 클래스

Vector

  • 동기화가 되어 있으며, 한 번에 하나의 쓰레드만 접근 가능하다.

ArrayList

  • 동기화가 되어 있지 않으며, 동시에 여러 쓰레드가 접근 가능하다.

StringBuffer vs StringBuilder

  • 문자열을 저장하고 관리하는 클래스

StringBuffer

  • 동기화가 가능하다.
  • 멀티쓰레드 환경에 적합하다.
  • 하지만 속도가 느리다.

StringBuilder

  • 동기화가 가능하지 않다.
  • 동기화를 고려하지 않아 속도가 빠르다.
post-custom-banner

0개의 댓글