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. labis98
    20230203 완료
  2. Min Jupiter
    23.01.17
  3. egorae
    선배님들이 남겨주신 비유들이 참 많은 도움이 됩니다.
    감사합니다.
  4. 보통사람 박코딩
    할수있다
  5. 코딩드림
    221104
  6. 제이드
    ⭐class Foo의 변수를 바꾸면 모든 인스턴스의 변수의 값이 바뀜

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

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

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

    인스턴스에서 static이 없는 변수 혹은 메소드를 수정시
    static이없는 변수 혹은 메소드는 인스턴스생성시 독립적으로 새로 생성된것이므로
    그인스턴스내에서 독립적으로 수정이된다.
  9. 치키티타
    220614 R
  10. 코딩이취미다
    class의 static 변수 메소드는 동일한 메모리를
    instance변수는 독립적인 메모리(별도의 스텍)를
    사용한다
  11. 육도
    2022.05.14 완료
  12. 유도영
    클래스(원본 틀)에 내장된 인스턴스 변수는
    인스턴스를 생성하여 인스턴스에서 사용할 때만 호출, 접근할 수 있으며 이는 클래스 변수와 달리 독립적인 개체이다.
    클래스 변수는 수정할 경우 연관된 인스턴스 모두에서 변경되지만
    인스턴스 변수는 각 인스턴스 마다 독립적인 개체로 연동되지 않는다.
  13. 열정jk
    220220 감사합니다
  14. 나연
    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` 클래스의 인스턴스에 있는 클래스 메소드는 클래스를 참조함

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

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

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

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

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

    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에는 영향이 없다. 는 의미.)



    }

    }
  30. jeisyoon
    2021.05.02 Static - OK

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

          static이 존재 하는 코드는 instance에서 원본인 class에 링크를 걸어 값을 가리킨다.(instance안에 실존하지 않음.) class에 있는 코드는 서로 링크가 걸려있기 때문에 한쪽에서 코드를 바꾸면 원본인 class와 다른 복제본인 instance의 값이 모두 바뀐다.

          static이 존재하지 않는 복제본인 instance에서는 class에 있는 값까지 모두 가져온다. 그렇지만 서로 링크가 걸려있지 않아서 instance에서든 원본인 class에서 코드를 바꾼다고 해서 그 값이 바뀐진 않는다.
        • 안광민
          instance 소속은 class를 통해 접근하는 것이 금지되어있다.

          class 내의 변수를 바꾸면 모든 instance의 변수 값이 바뀐다.
          instance에서 class의 변수를 바꾸면 다른 모든 instance를 포함해 모든 class의 변수값이 바뀐다.
          허나 instatnce에서 instance의 변수를 바꾸면 해당 instance 내의 instance 변수값만 바뀌고 다른 instance 변수값은 바뀌지 않는다.

          완료
        • 싱와
          이전부터 생각해왔지만 instance와 static 키워드는
          정확하지 않은 뇌피셜이지만
          제약회사의 오리지널약과 복제약들의 관계를 생각하면 이해가 편할것 같다.

          오리지널약의 성분을 복사해가서 조금 더 싼 값에 팔거나, 대량생산하기 위해 파는 약들을 복제약이라고 한다.

          이러한 복제약들의 성분은 기존 오리지널약들과 똑같은 성분을 가지고 있다.
          특별히 오리지널약에서 중요한 성분들이나, 함부로 복사할 수 없는 성분들을 원래 제약회사에서 "Static" 표시를 해놓는다.
          복제약들은 그 성분을 함부로 건드릴 수 없으며, 단지 원래 성분이 이것이라고, 지칭해놓을 뿐이다. 그래도 가져다 써야한다.

          만약에 복제약회사에서 static이라고 되어있는 이러한 부분을 건드려 성분을 조작한다면 원래회사의 신뢰도를 위해 바뀐 내용그대로 원래회사에서도 바뀌어야만 한다.

          그런데, 원래 제약회사에서 조금씩 풀어주는 부분이 있다. 복제약들을 만드는 회사들은 기회다.
          static 이 붙어 있지 않은 부분들을 조금씩 개조해서 더 좋은 약을 만들고는 한다.
          이때 이건 이 회사의 개발역량에 달린거다. 이거 바뀐다고 원래회사에서 성분 바꿔야하는 큰일? 벌어지지 않는다.

          --

          정리해볼까?

          원래 제약회사 Class는 static으로 특허권을 가지고 있다. 이건 함부로 복제해서 못건드린다.
          그래서 instance가 static의 내용을 바꾸기 위해서는 원래 제약회사인 class와
          충분한 협의를 거쳐 동의하에 같이 바꾸어야 한다. instance가 static 건드려서 바꾸면 class에서도 무조건 바꾸어야하고,
          이 약을 복제해간 다른 회사도 무조건 바꾸어야 한다. 그니까. 함부로 instance 복제약 회사가 멋대로 바꿀 수 없다.

          그런데, static이 붙어져 있지 않은 오픈소스의 개발부분은 instatnce 회사가 그냥 자유롭게 개발할 수 있다.
          이거 바꾼다고 Class측에서 득달같이 법무팀 데리고 와서 따지지 않는다. 자기들이 풀어준거니까.
        • 선대범
          // static 공유메모리 저장, 링크 -> 누적
          // 접근법 : 클래스.클래스<스태틱>멤버

          // instance 독립메모리 저장 -> 매번 초기화
          // 접근법 : 클래스명 인스턴스명 = new 클래스(); 인스턴스명.클래스[any]멤버
        • AI개발자
          static은 인스턴스를 쓰지 않습니다!
          대화보기
          • 빽토리얼
            static은 '정적'의 의미를 가지며 이것이 붙는다면 그 필드나 메서드는 클래스 형식이라는 의미.
            안 붙는다면 그 필드 및 메서드는 인스턴스 형식이라는 의미.

            클래스 형식(static)이라면 C언어의 Call by reference 처럼 인스턴스를 생성한다고 해도 원래 값은 class 내의 값 하나 뿐이며 인스턴스는 이를 포인터처럼 단순히 가리키게 된다. 즉 같은 메모리에 값이 가리키며, 이 때문에 인스턴스 내이든 클래스 내이든 그 값이 변한다면 이것은 다른 객체에도 영향을 끼치게 된다.

            반대로 인스턴스 형식(non-static)이라면 call by value로, 다른 인스턴스 객체 생성 시 아예 다른 메모리에 값이 저장 및 가리키게 되며 이렇게 되면 그 필드 및 메서드의 변화가 일어날 시 다른 객체에 영향을 끼치지 않게 된다.
          • 넘무
            static 이 정적,고정이다 라는 뜻이니
            static이 쓰이면 값은 고정되어서 인스턴스에서도 고정된 값을 갖는다 라고 생각하겠습니다
            좋은 수업 감사드립니다
          • gyun
            클래스 = 메소드 + 변수 그룹핑
            인스턴스 = 클래스의 복제본

            static = 클래스 소속 static (X) = 인스턴스 소속

            클래스 ABC와 클래스 ABC의 인스턴스 2개 ( Z , X ) 를 생성했다고 생각해보자.
            만약, 클래스 ABC의 변수 public static String abcvar = "HI"; 라고 하고 인스턴스 Z 에서 Z.abcvar = "Bye";라고 변경했다고 하자.
            그러면 ABC.abcvar = "Bye";가 되고, 인스턴스 Y에서 Y.abcvar = "Bye"; 가 된다

            클래스 ABC의 변수를 public String abcvar = "HI"; 라 했을때 인스턴스 Z에서 Z.abcvar="yellow"; 라고 변경했을때 Z.abcvar = "yellow" , ABC.abcvar = "Hi"; , Y.abcvar = "Hi"; 가 된다


            정리해보면 static이 붙은 클래스의 변수에서는 인스턴스에서 값을 변경하면 클래스 값도 변경되고, 반대로 클래스에서 변수를 변경하면 인스턴스 값들도 변경된다

            static이 붙지 않은 클래스의 변수에서는 인스턴스에서 변수를 바꾸더라도 클래스의 변수값은 변경되지 않는다.
          graphittie 자세히 보기