JVM (Java Virtual Machine)

클래스파일 (바이트 코드)을 OS에 맞게 해석해준다.

클래스파일이 JVM에서 실행되기 때문에 OS가 달라져도 다시 컴파일하지 않아도 된다.

즉, 운영체제에 의존적이지 않고 독립적으로 JAVA프로그램이 실행된다.


그림 출처: http://limkydev.tistory.com/51



JAVA 실행 과정 및 JVM 메모리 구조

그림 출처: http://limkydev.tistory.com/51


JAVA는 소스파일을 컴파일해서 바이트코드인 클래스파일로 만들고 자바 가상머신을 통해 실행할 수 있다.


class 파일

java파일이 컴파일러에 의해 class파일이 되는데,  이 파일은 자바 환경에서 실행되기 위해 최적화된 코드인 Byte Code로 구성된다.

Byte Code는 기계어가 아니기 때문에 OS에서 바로 실행하지 않는다.


Class Loader

JVM 내로 class 파일을 로드하고 Link 작업을 통해 배치 등의 작업을 한다. 런타임시에 클래스를 로드한다.

Execution Engine

Class Loader를 통해 JVM 내부로 넘어와 Runtime Data Area(JVM 메모리)에 배치된 Byte code들을 명령어 단위로 실행시킨다. Garbage Collector

생성된 객체의 생존 여부를 판단하여, 더이상 참조되지 않거나 null 인 객체의 메모리를 해체시켜 메모리를 반납한다. Runtime Data Areas (JVM 메모리)

Java 어플리케이션이 실행하면서 할당받은 메모리 영역이다.



Method Area

프로그램 실행 중 어떤 클래스가 사용되면 JVM은 해당 클래스의 클래스 파일을 읽어 클래스에 대한 정보를 이 곳에 저장한다.

클래스의 클래스 변수(static) 또한 함께 존재한다.


Heap Area

프로그램 실행 중 생성되는 인스턴스는 모두 이 곳에 생성된다.

즉, 인스턴스 변수들이 생성되는 공간이다.


Stack Area

메서드가 호출되면 이 곳에 호출된 메서드를 위한 메모리가 할당되며

이 메모리는 메서드가 작업을 수행하는 동안 지역변수, 매개변수, 연산의 중간 결과 등을 저장하는데 사용된다.

메서드가 작업을 마치면 할당되었던 메모리 공간은 반환되어 비어진다.




참고 출처

- http://limkydev.tistory.com/51

- 자바의 정석

생성자 (Constructor)

인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다.

메소드 이름이 클래스 이름과 동일하고 리턴 자료형이 없는 메서드이다.



1
2
3
4
5
6
7
8
9
10
11
class Card {
    String kind;
    int number;
 
    card (){ }    // 매개변수가 없는 생성자
 
    card (String k, int n) {  // 매개변수가 있는 생성자
        kind = k;
        number = n;
    }    
}
cs

card() 같은 생성자 경우 컴파일러가 제공하는 기본 생성자로서, 

클래스에 생성자가 없을 경우 컴파일러가 자동적으로 기본 생성자를 추가하여 컴파일한다.

즉, card(String kind, int number) 같은 생성자가 정의된 경우 컴파일러는 자동적으로 기본 생성자를 추가하지 않는다.



1
Card c = new Card();
cs

연산자 new에 의해 메모리(heap)에 Card 클래스의 인스턴스가 생성되고, 생성자 Card()가 호출되어 수행된다.

연산자 new의 결과로 생성된 Card 인스턴스 주소가 반환되어 참조변수 c에 저장된다.

즉, 생성자가 인스턴스를 생성하는 것이 아니다.



this(): 같은 클래스의 다른 생성자를 호출할 때 사용한다.

this: 인스턴스를 가리키는 참조변수로, 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Car {
    String color;
    int doorNum;
 
    Car(){
        this("white"4); // Car(String color, int doorNum) 호출
    }
 
    Car(String color) {
        this(color, 4); // 다른 생성자를 호출할 때는 반드시 첫 줄에만 호출이 가능
    }
 
    Car(String color, int doorNum) {
        // 매개변수 이름을 다르게 하는 것보다 this를 사용해 구별되도록 하여 코드의 가독성을 높인다.
        this.color = color;
        this.doorNum = doorNum;
    }
}
cs




참고도서: 자바의 정석



상속 (Inheritance)

하나의 클래스가 가지고 있는 특징들을 그대로 다른 클래스가 물려 받는 것이다.

작성하려는 클래스의 이름 뒤에 상속 받고자 하는 클래스의 이름을 키워드 "extends" 와 함께 작성한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Animal { 
    String name;
    public void setNmae(String name) {
        this. name = name;
    }
}
 
// 상속 예제1
public class Dog extends Animal { 
    // Animal 클래스를 상속받았기 때문에 Dog클래스에서도 name과 setName() 를 사용할 수 있다.
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("poppy");
        System.out.println(dog.name);    // 결과: poppy
    }
}
 
// 상속 예제2
public class Dog extends Animal {
    // 자식클래스에는 부모클래스의 기능을 더한 새로운 메서드 추가가 가능하다.
    public void sleep() {
        System.out.println(this.name+" zzz");
    }
 
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("poppy");
        System.out.println(dog.name);    // 결과: poppy
        dog.sleep();    // 결과: poppy zzz
    }
}
cs


IS-A 관계 (상속관계)
"Dog is a Animal"과 같이 말할 수 있는 관계를 IS-A 관계(상속관계)라고 한다.

1
Animal dog = new Dog();
cs
"개로 만든 객체는 동물 자료형이다." 으로 해석할 수 있다. 


1
Dog dog = new Animal(); // 컴파일 오류
cs

"동물로 만든 객체는 개 자료형이다." 으로 해석할 수 있다. 하지만 말의 앞뒤가 안맞는 것을 알 수 있다.



JAVA는 다중 상속을 지원하지 않는다.

다중 상속을 지원한다면 여러 클래스로부터 상속받을 수 있기 때문에, 

서로 다른 클래스로부터 상속 받은 멤버간의 이름이 같은 경우 이를 구별할 수 없는 단점을 가진다.


이러한 문제점을 없애기 위해 JAVA는 단일 상속만을 허용한다.

하나의 조상 클래스만을 가지기 때문에 다중상속에 비해 클래스를 쉽게 작성할 수는 없지만

클래스 간의 관계가 명확해지고 코드를 더욱 신뢰할 수 있게 만든다.




참고 출처: https://wikidocs.net/280


'Java' 카테고리의 다른 글

JVM (Java Virtual Machine) 개념과 JVM 메모리 구조  (0) 2018.11.27
생성자 (Constructor)  (0) 2018.11.27
객체지향 프로그래밍 (Object-Oriented Programming)  (0) 2018.11.26
객체지향 설계  (0) 2018.11.15
static과 final  (0) 2018.08.20

+ Recent posts