SSISO Community

시소당

자바에서 instance variable과 instance method의 차이점이 무엇인가



질문이  좀  이상하네요.  제  생각으로는  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==

639 view

4.0 stars