티스토리 뷰

Java

메소드와 메모리구조

yun jjang 2018. 11. 20. 00:08

힙메모리 - new 연산자로 만든 객체나 배열이 저장되는 메모리
new할때마다 메모리에 데이터크기만큼 새롭게 할당받고 해당 메모리의 주소를 받고 메모리주소가 해당변수에 저장된다.
자바의 가비지컬렉터가 사용이 끝난 new객체의 메모리를 해제해준다.

스택 - 메소드의 지역변수나 파라미터가 저장되는 메모리.메소드가 사용하는 메모리
메소드가 호출될때 할당되고 메소드가 종료하면 반환한다.메모리에서 지워지지는 않고 쓰레기값으로 남아있으며
다음 메소드가 호출될때 그 영역에 새로운 데이터가 덮어쓰여진다.

static memory(정적메모리) - static 키워드로 표시하는 변수나 메서드.
프로그램이 시작할때 생성되고 프로그램이 종료되면 끝난다. 메모리중 가장 유효기간이 긴 메모리.
값의 초기화는 한번만 이루어지고,
ststic변수를 공동으로 사용한다.
예를들자면, static멤버변수를 갖는 클래스로 객체를 여러개 만들어 다른객체들이 만들어놓는다.
객체1의 ststic멤버변수의 값을 변경한다. 그러면 객체2의 static멤버변수의 값도 변경되어진다.

static메서드에서는 static멤버변수와 지역변수만 사용가능하고 일반멤버변수,일반메서드는 사용할 수 없다.
일반멤버변수는 객체를 생성해야 메모리를 할당 받는데, static메서드는 객체 생성 전에도 호출할 수 있기 때문이다.



-stack메모리 : 메소드는 스택메모리에 쌓인다. 메소드가 끝나면 메소드가 메모리에서 사라지고, 메소드 안의 모든 변수들또한 메모리에서 사라진다.
-힙 메모리 : new로 만든 모든 instance는 힙에 쌓인다. 따라서 메소드가 끝나도 메소드 안에서 사용했던 new인스턴스는 사라지지 않는다.

-펌젠 : 자바컴파일된 클래스파일이 저장 된다. 그중에 static한 영역이 존재.



Queaue : FIFO(First In First Out)
Stack    : FILO(First In Last Out)



static메소드가 존재하는 이유


(ex)Class StringUtil.java
A클래스에 (멤버변수는 존재하지 않는다는 가정하에) 메소드를 만들어 놓고(stack메모리사용) B클래스에서 A클래스의 메소드를 사용하고 싶을 때
보통은 B클래스에서 new로 A클래스 객체를 만들어서 그 객체로 A클래스메소드를 사용하곤 한다. (객체를 만듦으로써 힙의 영역을 사용)

그러나 static키워드를 사용하면 인스턴스를 만들지 않고도 클래스에 선언된 변수와 메소드들을 사용할 수 있다.
클래스 간에 공유할 필요가 있는 변수나 메소드는 static을 붙여서 선언한 후, 예시처럼 new객체명이 아니라 클래스명을 직접 지정해서 사용할 수 있다.
(ex)클래스명.변수명
(ex)클래스명.메소드명() => StringUtil.removeComma("hello, world!!!!")

즉 클래스 안에는 메소드만 존재하고 그 클래스 안의 메소드를 오버라이딩없이 사용하는 경우 static으로 그 메소드를 만들어 놓는다.
유틸리티 클래스안에 많이 만들어진다.
(객체를 만들어 heap메모리를 사용 할 필요가 없다.)


'Java' 카테고리의 다른 글

예외처리 Exception  (0) 2018.11.20
interface  (0) 2018.11.20
Array와 List  (0) 2018.11.19
switch case문, 다양한 for문 (java의 iterator for문)  (0) 2018.11.19
바이트, 비트 연산(쉬프트 연산, 2의 보수 처리 등)  (0) 2018.11.19