이해에 어려움이 많으신 분이 많은 거 같아. 한마디 남겨봅니다. 가장 쉽게 이해할 수 있는 방법은 "static - 어떤 변화도 허용하지 않는다." 라고 생각하시면 됩니다. 따라서 Class를 복제한 Instance에서도 static이 포함된 구문에서 수정을 시도한다면 그 Instance의 모체인 Class에서도 수정이 되는 것이구요. 이건 대학교 수강신청을 생각하시면 이해가 빠를겁니다. 대학교는 학적시스템에 09시부터 17시까지 시간표가 존재합니다. 이게 클래스구요. 우리는 거기서 자신이 수강할 과목을 선택해서 수강신청을 합니다. 그게 인스턴스가 되겠죠. 그럼 저희의 수강신청 정보가 학적시스템에 기록이 되면서 변화가 생깁니다. 그럼 이건 static이 아닌 정보라는 것이죠. 마지막으로 09시 이전에는 시간표가 없는 데, 어떤 누군가가 해킹을해서(극단적 예시로) 08시 시간표를 만들어버렸습니다. 그럼 학적시스템 자체가 변동이 되겠죠(기록이 아니라). 이게 static인 정보를 인스턴스에서 변화를 주었을 때의 예시입니다. 예가 어렵게 느껴질 수도 있습니다.. 가장 쉬운 방법은 생활코딩님의 냉장고 예시라 생각하며 애초에 추상적인 내용이라 여러번 읽고, 몸으로 느끼시다보면 언젠간 깨닫게 될거예요 즐코딩하세요~
선언할떄 static 을 붙이면 클래스 전용임. 빼면 인스턴스 전용 전강의에서 클래스 : 전시된 햄버거 인스턴스 : 내가 구성바꾼 햄버거 라는 비유를 했는데 인스턴스 에서는 클래스에 있는거 다 쓸 수 있음 햄버거 먹는데 패티 안주면 그게 햄버거임 ? 아니자늠 당연히 다 쓸 수 있어야함 반대로 클래스 에서는 이게 기본구성이니깐 너무 맵거나 그런거는 쓰면 안됨 예를들어 엄청 매운거 좋아하는 사람이 붉닭소스를 햄버거에 넣어 먹었는데 이걸 기본구성으로 만들어 버리면 맵찔이들은 못먹으니깐 근데 기본구성으로 되있는걸 바꿀순 있음 두가지방법이 있는데 1. 그냥 햄버거 가게에서 우리 인제 밀 없어 쌀로 만들꺼임 님들 ㅅㄱ 쌀빵 햄버거 탄생 ( 클래스에서 변경) 2. 소비자들이 애국심이 넘쳐서 우리 밀 수입하지말고 쌀로 빵 만들어 먹자 !! 햄버거 가게는 이 요구를 즉각 반영해라 !! ( 인스턴스 에서 변경)
클래스에서 여러 독립적인 인스턴스를 생성할 때 모든 인스턴스가 공통적으로 사용해야 하는 값에 대해선 static을 취한다. 반면에 독립적인 인스턴스에서 클래스의 변수나 메소드를 가져와 변동하여 사용할 경우엔 static을 쓰지 않는다. 작성한 메서드 중에서 인스턴스 변수를 사용하지 않는 것에 대해선 static을 고려한다.
Static 은 Class 소속 Static 가 없으면 Instance 소속 Class 로 Instance를 복사해서 만들었을떄, Instance 안에 들어가있는 Static 값을 변경하면 기존에 있는 method,Variable 의 값도 같이 변경된다. Instance 안에 들어가있는 Static 이 없는 Instance method,Variable의 값을 변경할 경우 복제품인 Instance 에만 적용된다. Class 소속에선 Instance를 부를수 없지만, Instance 소속에선 Class,Instance 모두 부를수 있다.
static 은 클래스 소속 static이 없는 것은 인스턴스 소속이라고 알고 있겠습니다! ClassVAR라는 변수는 클래스에 저장되어 있다. f1에서 ClasVAR의 값을 변경하게 되면 클래스 뿐만 아니라 모든 인스턴스 (f2)의 값도 변한다. 반대로 f1 에서 instanceVar의 값을 바꾸게 되면 f1의 instanceVar 값만 변한다.
static : 클래스의 인스턴스가 여러개 선언(복제)되었을 때, 그 클래스 내부의 변수 또는 메소드 역시 복제될텐데, 클래스와 그 클래스가 복제되어 선언된 인스턴스들이 있다고 할때, 각 객체들이 갖고 있는 변수와 메소드들이 객체들 간에 공유되는지 그렇지 않은지 정해주는 표시. non static은 static 과 non static 모두 호출가능하나, static은 static만 호출가능하다는 것으로 이해되네요. 질문 : 제(인간) 머리로 생각하기에는.. '클래스', '인1', '인2' 이렇게 객체 3개가 있다고 했을 때, 객체들이 공유한 static method가, 처음에 언급한 3개의 객체 중 특정한 객체 예를 들어 '인1' 이라는 객체 안의 non static 변수의 값을 호출하는 것은 가능해보이는데 왜 막아둔걸까요? 다시 말해서 공유된 static method가 특정 객체 내부의 변수를 호출하여 가져와서 공유하며 가지게 될 수 있지 않나라는 뜻입니다. 컴퓨터가 인식하기에는.. 공유된 static method가 무언가를 호출할때는 자신이 속한 각 객체에서 완전히 같은 행위를 해야(공유상태, static한 상태이므로)해서 그런걸까요? 만약 같은 행위를 할 수밖에 없다면 각 객체 내부에서 non static 정보를 가져오게 될텐데 이 값들이 다를 수 있으니.. 그렇게 되면 공유상태가 파괴되어.. 그래서 막아둔 것 같다는 생각입니다. 제대로 이해하고 있나요 생코 선생님?
핵심: 그 멤버들의 상태가 static이냐 static이 아니냐 Static : 뚝심있는 놈 Static은 class소속 => 어딜가도 값을 바꿀수 없다. 만약 바꾼다면, 같이 바뀌어야됨. Class Foo의 Static String classVar의 값을 바꾼다면=> instance f1의 Static String classVar의 값도 바뀐다. instance f1의 Static String classVar의 값을 바꾼다면=> Class Foo의 Static String classVar의 값도 바뀐다. Static이 없다 : 뚝심 없는 놈. Static이 없는 멤버변수를 가져왔을 때 instance f1에서 멤버변수를 바꾼다고 classFoo의 값이 바뀌지않는다
1. 인스턴스 변수,메서드를 다른 클래스 메서드에 호출하려면 인스턴스화를 해야한다. (클래스명 변수명=new 클래스명();) 2.그렇게 인스턴스화를 해서 출력한 경우, 인스턴스 변수,메서드의 Foo,f1,f2은 연동되어 있지 않기 때문에 f1의 값을 바꾼다고 해서 Foo,f2의 값은 바뀌지 않는다. (but.클래스 변수,메서드의 경우, 연동되어있기 때문에 f1의 값을 바꾸면 주 클래스인 Foo의 값이 바뀌고 그 클래스를 사용하는 f2의 클래스 변수, 메서드의 값또한 바뀌게 된다.)
다른 클래스를 기준으로 이야기하면, Foo안의 것들을 가져올때 인스턴스를 만들지 않고 그냥 Foo. 을 사용해서 가져오는 것은 static만 가능하고 instanceVar나 instanceMethod를 사용하려면 , 반드시 Foo f1 = new Foo(); 이렇게 인스턴스를 만들어서 인용하면 f1.instanceVar 나 인스턴스메소드도 가능!....근데.왜?????....이유를 알고싶어요... 얼핏 static은 메모리에 저장한다고 들었는데....이것과 연관이 있어보이네요? 아시는분?
1.다른 클래스에서 인스턴스를 만들면서 Foo를 불러오는 순간 Foo의 모든 static과 instance들도 전부 불러와지기 때문에 f1이나 f2로는 Foo의 인스턴스변수. 인스턴스메소드도 사용가능하다. 2.그렇다면, f1이나 f2로 인스턴스를 생성하지 않고 그냥 Foo.instanceMethod();가 안되는 이유는 Foo에서 staticMethod는 메모리에 저장해놓았기 때문에 사용 가능한데, instanceMethod는 메모리에 항시 없기 때문에 Foo클래스를 인스턴스로(예를 들어 f1)불러오지 않는 이상 불러올 데이터가 없다!!!! 그래서 안된다! --메타인지를 사용하여 추론해보았습니다. 1.내가 모르는 것이 무엇인가. 2. 활용할만한 단서(static은 메모리에 저장된다.)가 있는가. 어때요?! 맞나요?!!?! 여기서 한가지 모르는 것은 어떻게 다른 클래스에서 Foo.staticMethod(); 를하면 데이터를 가져오는가 입니다. 어떤 클래스를 작동시킬때 같은 package안에 있는 다른 class들을 같이 실행해서 다른 클래스들의 static값들이 메모리에 저장되어있기 때문일까요???.....ㅜㅜ.....하...이고잉님도 모르실 것 같은데~~~