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 공유메모리 저장, 링크 -> 누적
    // 접근법 : 클래스.클래스<스태틱>멤버

    // instance 독립메모리 저장 -> 매번 초기화
    // 접근법 : 클래스명 인스턴스명 = new 클래스(); 인스턴스명.클래스[any]멤버
  2. 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 자세히 보기