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. 제예솔
    static 은 class의 소속 / None - static은 instance의 소속.
    늘 감사합니다:)
  2. 포기금지
    static이 있는 원본 class&
    static이 없는 복제본instance 차이

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

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

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

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

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

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

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

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

    --

    정리해볼까?

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

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

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

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

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

      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이 붙지 않은 클래스의 변수에서는 인스턴스에서 변수를 바꾸더라도 클래스의 변수값은 변경되지 않는다.
    • jajavava
      static이 있는 것은 클래스소속이고 없는 것은 인스턴스의 소속이다.
      클래스와 인스턴스의 연결관계의 차이는 인스턴스는 클래스의 복제인데 클래스메소드는 인스턴스와 연결되어
      있기 때문에 값을 바꾸면 그 바뀐 값이 서로 적용되고 인스턴스의 메소드는 서로 개별적이다.
    • 열공하자
      저는 쉽게 풀어서 정리해보았습니다.
      클래스의 복제 인스턴스를 만들때, static이 붙은 메서드는 지역적 특성으로 인해,
      복제된 인스턴스 안에 있는 것이 아니라 그 값이 클래스 값을 가리키고 있는 것임.
      ex) static이 붙은 메서드를 메인 메서드의 인스턴스에서 값을 변환 시키면, 모든 복제된 인스턴스에서 값이 변환이 되고, static이 붙지 않은 메서드는 각 인스턴스에서 값을 다르게 표현 가능함.

      제가 이해한 것이 맞는 것인가요??
    • static 변수, 함수는 클래스 생성할 때 같이 생성 되기 때문에 인스턴스로 생성해주지 않아도 바로 어디든 사용 가능하고 클래스 내부에서 값을 관리해서 공통으로 수정 가능하다.

      인스턴스 변수, 함수는 복제본(인스턴스)로 객체를 생성해주어야 사용가능하고 각 본제본에 값을 관리하기 때문에 다른 본제본에 값에 영향을 끼치지 않는다.
    • 2020.03.15 완료
    • 복잡한데... 필요하니까 분류해 놓았겠지요....
      조심해서 써야겠네요...
      감사합니다..
    • Serina
      다시 이해안되기 시작했어요^^;;
    • 감자맛
      * [클래스 함수] → [클래스 변수] 접근 가능, [인스턴스 변수] 접근 불가능
      * [인스턴스 함수] → [클래스 변수] 접근 가능, [인스턴스 변수] 접근 가능
      * [클래스]로 접근 시 → [클래스 함수] 사용 가능, [인스턴스 함수] 사용 불가능, [클래스 변수] 접근 가능, [인스턴스 변수] 접근 불가능
      * [인스턴스]로 접근 시 → [클래스 함수] 사용 가능, [인스턴스 함수] 사용 가능, [클래스 변수] 접근 가능, [인스턴스 변수] 접근 가능

      *[인스턴스] 또는 [클래스]로 접근해 수정한 [클래스 변수]의 값은 다른 모든 인스턴스에게 영향을 끼침.
      *[인스턴스]로 접근해 수정한 [인스턴스 변수]의 값은 다른 인스턴스에게 영향을 끼치지 않음.
      대화보기
      • 감자맛
        여기부터 갑자기 난이도가 가팔라지네요 ㅋㅋ
      • 라또마니
        다시 한번 들어야 할 듯.. 하네요~~
      • 이렇게 원리 다 설명해주는거 너무 좋아요
      • 이기호
        감사합니다!^^
      • 쑤우
        수강완료. 감사합니다~
      • 허공
        감사합니다!
      graphittie 자세히 보기