[Java] Static 정리

JTI·2022년 10월 21일
1

☕️  Java

목록 보기
8/59
post-thumbnail

💡 클래스 접근 static / instance


먼저 class Foo에다가 두개의 변수를 만들 것이다.

변수 하나는 이름이 static String classVar이고 앞에 static이 붙여져 있기 때문에 소속이 클래스 소속이다.

또 하나는 String instanceVar라는 이름의 변수를 만들 것인데 앞에 static이 없으므로 인스턴스의 소속이다.

그럼 여기서 테스트를 해 보자.

class Foo {
	public static String classVar = "I class var"; // class 변수
	public String instanceVar = "I instance var"; //  instance 변수
}

public class StaticApp {
	public static void main(String[] args) {
		System.out.println(Foo.classVar); // Ok
		System.out.println(Foo.instanceVar); // Error
	}
}

🤔 여기서 궁금한 점은,
1. 클래스를 통해서 classVar에는 접근이 되는가?
2. 클래스를 통해서 instanceVar에는 접근이 되는가?

System.out.println(Foo.classVar);는 클래스를 통해서는 당연히 클래스 변수에 접근이 된다.
하지만, System.out.println(Foo.instanceVar); 얘는 에러가 난다.

즉, 인스턴스는 인스턴스를 통해서 사용하도록 고안되어 있다.
(메모리에 올려놓은 상태, 객체가 생성된 후 사용 가능.)

💡 static 메서드 / instance 메서드


자 그 다음에 따져볼 것은 메서드를 만들어 볼 건데, static 메서드와 instance 메서드를 만들어 볼 것이다.

class Foo {
	public static String classVar = "I class var";// class 변수
	public String instanceVar = "I instance var";// instance 변수
	
	// class 메서드
    public static void classMethod() {
		System.out.println(classVar);// Ok
		System.out.println(instanceVar); // Error
	
    }// instance 메서드
    public void instanceMethod() {
		System.out.println(classVar); // Ok
		System.out.println(instanceVar);// Ok

	}
}

public class StaticApp {
	public static void main(String[] args) {
    
	}
}

클래스 메서드 안에서는 클래스 변수에는 접근에 되는데 인스턴스 변수에는 접근할 수 없다.

반면, 인스턴스 메서드 안에서는 클래스 변수와 인스턴스 변수 모두 접근 가능하다.

💡 호출


🤔 그럼 Foo의 클래스 메서드는 호출이 될까?
🤔 Foo의 인스턴스 메서드는 호출이 될까?

class Foo {
	public static String classVar = "I class var";// class 변수
	public String instanceVar = "I instance var";// instance 변수
	
	// class 메서드
    public static void classMethod() {
		System.out.println(classVar);// Ok
		System.out.println(instanceVar); // Error
	
    }// instance 메서드
    public void instanceMethod() {
		System.out.println(classVar); // Ok
		System.out.println(instanceVar);// Ok

	}
}

public class StaticApp {
	public static void main(String[] args) {
    	Foo.classMethod(); // Ok
        Foo.instanceMethod(); // Error
	}
}

Foo의 클래스 메서드는 당연히 클래스 소속이여서 호출이 된다.
하지만, 인스턴스 메서드는 인스턴스 소속이기 때문에 클래스를 통해서 접근하는 것은 금지되어 있다.

❓ instance와 static 자세히

그럼 인스턴스를 만들어 보자.

Foo f1 = new Foo();

f1이라는 인스턴스가 만들어지고 이 인스턴스는 이 클래스를 원형으로 하기 때문에 클래스에 있는 여러가지 멤버변수들을 복제해 오는데, classVar는 static이다. 즉, class 소속이다.
그래서 f1에는 실제 값이 존재하지 않고 그냥 Foo라는 class를 가르키고 있을 뿐이다.

그 다음에, instanceVar는 Foo에서 f1이라는 인스턴스가 생성될 때 instanceVar라는 변수가 생성되면서 만약에 클래스의 값도 세팅되어 있다면 그 값까지 복제가 된다.
즉, 그 안에 값이 있다는 것.

그리고 클래스 내부의 instanceVar인스턴스 내에 instanceVar는 서로 링크 걸려 있지 않기 때문에 값을 바꾼다고 해서 바뀌지 않는다.

하지만 인스턴스 내의 classVar의 값을 바꾸면 클래스 내부의 classVar도 바뀐다.

이것도 중요한 둘의 차이이다.

메서드도 마찬가지로 static classMathod()는 클래스를 참조하는 것이고 instanceMethod()는 클래스에 있는 인스턴스 메서드를 복제한 것이다. 서로 독립된 존재이다.

⭐️⭐️ 중요한 점은 클래스에 변수를 바꾸면 모든 변수의 값이 바뀐다.
또 인스턴스에서 그 클래스 변수를 바꿀 수도 있는데 그렇게 되면 클래스 변수도 물론 바뀌고 걔를 사용하고 있는 모든 인스턴스에 값도 바뀐다.

✏️ 마지막 점검



결과값을 보고 다시 한번 이해해보자!

profile
Fill in my own colorful colors🎨

0개의 댓글