Contents
4. 참조자료형- 변수 (int, double, boolen, String)
- static (main이 실행되기 전에 메모리에 로드) - 공간 분리(class별로 분리되어있음)
static은 정적이고 한 개만 메모리에 로드. (중간에 로드 되거나, 2번 로드 되지 않음)
- 메서드(함수)의 유형
- 기본 함수
- 인수가 한 개인 함수
- 인수가 여러 개인 함수
- 리턴이 있는 함수
- void(리턴이 없는)
1. heap
package jvm;
// 클래스 자료형 : 이름, 나이, 학생번호
// static이 안 붙으면 HDD에만 올라가 있어 작업 불가능
class Student {
    int no;
    String name;
    int age;
}
public class Heap01 {
    public static void main(String[] args) {
		    // new가 되면 static이 붙지 않은 모든(변수, 메서드)가 heap에 로드
        Student s1 = new Student();
        s1.no = 1;
        s1.name = "홍길동";
        s1.age = 18;
        System.out.println(s1.no);
        System.out.println(s1.name);
        System.out.println(s1.age);
        System.out.println();
        Student s2 = new Student();
        
        s2.no = 2;
        s2.name = "고길동";
        s2.age = 24;
        System.out.println(s2.no);
        System.out.println(s2.name);
        System.out.println(s2.age);
    }
}
heap에 로드하는 문법
- class명 변수명 = new class명();
package jvm;
class m1{
    m1 s1 = new m1(); //heap에 로드하는 문법
    int no;
}
class m2{
    System.out.println(s1.no);
}
public class Heap01 {
    public static void main(String[] args) {
    }
}위에 코드에서 class m1 안에서 new m1();으로 인해 m1이 heap에 로드는 되었지만 s1 이라는 변수로 저장되고, s1 변수는 m1 class 안에 저장이 되어서 heap 로드 되었지만class m2, s1이라는 변수를 찾을 수 없기 때문에 class m2에서는 s1.no 을 불러올 수 없다.
heap에 로드했을 때 장점
- static에 로드하면 한 번만 로드 되고 그 이후에는 로드 할 수 없기 때문에 같은 클래스를
반복 사용하지 못한다. 하지만 heap에 로드 하면 같은 클래스를 메모리에 여러 공간을 사용해서 반복해서 사용 할 수 있다.
- heap 공간은 수명이 다하면 사라지기 때문에 메모리를 효율적으로 사용 할 수 있다.
package jvm;
class Student {
    int no;
    String name;
    int age;
    static void show() {
        System.out.println(no);
        System.out.println(name);
        System.out.println(age);
        System.out.println();
    }
}
public class Heap01 {
    public static void main(String[] args) {
        Student s1 = new Student();
				s1.show();
        s1.no = 1;
        s1.name = "홍길동";
        s1.age = 18;
        
    }
}static을 넣으면 오류가 뜨는 이유 정리
// ① 
public class Heap01 {
    public static void main(String[] args) {
        Student s1 = new Student();
				s1.show();
        s1.no = 1;
        s1.name = "홍길동";
        s1.age = 18;
    }
}위와 같이 넣으면 show(); 안에 no, name, age 를 출력하고 s1.no에 1을 다시 대입하는 구조다. 하지만 show(); 안에 no, name, age에 값이 없기 때문에 오류가 난다.
❓ 그치만 s1.show();를 s1.age = 18; 아래로 내린다면?
// ②
public class Heap01 {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.no = 1;
        s1.name = "홍길동";
        s1.age = 18;
        s1.show();
    }
}해당 코드는 s1.(변수)들의 값을 채우고 show();를 호출 하는 것임으로, 문법상 오류가 없는 코드 이지만, 오류가 나는 이유는 개발자가 s1.show();를 ① 코드 처럼 만들지, ②코드 처럼 만들지 모르기 때문에 툴 자체에서 오류로 처리하여 실행시키지 못하게 만들었다.
2. stack
package jvm;
public class Stack01 {
    static void m1() {
        int a = 1; // 메인에서 호출 하면 실행
        m2(); // main, class m1, m2 , 변수 a, b 가 로드되어 있음.
    }
    static void m2() {
        int b = 2;
    }
    public static void main(String[] args) {
        System.out.println("10번 라인");
        m1();
        System.out.println("14번 라인");
    }
}package jvm;
public class Stack02 {
    static void m1() {
        int a = 1;
        m1(); // 복귀함수
    }
    public static void main(String[] args) {
        m1();
    }
}위와 같은 원리는 똑같다. 하지만 m1의 함수 안에서 m1을 또 호출 하기에 프로그램은 영원히 끝나지 않는다.
- main 코드 실행
- m1 class 호출
- int a = 1; 를 m1 stack에 저장
- m1 class 호출
- 3번과 4번의 반복으로 끝나지 않는 프로그램임.
3. queue
package jvm;
public class Queue01 {
    static void m1() {
        int n1 = 1;
        System.out.println("🚒️️"); //1
        System.out.println("🏍️"); //2
        System.out.println("🚲️"); //3
        m2();
        System.out.println("🚅️"); //9
        System.out.println("✈️"); //10 순으로 나올 것 이다.
    }
    static void m2() {
        int n2 = 2;
        System.out.println("🍕"); //4
        System.out.println("🍔"); //5
        System.out.println("🌭"); //6
        System.out.println("🥚"); //7
        System.out.println("🧀"); //8
    }
    public static void main(String[] args) {
        System.out.println("main 시작");
        m1();
        System.out.println("main 종료");
    }
}4. 참조자료형
디버깅 하는 법
- 오류는 밑에서 터져서 위에서 부터 추적
Share article
