시소당
질문이 좀 이상하네요. 제 생각으로는 instance 변수와 class변수의 차이를 구별해 달라고 해야 옳은 질문일 것 같거든요.
여하튼 instance 변수, 메소드에 설명할려면 먼저 class와 instance 의 차이에 대해 알아야 합니다.
class는 간단히 정의하자면 "자료형의 선언" 이고, instance는 "자료형으로부터 만들어지는 실체"라고 할 수 있습니다.
프로그래머로써 경험을 어느정도 쌓지 않으면 이해하기 힘든 말일 것 같지만, 제 개인적으로는 간단명료하게 정의를 내린 것입니다.
좀더 구체적으로 설명해 보겠습니다.
class는 크게 전역변수와, 생성자, 메소드로 이루어져 있고, 이 때 사용된 전역변수와, 생성자, 메소드는 단순한 선언에 불과합니다.
전역변수로 String s = 10; 이라고 되어 있다면, 이는 String type의 변수 s가 10의 값을 갖는다라는 선언일 뿐입니다. 그 자체가 어떤 일을 하는 것은 아니죠.
비유를 하자면 어떤 "사람은 절대로 거짓말을 해서는 안된다."라고 말했다고 합시다. 하지만 그사람이 정말 자신의 말처럼 거짓말을 하지 않는다고 할 수는 없습니다. 그 사람을 죽을 때까지 옆에서 지켜보면서 감시할 순 없잖아요? 말은 단순히 말일 뿐이죠. 사실 말과 행동이 완전히 일치하는 사람은 없다고 봐도 무방하니까요. 하지만 그 사람이 드물게 말과 행동이 일치하는 성인과 같은 사람이어서 절대로 거짓말을 하지 않는 사람이라면 그 때서야 그사람은 신뢰를 가지게 되죠.
class란 이와 같습니다. class를 만든다는 것은, 이 클래스는 이러이러한 속성(attribute, 전역변수)을 가지고 있고, 이러이러한 행동(behavior, method)를 통해서 이런 일을 할 수 있다고 하는 선언, 즉 자료형일 뿐입니다. class자체가 어떤 일을 하는 건 결코 아닙니다. 즉 추상적인 존재일 뿐이죠. 하지만 class가 단지 추상적인 존재라면 class가 존재할 필요가 없겠죠? 그래서 이 class를 이용해서 일을 시켜야 하는데, 이 때 사용되는게 객체(instance)입니다. 객체와 instance는 100% 동의어는 아니지만 거의 같은 의미로 사용되는 일이 많으므로 일단 동의어라는 전제하에 설명을 하겠습니다.
즉 class는 객체가 있어야만 일을 할 수 있다는 겁니다.
예를 들어보겠습니다.
집을 짓기 위해서는 설계도가 필요합니다. 하지만 설계도가 있다고 집이 있는 건 아니죠? 설계도는 단지 이렇게 집을 만들어야 한다라는 정의(자료형)일 뿐입니다. 이 설계도대로 여러가지 재료(변수, 메소드)를 가지고 실제 세계에 집(객체, instance) 지을 지어야 사람이 살수가 있게 됩니다. 이때 100채의 집을 짓기 위해 반드시 100개의 설계도가 필요한건 아닙니다. 1개의 설계도만 있어도 그 설계도대로 100개든 1000개든 얼마든지 집을 만들어 낼 수가 있죠. 이런 이유때문에 설계도(class)는 정의(선언, 자료형)이라고 불리는 것입니다.
class와 instance라는 의미가 이해가 되셨는지 모르겠네요. 더이상 설명하라면 사흘 밤낮을 머리를 쥐어 뜯어야 될 것 같아서 이해가 되셨으리라 생각하고 계속 설명하겠습니다.
위 설명을 간단히 요약하자면, "class는 단순히 자료형일 뿐이니 class를 실제로 사용하기 위해서는 객체를 만들어야 한다." 라고 할수 있습니다.
그렇다면 class안에 선언된 변수와 method들이 실제로 사용될 수 있으려면 먼저 class를 구체화 시키는 작업, 즉 객체를 만들어야만 변수와 method를 사용할 수 있다는 말이 되겠죠.
매우 자주 쓰이는 class중에 String이 있습니다. String의 method중에 자주 쓰이는 것 method중 하나가 substring() 입니다. 그렇다면 substring() 이라는 기능을 사용하기 위해서 당연히 다음과 같은 작업을 거쳐야만 하겠지요?
String s = new String("문자열");
//String type의 변수(객체) s 선언, s에 "문자열"이라는 값 할당
s.substring(1, 2);
//String class에 선언된 substring이라는 기능을 객체(instance) s가 "문자열"이라는 값에 실제로 사용.
instance변수, 메소드의 가장 중요한 핵심은 그들은 반드시 객체를 만든 후에야 사용할 수 있다는 것이고, 이것이 이들을 instance 변수, 메소드라고 부르는 이유입니다.
하지만 프로그램의 어떤 로직들을 완성할려면 객체를 만들지 않고도 사용할 수 있는 변수와 메소드가 필요하게 됩니다. 이럴 때 사용되는게 static 이라는 키워드 입니다. 변수나 메소드에 static 이라는 keyword를 사용하면 객체를 만들지 않고도 사용할 수 있게 됩니다.
대표적인게 Math class입니다. Math class에 있는 random() 이라는 메소드는 이렇게 사용합니다.
Math.random();
객체 생성이 전혀 필요없죠. 객체를 생성하지 않은 상태에서 사용하다보니 class명으로 직접 접근하여 사용합니다. 그래서 static 변수와 메소드는 class 변수, 메소드라고도 부릅니다.
설명에 변수와 메소드의 구별은 중요하지 않으므로 앞으로는 변수만으로 지칭하겠습니다.
지금까지의 설명으로 의도한 설명은 다 했으리라 생각됩니다. 이제 여러 책들에서 동의어지만 다른 단어로 표현된 것들을 정리하면 공부하는데 더 쉬우리라 생각됩니다.
class 변수, static 변수, 정적변수 는 동의어 입니다.
instance 변수, 객체 변수, 멤버 변수, non-static 변수 는 동의어 입니다.
이 밖에도 동의어가 더 있는 것으로 기억되지만, 다 생각나지는 않네요.
도움이 되셨길 바랍니다. ^^
ps. 이 글은 순수히 본인의 글이므로 혹시라도 퍼가시면 꼭 출처를 적어주시기 바랍니다. 이 글을 더 검토하여 제 홈페이지에 올릴 생각이므로 나중에 괜한 시비에 걸려들고 싶지 않습니다.
혹시나 하는 마음에 적었습니다.
글 하나 적어놓고 되게 생색 내지요? ^^
출처 : 네이버 지식인 http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10106&eid=Rsd8L4o8TZ9iDaBzth3vmJ8KpnyW/hMH&qb=wNq52SBpbnN0YW5jZQ==