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