본문 바로가기
Java

static 키워드 정리 (메소드)

by Ms.Pudding 2022. 1. 7.

 

먼저 ... 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

댓글