자바 메모리 구조
Static , Heap, Stack 이란
출력(모니터), 연산(CPU), 저장(메모리)
메모리는 논리적으로 메모리가 떠 있는 시간에 따라 Static , Heap , Stack 으로 나눠 놨다.
static
프로그램의 시작~끝 담당 (계속 메모리에 떠 있기때문에 부화가 큼)
heap
동적할당 영역, 메모리에 떠 있다가 할 일이 다 끝나면 사라짐 (행위의 시작과동시에 실행)
stack
행위에 대한 정보들을 저장하는 영역 (잠깐 떳다 사라짐)
자료형 메모리 구조
RAM(메모리)에 8바이트 크기의 메모리가 있다고 하면 메모리는
1바이트마다 0부터 7까지의 메모리 공간을 만들고 각 공간마다 이름을 붙여준다.
그리고 4byte크기인 자료형int를 int num = 10; 라고선언을 하면 컴퓨터는 0~7까지의 공간중에 비어있는 곳에 변수"num"이란 이름으로 4byte 크기 만큼의 메모리를 사용해서
정수 '10' 이라는 데이터를 메모리에 저장한다.
그리고 num을 호출하면 그 값으로 10이라는 정수가 출력된다.
일반변수와 레퍼런스(참조)변수
일반변수
일반변수는 int,double,...등 기본 자료형 타입의 변수들을 말한다.
기본자료형 타입은 크기가 int는 4Byte 의 크기륵 갖고있는것처럼 크기가 제각각 다 정해져 있다.
그리고 일반변수는 크기가 정해져 있기때문에 stack메모리공간에 데이터가 바로 할당된다.
레퍼런스(참조)변수
참조변수는 클래스타입의 변수로 크기가 정해저 있지 않다.
개발자가 어떤 타입을 몇개를 넣느냐에 따라 크기가 커지거나 작아지거할 수 있다.
그리고 참조변수는 일반변수와 달리 실행이 되었을때 크기를 알수있어 stack메모리공간에는 참조변수의 데이터를 저장할
heap의 주소를 갖고있다가 실행이되면 heap의 참조변수 데이터가 할댕되어서 stack이 갖고있는 heap의 조소와 연결된다.
참조변수 vs 일반변수
일반변수 : 크기가 정해저 있다.(컴파일 시점),
stack공간에 데이터가 저장됨
참조변수 : 크기가 정해저있지않다. (컴파일 시점)
new로 변수가 힙에 할당 될때 크기를 알 수 있다.(프로그램 실행 시).
stack동간에 참조변수의 데이터를 갖고있는 힙공간의 주소를 저장하고 실행시 stack의 힙데이터 주소를 힙에 담겨있는 참조변수의 데이터랑 연결된다.
메서드
출처 데어프로그래밍 강좌
메서드란?
(다른강의에서는 메서드를 함수나 붕어빵기계로 비교하는데 이 강의는 행위 그자체에
비교를한다.)
위 그림처럼 손님이 커피마시는 행위 커피머신이 커피를 만드는 행위 자체를
메서드라고 할 수 있다..
public class Test {
static String make(){
String coffee = "커피를 만드는 중입니다.";
return coffee;
}
public static void main(String[] args){
System.out.print(Test.make());
}
}
make()라는 메서드가 문자열 "커피를 만드는 중입니다."를 출력하는 행위를 했다.
메서드 stack 메모리
public class Test {
static void a(){
b();
System.out.println("a1");
System.out.println("a2");
System.out.println("a3");
}
static void b(){
System.out.println("b1");
System.out.println("b2");
System.out.println("b3");
}
public static void main(String[] args){
System.out.println("m1");
a();
System.out.println("m2");
System.out.println("m3");
}
}
위 코드의 스택메모리 실행순서
main() -> a() -> b() 메서드순으로 실행되며
종료순서는 b() -> a() -> main() 순이다.
지역변수와 전역변수
전역변수 stack
- 메서드 실행시 메모리 할당
- 메서드가 종료될 때 메모리에서 사라진다.
지역변수 heap, static
- heap : new키워드로 객체를 생성후 메모리에할당
더 이상 참조 하지않을 때 메모리에서 사라진다.
- static : main메서드 실행시 메모리에 할당
main메서드 종료시 메모리에서 사라진다.
- heap : new키워드로 객체를 생성후 메모리에할당
메서드의 리턴
void 더하기(){
int sum = 5+6;
}
위의 더하기 메서드에서 더하기메서드의 지역변수인 sum이 값을다른곳에서 찾고싶지만 더하기 메서드가 실행되고 종료되면 메모리에서지워지기때문에 다른 곳에서는 sum이라는 지역변수를 찾을 수 없는데
이때 return이라는 키워드를 사용해서 지역변수 sum을 사용할 수 있게 할 수 있다.
public class Test {
static int add() {
int sum = 5+6;
return sum;
}
public static void main(String[] args) {
int result = add();
System.out.println(result);
}
}
메서드의 매개변수와 인수
매개변수(parameter)
- 메소드, 생성자를 선언할때, 데이터 값이 어떤 데이터 타입으로 들어올지 정해준다.
인수(argument)
- 매개변수에 값을 전달해주는 것을 말한다.
public class Test {
static void add(int n1, int n2){
System.out.println("더하기를 하셨습니다.");
int sum = n1+n2;
System.out.print(sum);
}
static void inputCard(String card){
System.out.println(card + "카드를 투입하셨습니다.");
}
public static void main(String[] args) {
inputCard("삼성");
add(500,500);
}
}
위 코드에서는 inputCard(String card) inputCard메서드의 매개변수로는
String 타입의 변수 card 가 들어오며
아래 메인 메서드 에서 inputcard() 메서드에 인자값으로 String타입의 "삼성" 이란 문자열을 전달해 주었다.
'Programing > java' 카테고리의 다른 글
JDBC - 커넥션풀(Connection pool) (0) | 2023.12.13 |
---|---|
Java JVM과 JDK 이해하기 (0) | 2022.02.10 |
스택(Stack)이란, 스택활용 (0) | 2022.01.17 |
메서드 Math.pow() ,Math.sqrt()로 두 점의 거리 구하기 (0) | 2022.01.10 |
#Java 문자열 다루기 (0) | 2021.09.10 |