먼저 ... Static은 왜 객체화하지 않고 사용이 가능할까?(heap,static 메모리 이해)
Static은 이미 공부한대로 객체화하지 않고 클라스 그대로 가져와서 메소드나 변수를 사용할 수 있다.
하지만 왜 객체화를 안해도 쓸 수 있을까?
static은 말그대로 정적키워드이다.
heap이라는 것은, 내가 접근할 수 있는 메모리 영역인데, 객체화가 시작되면 변수값은 heap이라는 메모리 안에 들어간다. Car.변수 이름 등등
하지만 static이 붙여진 변수나 메소드는 static이라는 저장공간에 바로 올라간다. 그 static메모리를 점유하여 자리에서 움직이지 않는다.
static final이 보통 같이 붙어있는 경우가 많은데 , 이는 상수를 만들기 위함이다.
상수란 값이 변하지 않는 값을 말한다.
public class Main{
public static void main(String[] args){
Account A1 = new Account(1000); // 1000원이 있는 계좌 생성
A1.letsPrint();
Hacker.thief(A1);
A1.letsPrint();
}
}
calss Account{
int balance;
public Account(int balance){
this.balance = balance;
}
public void letsPrint(){
System.out.printf("잔액은 %d원 입니다",balance);
}
}
class Hacker{
public static void thief(Account hacker){
hacker.balance = 0;
}
}
위의 코드를 보면 Hacker는 따로 객체 생성을 하지 않아도 thief()메소드를 가져왔다.
왜 letsprint()메소드는 객체 생성을 하여 가져오고, thief()는 객체 생성필요없이 바로 클래스에서 가져올 수 있었을까?
static의 뜻은 staying in one place without moving으로 정적의 라는 뜻이다..
자바 프로그래밍에서 static의 뜻은 클래스에 속해있다는 뜻이다. 따라서 Hacker.thief()로 메소드를 클래스에서 바로 가져올 수 있다.
하지만 static속성이 없는 letsPrint()의 경우 클래스에는 들어있지만 바로 꺼내올 수가 없기 때문에 인스턴스 변수를 만들어서 가져온다. account..letsPrint();
Math클래스도 static메소드를 가지고 있다..
Math클래스를 쓸 때, new Math()라고 객체를 생성해서 메소드를 쓰지 않았다.
바로 Math.sqrt() , Math.floor() 처럼 메소드를 사용하였다.
static메소드는 바꿀 수 없지만, static 변수는 바꿀 수 있다.
public static int a;
public int b;
가 있다고 치자. 이때 a에 값을 주는 방법은 여러가지가 있다.
1. static의 공식인, 클래스로 바로 가져와서 하는 방법
Account.a = 0;
2. static변수도 인스턴스 변수를 써서 값을 줄 수도 있다
account.a = 0;
하지만 b의 경우 , static변수가 아니기 때문에 1번이 불가하다
반드시 인스턴스 변수를 사용하여 값을 바꿀 수 있다.
static변수 관련 더 자세한 설명 다시 포스팅하였다
https://puddingdev.tistory.com/15?category=995208
'Java' 카테고리의 다른 글
this참조 변수와 this()메소드 (0) | 2022.01.07 |
---|---|
i++랑 ++i의 차이점 (0) | 2022.01.07 |
== 와 .equals의 차이점 (0) | 2022.01.07 |
레퍼런스 타입과 레퍼런스 변수 (0) | 2022.01.07 |
자바 get,set 메소드 (getter,setter) (0) | 2022.01.07 |
댓글