JAVA 객체지향 프로그래밍

static

수업소개

static 키워드에 대해서 살펴보는 수업입니다. 

 

 

 

강의

소스코드

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

	public static void main(String[] args) {
		System.out.println(Foo.classVar); // OK
//		System.out.println(Foo.instanceVar); // Error
		Foo.classMethod();
//		Foo.instanceMethod();
		
		Foo f1 = new Foo();
		Foo f2 = new Foo();
//		
		System.out.println(f1.classVar); // I class var
		System.out.println(f1.instanceVar); // I instance var
//		
		f1.classVar = "changed by f1";
		System.out.println(Foo.classVar); // changed by f1
		System.out.println(f2.classVar);  // changed by f1
//		
		f1.instanceVar = "changed by f1";
		System.out.println(f1.instanceVar); // changed by f1
		System.out.println(f2.instanceVar); // I instance var
	}

}

 

댓글

댓글 본문
  1. Setagaya
    class 소속인
    static 변수
    static 메소드는 클래스로도 인스턴스로도 접근이 가능하다.
    즉, 클래스로든 인스턴스로든 값을 변경할 수 있다는 말이다.
    (인스턴스가 사용하면 static 소속의 변수나 메소드는 클래스 소속의 것을 참조하는 것이기 때문에, 인스턴스가 그 값들을 변경시키면 결국 참조하고 있는 클래스의 값들도 변경되고 다른 인스턴스들에게도 공유가 된다), 모두 참조하고 있는 곳이기 때문에.

    instance 소속인
    no static 변수
    no static 메소드의 값은 그 인스턴스 내에서만 존재하기 때문에 클래스가 접근할 수 없고, 다른 어떤것에 영향을 받지 않는다.
  2. nextLevel
  3. 정원혁
    20240127
  4. usbinn
    제가 아는 건 스태틱의 단검밖에 없었는데... 유용한 강의 감사합니다.
  5. 호세담
    static이 있다->class
    static이 없다->instance
    '클래스를 통해' 새로운 instance(f1)를 만들경우 class는 링크되어있는 채로 복사가 된다.
    반면 instance는 링크되지 않은 독립적이어서 복제된 f1의 instance를 바꿔도 다른 영역에 영향을 못준다
    class는 앞서 말했듯이 링크 되어있기 때문에 f1의 class 영역을 변경할경우 원본 class 에도 영향을 주고 이로인해 다른 instance(f2)의 class 정보도 바뀌게 된다.
  6. lehoo
    static이 붙어있으면 class 소속
    static이 붙어있지 않으면 instance 소속이다.
  7. 당당
    2023.04.22
  8. 화려하게간다
    Java에서 static은 정적이라는 뜻을 가지고 있습니다. static 키워드는 클래스 멤버 (인스턴스 변수, 메소드)를 정적 멤버로 만듭니다.

    static 멤버는 객체를 생성하지 않고도 클래스 이름으로 접근할 수 있으며, 모든 객체가 공유하는 값 또는 기능을 표현하는 데 사용됩니다. 즉, static 멤버는 클래스의 인스턴스에 속하는 멤버가 아닌 클래스 자체에 속하는 멤버입니다.

    static 변수는 객체가 생성되기 이전에 클래스 로딩 시점에서 초기화됩니다. 따라서 static 변수는 모든 객체에서 동일한 값을 가지게 됩니다.

    static 메소드는 객체가 아닌 클래스에 속한 메소드로, 클래스 이름으로 직접 호출할 수 있습니다. 따라서, static 메소드는 객체를 생성하지 않고도 클래스의 기능을 사용할 수 있습니다.

    Java에서 static 키워드는 다음과 같은 용도로 사용됩니다.

    클래스 변수(static 변수) 선언
    클래스 메소드(static 메소드) 선언
    static import를 사용하여 클래스의 static 멤버를 직접 import
    하지만, static 키워드의 남발은 객체 지향적인 설계와는 맞지 않으므로, 적절한 사용을 유지하는 것이 좋습니다.
  9. 화려하게간다
    클래스 변수는 모든 것들에 공통 적용될 것,
    인스턴스 변수는 각각의 상황에 따라서 달라져야 하는 것이군요!
  10. labis98
    20230203 완료
  11. Min Jupiter
    23.01.17
  12. egorae
    선배님들이 남겨주신 비유들이 참 많은 도움이 됩니다.
    감사합니다.
  13. 보통사람 박코딩
    할수있다
  14. 코딩드림
    221104
  15. 제이드
    ⭐class Foo의 변수를 바꾸면 모든 인스턴스의 변수의 값이 바뀜

    ⭐인스턴스의 그 클래스 변수를 바꿀 수도 있는데, 그렇게 되면 클래스 변수가 바뀌며 걔를 사용하는 모든 인스턴스의 값이 바뀜.
  16. economin
    수강완료
  17. static존재 -> class소속
    static없음 -> 클래스를 복제한 인스턴스소속

    클래스를 복제한 인스턴스드들에서
    클래스의 static이없는 변수,메소드들은 인스턴스내에서 각각 독립적으로 새로 존재.
    클래스의 static이있는 변수,메소드들은 인스턴스내에서 존재한다기보단 class의 존재하는것들을 가리킴(연결됨)

    따라서
    인스턴스에서 static이 있는 변수 혹은 메소드를 수정시
    class에서 그원본 자체가 수정이되고
    그변수,메소드를 가리키는 모든곳에서 수정이된다.

    인스턴스에서 static이 없는 변수 혹은 메소드를 수정시
    static이없는 변수 혹은 메소드는 인스턴스생성시 독립적으로 새로 생성된것이므로
    그인스턴스내에서 독립적으로 수정이된다.
  18. 치키티타
    220614 R
  19. 코딩이취미다
    class의 static 변수 메소드는 동일한 메모리를
    instance변수는 독립적인 메모리(별도의 스텍)를
    사용한다
  20. 육도
    2022.05.14 완료
  21. 유도영
    클래스(원본 틀)에 내장된 인스턴스 변수는
    인스턴스를 생성하여 인스턴스에서 사용할 때만 호출, 접근할 수 있으며 이는 클래스 변수와 달리 독립적인 개체이다.
    클래스 변수는 수정할 경우 연관된 인스턴스 모두에서 변경되지만
    인스턴스 변수는 각 인스턴스 마다 독립적인 개체로 연동되지 않는다.
  22. 열정jk
    220220 감사합니다
  23. 나연
    2022년 2월 14일 (월) 완료

    `static` 존재: 클래스 소속
    `static` 존재 X: 인스턴스 소속

    클래스를 통해 클래스 변수 접근 가능
    인스턴스 변수는 인스턴스를 통해서 사용하도록 고안됨

    클래스 메소드 안에서는 클래스 변수에는 접근이 되는데 인스턴스 변수에는 접근할 수 없음
    인스턴스 메소드 안에서는 클래스 변수와 인스턴스 변수 모드 접근 가능

    ```java
    public static void main(String[] args) {
    System.out.println(Foo.classVariable); // OK
    // System.out.println(Foo.instanceVariable); // Error

    Foo.classMethod(); // OK
    // Foo.instanceMethod(); // Error
    }
    ```
    인스턴스 메소드는 인스턴스 소속이기 때문에 클래스를 통해 접근하는 것은 금지되어 있음

    `Foo` 클래스의 인스턴스에 있는 클래스 변수에 실제 값이 존재하지 않고 `Foo`라는 클래스를 가리키고만 있음
    `Foo` 클래스의 인스턴스에 있는 클래스 메소드는 클래스를 참조함

    클래스의 변수를 바꾸면 모든 인스턴스의 변수의 값이 바뀜
    인스턴스에서 클래스 변수를 바꿀 수도 있는데 그렇게 되면 클래스의 변수가 바뀌고 그 클래스를 사용하고 있는 모든 인스턴스의 값도 바뀜
  24. 김나루
    2022-01-27
  25. 까칠한순두부
    인스턴스 생성 시, static 멤버 '참조', non-static 멤버 '복제'
    즉, 참조된 class나 인스터스의 멤버를 바꾸면 둘 다 바뀜
    non-static으로 인해 복제된건 인스턴스 멤버 하나만 바뀜
  26. 주간식당메뉴
    21.11.17.
  27. LEDX
    마지막 부분이 이해가 잘 가지 않아요
    앞서 배운대로라면 클래스는 static을 쓰고 인스턴스는 쓰지않는데
    public static으로 선언된 classVar를 f1.classVar, f2.classVar로 호출할수 있는건가요?

    이클립스에서도 해당부분은 오류로 인식하고 노란밑줄표시가 되면서
    'classVar는 static 방식으로 엑세스해야합니다' 라고 경고가 뜨고
    'classVar의 static 수정자 제거' 라는 빠른수정 가이드라인까지 표시되는데

    이상하게 실행은 또 오류없이 잘 되네요...
  28. 까만콜라
    2021.09.29 완료
  29. 2021.09.02 완료
  30. 이마누
    완료
  31. labis98
    20210813 good!!!
  32. super1Nova
    210807
  33. Jaemin Lim
    21.07.25
    static 은 클래스 소속. 인스턴스는 클래스를 이용해서 만듬
    클래스에선 만들어지기기 전인 인스턴스에 접근 할수 없음.
    인스턴스에선 부모격인 클래스에 접근할 수 있음.
  34. HalfMoon
    제가 이해한게 맞다면 공유폴더를 예시로 이해하면 조금 더 쉽게 이해가 될 것 같네요.

    Static - 공유폴더의 내용물. 안의 내용물을 볼 수 있고, 사용할 수 있지만, 폴더의 내용물을 수정하면 해당 폴더를 공유하고 있는 모든 사용자에게도 수정된 결과물이 보여짐
    ex) 공유폴더 안에 있는 txt 파일의 내용을 수정하면, 다른 사용자 또한 내가 수정한 내용을 보게 됨.

    Instance - 공유폴더의 내용물을 내 컴퓨터로 복사한 것. 그렇기 때문에 내가 수정한 것은 내게만 영향을 미침
    ex) 공유폴더 안에 있는 txt파일을 복사해서 내 컴퓨터에 가져온 뒤 내용을 수정
  35. 초딩 개발자
    2021/06/27
  36. 싸알
    1. static이 있는 건 클래스 소속, static이 없는 건 인스턴스 소속
    2. 클래스로 정의된 변수나 메소드는 클래스를 통해서 접근 가능하지만 인스턴스로 정의된 변수나 메소드는 해당 클래스의 인스턴스를 생성해야만 접근할 수 있다.
    3. 인스턴스에서 해당 클래스로 정의된 변수를 수정하면 그 클래스를 포함한 모든 인스턴스의 변수가 수정되지만, 인스턴스에서 해당 인스턴스로 정의된 변수를 수정하면 해당 인스턴스의 변수만 수정된다.
  37. 히야형
    static이 있는건 class 소속
    static이 없는건 instance소속
  38. 도전까마귀
    이번 강의 내용은 정말 헷갈리네요,,
    각 코드 별 의미하는 내용을 주석에 정리해봤습니다...

    class Foo{

    public static​ String classVar = "I class var"; // 클래스 Foo에 스태틱 변수 classVar 생성 (선언)

    public String instanceVar = "I instance var"; //클래스 Foo에 인스턴스 변수 instanceVar 생성 (선언)

    public static void classMethod() { // 클래스의 스태틱 메소드가 클래스 Foo의 변수에 접근이 가능한지 확인 과정

    System.out.println(classVar); // Ok //스태틱 메소드는 클래스 Foo의 스태틱 변수 classVar에 접근 할수 있다.

    // System.out.println(instanceVar); // Error // 스태틱 메소드는 클래스 Foo의 인스턴스 변수 instanceVar에 접근 할 수없다.

    }

    public void instanceMethod() { // 클래스의 인스턴스 메소드가 클래스 Foo 의 변수에 접근이 가능한지 확인 과정.

    System.out.println(classVar); // Ok // 인스턴스 메소드는 클래스 Foo의 스태틱 변수 ClassVar에 접근이 가능하다.

    System.out.println(instanceVar); // Ok // 인스턴스 메소드는 클래스 Foo의 인스턴스 변수 instanceVar에 접급이 가능하다.



    }

    }

    public class StaticApp {

    public static void main(String[] args) {

    System.out.println(Foo.classVar); // OK // 클래스 Foo의 스태틱 변수에 접근이 가능하다.

    // System.out.println(Foo.instanceVar); // Error // 클래스 Foo의 인스턴스 변수에 접근이 불가능 하다.



    Foo.classMethod(); // 클래스 Foo의 스태틱 메소드에 접근이 가능하다.

    // Foo.instanceMethod(); // 클래스 Foo의 인스턴스 메소드에 접근이 불가능하다.

    Foo f1 = new Foo();

    Foo f2 = new Foo();

    // Foo f1,f2 인스턴스를 생성



    System.out.println(f1.classVar); // I class var 클래스 Foo의 스태틱 변수 그대로 접근 가능하다.

    System.out.println(f1.instanceVar); // I instance var 클래스 Foo의 인스턴스 변수 그대로 접근 가능하다.

    //

    f1.classVar = "changed by f1"; // 인스턴스 f1을 통해 스태틱 변수 classVar의 내용을 바꿀 경우.

    System.out.println(Foo.classVar); // changed by f1 클래스 Foo의 스태틱 변수 내용을 불렀을 때 내용이 바뀐 채로 출력 된다. (원본 자체가 바뀌었다는 의미)

    System.out.println(f2.classVar); // changed by f1 인스턴스 f2의 스태틱 변수 내용을 불렀을 때도 내용이 바뀐채로 출력된다. (원본 자체가 바뀌었다는 의미)



    //

    f1.instanceVar = "changed by f1"; // 인스턴스 f1을 통해 인스턴스 변수의 내용을 바꿀 경우.

    System.out.println(f1.instanceVar); // changed by f1 인스턴스 f1의 인스턴스 변수내용을 불러냈을때, 바뀐 내용으로 출력된다. (인스턴스 f1의 내용만 바뀌었다는 의미.)



    System.out.println(f2.instanceVar); // I instance var 인스턴스 f2의 인스턴스 변수 내용을 불렀을때, 인스턴스 변수 내용은 원본내용으로 출력 된다. (인스턴스 f1의 인스턴스 변수 내용을 변경해도, 스태틱변수의 내용 (원본 내용)을 변경한 것은 아니니, 인스턴스 f2에는 영향이 없다. 는 의미.)



    }

    }
  39. jeisyoon
    2021.05.02 Static - OK

    static = Class, no Static = Instance
    static variable 의 값을 바꾸면 Instance 전체의 값이 바뀌나
    no static variable 값을 바꾸면 해당 Instance 의 값만 바뀌고 다른 Instance 값은 바뀌지 않는다.
    따라서 Class 내 동일한 data 값이 필요한 variable은 static 이 바람직하다.
  40. anya422
    done!
  41. 이현수
    2021.04.17
  42. 레이
    2021.04.15
  43. 코린이
    설명ㄷㄷ 이해 잘 가네요
    대화보기
    • chimhyangmoo
      21.04.11
    • 비더베스트
      static은 클래스든 인스턴스든 모든 곳의 기본값을 설정하는 명령어인 것 같습니다. 근데 궁금한게 변수가 아닌 메소드는 어차피 변경이 불가능한데 메소드도 static (class) 과 instance를 구분하는 것이 의문입니다. 그냥 class 변수를 사용할 메소드와 instance를 사용할 메소드를 각각 따로 넣기 위한 것은 아닐 것 같은데,.. 아니면 method도 instance마다 따로 변경 가능한 방법이 있어서 메소드도 static을 사용하도록 한 것이겠지요??
    • 김우중
      감사합니다
    • boat
      감사합니다!
    • 전현지
      덕분에 더 잘 이해하게되었습니다 감사합니다!
      대화보기
      • 전현지
        덕분에 더 잘 이해하게되었습니다 감사합니다!
        대화보기
        • oyuiw
          20201213
        graphittie 자세히 보기