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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package Fri;
 
class Car {
    String color;
    String gearType;
    int door;
 
    Car() {//매개변수가 없는 생성자 생성자의 이름은 클래스이 이름과 같아야함
    }//생성자는 인스턴스의 초기화작업에 사용된다.
    
    //무조건 하나의 생성자는 만들어야 하기 때문에 기본 생성자를 하나 만들었다. 기본 생성자의 경우 클래스의 이름과 똑같이 만들면 된다.
    //c1이 호출되는 구조
    1. 최초 Main이 호출이 된다. 
    2. Main은 Method Area라도 불리며 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스
       파일(*.class)을 읽어서 분석하여 클래스에 대한 정보 (클래스 데이터)를 Method Area에 저장한다.
       이때, 그 클래스의 클래스변수(class variable)도 이 영역에 함께 생성된다.
    3. c1은 참조변수로써 Car()를 가리키고 있다.
    4. 이때, Car()는 호출이 되는데 Car은 내용물은 다음과 같다.
       color, gearType, door 등등이 존재한다.
       인스턴스를 만들었기 때문에, 메인메서드에서는 호출이 가능하며 c1.color식으로 호출을 한다.
       인스턴스는 Heap(힙)이라 불리는 인스턴스가 생성되는 공간에서 생성되며, 프로그램 실행 중 생성되는 인스턴스
       는 모두 이곳에서 생성된다고 보면된다.
       즉, 인스턴스변수들이 생성되는 공간이다.
    5. 호출스택(Call Stack 또는 Execution Stack) 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다.
       메서드가, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안
       지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고, 메서드가 작업을 마치게 되
       면,  첫 번째 메서드의 바로 위에 두 번째 메서드를 위한 공간이 마련된다.
    6. 이때 첫번째 메서드는 수행을 멈추고, 두번째 메서드를 수행하게 된다.
       호출스택의 메모리가 반환된다.두번째 수행후 첫번째 메소드가 다시 재수행된다.
       즉, 메모리를 첫번째 메소드가 비워지면 두번째 놈이 차지 다시 수행후 첫번째 메소드가 차지 순...
    
    //매개변수가 존재하는 직관력이 높아지는 c2 방식의 생성자
    1. c1과 달리 c2는 더욱 직관력이 높이는 방법이다.
       똑같이 생성자를 만들기는 하지만, 매개변수가 존재한다.
    2. 때문에, 하나씩 지정할 필요는 없고, 타입에 맞춰서 넣기만 하면 끝
    3. 무슨말인가 하면 new Car("white","auto",4);
       당연히, white는 String의 c에 저장, auto도 g에 저장 이때 타입은 String 문자열임, 4는 int형
       그것들이 다시 color에 저장이 됨
       그럼 출력을 하고 싶다면 c2.color을 하고, c,g,d에 저장된것은 color,gearType,door에 저장되어 있기에
       출력된다. 
 
    /*Car(String c, String g, int d) {
        color = c;
        gearType = g;
        door = d;
    }*/
}
 
class CarTest {
    public static void main(String args[]) {
        Car c1 = new Car();
        c1.color = "white";
        c1.gearType = "auto";
        c1.door = 4;
 
       /* Car c2 = new Car("white", "auto", 4);*/
        System.out.println("c1의 color=" + c1.color + ",gearType=" + c1.gearType + ",door=" + c1.door);
       /* System.out.println("c2의 color=" + c2.color + ",gearType=" + c2.gearType + ",door=" + c2.door);*/
    }
}
cs

+ Recent posts