728x90
📄 static 메서드란?
객체의 생성 없이 클래스 이름을 통해 직접 호출할 수 있는 메서드입니다.
static 메서드는 static이 붙어있는 메서드(static멤버는) 클래스를 사용하는 시점에서 자동으로 static-zone에 로딩됩니다. 정적 메서드 코드는 프로그램이 실행될 때 메모리의 static-zone에 로드되며, 메서드 호출 시 실행됩니다.
❓ main(시작) 클래스는 왜 객체생성없이 (new)로 객체 생성하지 않았는데 실행이 되었을까
public class Static Test{
public static void main(String[] args) {
System.out.println(”Hello Java:);
}
}
main 클래스의 동작 방식
- run을 통해 실행하게 되면 내부의 JVM이 실행할 클래스를 찾습니다.
- 찾은 후에 설계된 클래스(파일)가 실행이 되려면 메모리 위에 올라와야 하는데, new를 하지 않은 상황에선 static 키워드가 붙어있는 멤버들( static 키워드가 붙은 메서드는 main) 정해진 메모리(static-zone) 위치에 한번 자동으로 로딩이 됩니다. → static 멤버들은 클래스를 사용하는 시점 즉, 클래스이름.메서드이름으로 호출될 때, 에서 딱 한번 Method Area 메모리에 로딩된다는 점이 중요합니다. 위의 코드에서는 main() 메서드가 static이기 때문에 메모리에 자동으로 로딩합다.
- JVM이 static-zone에서 main() 메서드를 호출합니다.
- 호출된 메서드를 Call Stack Frame Area(Stack Area)에 push(기계어 코드를 넣고)한 뒤 동작을 시작한다.
** Stack이 텅 비어있으면 현재 모든 프로그램이 종료된 상황 **
//Math 클래스 안에 static으로 작성된 클래스들
public class Math {
public static int add(int a, int b) {
return a + b;
}
public static int multiply(int a, int b) {
return a * b;
}
}
public class Main {
public static void main(String[] args) {
int sum = Math.add(5, 3);
System.out.println("더하기: " + sum);
int multiple = Math.multiply(4, 2);
System.out.println("곱하기: " + multiple);
}
}
//출력 -> 더하기 : 8 / 곱하기 : 8
위의 코드에서 Math 클래스에는 두 개의 정적 메서드인 add와 multiply가 있습니다. 이 메서드들은 static 키워드로 선언되었기 때문에 클래스의 인스턴스를 생성하지 않고도 직접 접근하여 사용할 수 있습니다. 접근하는 방법은 dot( . ) 연산자를 이용하여 클래스이름.(static)메서드이름으로 매개변수를 전달하여 호출할 수 있습니다.
클래스이름.메서드이름
자주 사용하거나 빈번하게 사용하는 클래스 멤버들은 static으로 설정하여 멤버에 접근이 용이하도록 작성해주는 것이 좋습니다. ****static 메서드는 클래스의 인스턴스 없이도 호출되며, 간편하게 사용할 수 있습니다.
💡 none-static 메서드의 접근 방법 (인스턴스 메서드 / static이 붙지 않음)
- 객체를 생성해서 메모리에 로딩시켜야 합니다.
//Myutil1 클래스로 static이 작성되지 않음.
public class Myutil1 {
public int hap(int a, int b ) {
int v = a+b;
return v;
}
}
//main 메서드의 클래스
import model.Myutil1;
public class NoneStaticAccess {
public static void main(String[] args) {
int a = 10;
int b = 16;
//static이 아닌 클래스를 사용한다면 객체를 생성해주면 된다.
Myutil1 ut = new Myutil1();
int sum = ut.hap(a,b);
System.out.println("sum = " + sum);
}
}
💡 Method Area : 메서드의 기계어 코드가 할당되는 메모리 공간 / static 멤버들의 할당되는 메모리 공간
💡 Heap Area : 객체가 생성(new)되는 메모리공간
💡 JVM내에서의 메모리 모델
.크게 4가지로 구분지어서 확인할 수 있습니다.
- Method Area : static-zone과 none-static-zond으로 구성되어 있으며, 메서드의 바이트코드(기계어코드)가 할당되는 공간입니다. static 멤버들은 static-zone에 할당됩니다.
- Heap Area : 실제 객체가 생성되는 메모리 공간(new 연산자) / Java 프로그램의 메모리 구조 중 하나이며, 메모리 관리와 객체의 동적 생성 및 소멸에 중요한 역할을 합니다. GC(Garbage Collector)에 의해서 메모리가 수집됩니다. Heap Area는 우리가 객체를 생성되기 때문에 객체를 사용 후에는 소멸이 되어야 하는데, 메모리 계속 쌓이게 되면 용량을 차지하게 됩니다. 이 후, 객체를 생성할 때 메모리 용량이 부족하면 지연시간이 생기거나 에러가 날 수 있습니다. 이 때, GC라는 프로세스를 통해 Heap Area에 더이상 사용이 되지 않고 남아있는 Garbage 객체들은 주기적으로 clear 해주는 역할을 합니다. GC가 한번 Heap Area를 스캔하며 지나갈 때 각각의 객체가 사용중이라면 , 각각의 스캔 주기를 세대로 설정해줍니다. (맨 처음은 1세대) 이 후, 두번째 프로세스로 돌아왔을 때 기존에 사용중인 게 있다면 2,3,4..세대로 계속 업데이트를 해줍니다. 이 때 , 숫자가 높은 것들부터 GC를 진행하는 것을 Generation이라고 합니다.
- Thread : 스레드(Thread)는 프로그램 실행의 기본 단위로, 독립적으로 실행될 수 있는 작업 단위입니다. (JVM도 하나의 스레드라고 볼 수 있습니다) 스레드를 사용하면 여러 작업이 동시에 진행되는 것처럼 보이며, 다양한 작업들을 병렬적으로 처리할 수 있습니다. 스레드는 프로세스 내에서 독립적으로 실행되며, 각각의 스레드는 독립적인 작업 공간인 스택(Stack Area - Call Stack Frame Area)과 프로그램 카운터(Program Counter)를 가지고 있습니다. 메서드가 호출되면 메서드의 기계어코드를 할당 받고 메서드가 실행되는 공간(Call Stack Frame Area) - 지역변수, 매개변수들이 만들어지는 공간 PC에 의해서 현재 실행중인 프로그램 위치가 관리된다. LIFO(Last In First Out)구조로 운영되는 메모리공간
- Runtime Constant Pool (Literal Pool) : 상수 값 할당이 되는 메모리 공간 문자열 중 문자열 상수 (Literal : 리터럴)가 할당되는 메모리공간 (ex) 문자열 = “APPLE” → 리터럴)
728x90
반응형
'[ BACKEND] > JAVA_객체지향' 카테고리의 다른 글
[JAVA] 객체지향 프로그래밍 설계 (2) | 2023.06.17 |
---|---|
[JAVA] 객체 생성 & Static 과의 관계 (0) | 2023.06.16 |
[JAVA] VO클래스 설계 시 중요사항 (정보은닉 , Getter&Setter, 생성자 메서드, 오버로딩) (0) | 2023.06.14 |
[JAVA] 객체 접근 권한 & 패키지 (1) | 2023.06.13 |
[JAVA] 클래스(모델)의 종류 (1) | 2023.06.12 |