[Java] static과 non-static

KKS·2024년 1월 1일
0

Java

목록 보기
2/6
post-thumbnail

본 포스팅의 목적

  • 변수 및 메서드에 static이 있을 때와 없을 때의 차이점을 알아본다.

변수의 종류

  • 클래스변수(static 변수), 인스턴스변수(non-static 변수), 지역변수
클래스변수(static)인스턴스변수(non-static)지역변수
생성시기클래스가 메모리에 로드될 때 즉,
인스턴스 생성 전
인스턴스가 생성될 때메서드 호출 시
특징모든 인스턴스들이 공유하는 변수인스턴스마다 고유값을 갖는 변수메서드 내에서만 사용 가능
접근방법인스턴스의 생성없이,
클래스이름.변수명으로 접근
인스턴스 생성 후,
참조변수.변수명으로 접근
메서드 호출 시,
매개변수로 접근
or 메서드 내에서만 사용
변수 초기화
(참고)
선택선택필수

static변수와 non-static변수에 접근하기

class Card {
	//static 변수
	static int area;
    
	//non-static 변수
    String color;
}

class CardTest {
	public static void main(String[] args) {
    	//객체 생성 없이, staitc변수에 접근
    	Card.area = 100;
        
        //객체 생성 후,
	    Card c = new Card();
		//non-staitc변수에 접근
        c.color = "white";
    }
}

메서드의 종류

  • 클래스메서드(static 메서드), 인스턴스메서드(non-static 메서드)
클래스메서드(static)인스턴스메서드(non-static)
호출시기클래스가 메모리에 로드될 때 즉,
객체 생성 전 호출 가능
객체 생성 후 호출
호출방법객체 생성없이,
클래스이름.메서드명으로 호출
객체 생성 후,
참조변수.메서드명으로 호출
특징클래스메서드에서 인스턴스변수 사용 불가,
주로 지역변수를 사용
인스턴스메서드에서 인스턴스변수 사용

static메서드와 non-static메서드 호출하기

class MyMath {

	//non-static 변수
	int a, b;
    
	//static 메서드 : 주로 지역변수 사용
	static int add1(int a, int b) {
    	return a+b;
    }
    
	//non-static 메서드 : non-static변수 사용
	int add2() {
    	return this.a + this.b;
    }
    
}

class MyMathTest {
	public static void main(String[] args) {
    	//객체 생성 없이, staitc메서드 호출
    	MyMath.add1(1,2);
        
        //객체 생성 후,
        //non-staitc메서드 호출
	    MyMath my = new MyMath();
        my.add2();

    }
}

총정리

static 변수,메서드 + 인스턴스 변수,메서드

public class StaticNonstaticTest {
	public static void main(String[] args) {
//		1. static변수에 접근
		StaticNonstatic.a = 10;
		StaticNonstatic.b = 20;
        
//		2. static메서드 호출
		StaticNonstatic.add1(10, 20);
		StaticNonstatic.add2(10, 20);
		
//		3. 인스턴스변수에 접근
		StaticNonstatic sn = new StaticNonstatic();
		sn.x = 10;
		sn.y = 20;
        
//		4. 인스턴스메서드 호출
		sn.add3();
		sn.add4();
		
	}
	
}

//아래의 코드에서 직접 사용, 직접 호출이라는 말은 객체 생성 및 참조변수 없이 접근하는 것을 뜻한다.
class StaticNonstatic {
	//static 변수 
	static int a;
	static int b;
	
	//인스턴스 변수 
	int x;
	int y;
	
	//static 메서드1
	static int add1(int p, int q) {
		//같은 클래스 안에서,
		//static메서드는 static 변수 직접 사용 가능.
		a = 10;
		b = 20;
		
		//static메서드는 인스턴스변수 직접 사용 불가능
		//x = 10;
		//y = 20;
		return a+b+p+q;
	}
	
	//static 메서드2
	static int add2(int a, int b) {
		//같은 클래스 안에서,
		//static메서드는 다른 static 메서드 직접 호출 가능
		int p = add1(a, b);
		
		//static메서드는 인스턴스메서드 직접 호출 불가능
		//int a = add3();
		return p; 
	}
	
	//인스턴스 메서드1
	int add3() {
		//같은 클래스 안에서,
        //인스턴스 메서드는 인스턴스 변수 직접 사용 가능.
		this.x = 10;
		this.y = 20;
		
		//인스턴스 메서드는 static 변수 직접 사용 가능.
		a = 10;
		b = 20;
		return this.x + this.y + a + b;
	}
	
	//인스턴스 메서드2
	int add4() {
		//같은 클래스 안에서,
        //인스턴스 메서드는 다른 인스턴스 메서드 직접 호출 가능 
		int a = add3();
		
		//인스턴스 메서드는 다른 static메서드도 직접 호출 가능
		int b = add1(10, 20);
		int c = add2(10, 20);
		
		return a+b+c;
	}
}

static, non-static 이용에 차이가 발생하는 이유

  • 변수 및 메서드에 static이 있으면 객체를 생성하기도 전에, 클래스가 메모리에 올라갈 때 이미 사용할 수 있는 상태가 된다. 따라서, 객체 생성없이 바로 사용할 수 있다.
  • static 메서드 내에서 non-static 변수를 사용할 수 없는 이유는, non-static 변수는 객체가 생성되어야 비로소 사용할 수 있는 상태가 되는데, static 메서드가 호출된 시점에 객체가 생성되었는 지 확신할 수 없기 때문이다.

그렇다면, 언제 static을 붙일까?

  • static 변수 : 하나의 클래스로 여러 인스턴스를 생성할 때, 모든 인스턴스에서 공통 값을 유지할 필요가 있는 변수에 static을 붙인다.
  • static 메서드 : non-static변수를 사용할 필요가 없는 메서드에 static을 붙인다. static메서드는 주로 매개변수로 넘어오는 지역변수나, static메서드 내 지역변수를 이용한다.

참고문헌

  • 자바의 정석 3판 (남궁성 저)
profile
공부하고 이해한 내용들을 직접 그림과 표를 그리면서 정리해보는 공간입니다.🤗

0개의 댓글