상상광
124
2017-06-10 15:42:45
7
1704

Object object = null; 이랑 Object object = new Object(); 차이가???


Object object = null; 이랑 Object object =  new Object(); 차이가 뭐에요?!?!?!?!?!?!?

0
0
  • 답변 7

  • moonti
    2k
    2017-06-10 15:50:51 작성 2017-06-10 15:51:08 수정됨

    상상만 하지말고 해보시고 로그 찍어보세요

    객체에 뭐가 담겼는지

    0
  • OkiDoki
    1k
    2017-06-10 15:54:55 작성 2017-06-10 15:55:20 수정됨

    Object object = null;

    Object클래스의 object라는 변수를 선언하는 것인데,

    Object크기의 내용물을 담을 수 있는 빈 껍데기를 만들어 준다는 개념으로 보시면 될 것 같습니다.


    Object object = new Object();

    위의 코드는 실제로 변수를 선언한 후 Object라는 객체를 하나 생성해주었다는 의미로 보시면 될 것 같아요.

    설명이 너무 애매한 것 같은데, 검색해보시면 많이들 설명해 놓은 곳이 있습니다 ^^

    0
  • 상상광
    124
    2017-06-10 16:14:23
    0
  • ee32321
    1k
    2017-06-10 16:28:14 작성 2017-06-10 16:53:03 수정됨

    Java의 클래스에 Object를 상속한다. 이것이 생각나네요.

    실제, Java라면,


    class Abc{}

    경우라면,

    class Abc extends Object {}

    위의 것을 하지 않아도 된다는 말인데요.


    자바에서 클래스를 만들면, Object가 안에 들어있다. 이런 말이 생각나네요. 이 상황에 위의 코드,

    Object object = null;

    Object object = new Object();

    위의 경우에,

    Object의 경우,

    class Object{}


    이렇게 클래스를 만드는 것을 말할텐데요. Object가 예약어인가? 아마 그래서 못만들것 같네요.

    Object object = new Object();

    이것의 경우도, Object가 예약어라서 못만들것 같네요.(Tool안켜봤습니다. 엑스자표시가 있을 듯 생각해봅니다.)


    new 다음에, 해당 클래스나 상속된(상속받은?) 클래스의 생성자를 넣으면 되겠죠.

    한마디로 값을 넣어주는 겁니다, new다음에 오는안에 말이죠. 안넣는 경우는 그냥 만드는 경우.


    Abc object= new Abc(a,b);

    이런 경우에는 Abc클래스에,  Abc(a,b)라는 생성자가 있어야 겠죠. 그값을 a,b로 초기화하는 경우겠죠. 생성자는 클래스이름과 똑같아야 합니다. 다르게 주면 함수가 되겠죠.



    public class Abc {
    
    public int num1;
    public int num2;
    
         Abc(int a, int b){
            this.num1 = a;
            this.num2 = b;
         }
    
       void printNum1(){
          System.out.println("num1:"+num1);
        }
    
    }


    위와 같은 형태로 된다고 보시면 됩니다. 또, 함수도 만들어 봤네요. printNum1().


    실제 public static void main()에서 실행시키는 경우,


    package Abc;
    
    public class Engine {
    
    
      public static void main(args[]){
       Abc obj = new Abc(1,2);
       obj.printNum1();
       }
    
    
    }



    위의 처럼한다면, 콘솔창에,  num: 1이 찍히겠죠. 또 자세히보면, 변수와 클래스 앞에 public이 붙었는데요. public은 package가 바뀌더라도, 사용할 수 있게 만듭니다. 위에서 Abc클래스, Engine클래스가 생겼는데, public이라, 사용이 가능한 것이죠.

     이것말고, private로 만들면, 아마, 인스턴스 생성이 되지 않을 겁니다. private class Abc{}이런 경우라면 말이죠.  변수 역시, private로 만들면, 값을 바꿀 수 없습니다. get,set메소드를 만들어야하게 되죠. public의 경우라면, 아마, 

    obj.num1 =3;

    이런 식으로 인스턴스 생성후 값의 변경이 가능할 겁니다. 캡슐화, 보안을 위해, private로 변수를 만들고, get, set메서드를 만들게 됩니다. java bean, sql 테이블에 값을 bean으로 만들 때에.. 이것을 사용하죠.

    위의 경우라면, 


    public class Abc {
    
    private int num1;
    private int num2;
    
         Abc(int a, int b){
            this.num1 = a;
            this.num2 = b;
         }
    
       void printNum1(){
          System.out.println("num1:"+num1);
        }
    
       public void setNum1(int num){
        this.num1 = num;
       }
    
       public int getNum1(){
       return num1;
       }
    
      public void setNum2(int num){
       this.num2 = num;
      }
     
       public int getNum2(){
       return num2;
       }
    
    }

    위처럼 변수 앞에 private로 외부접근을 못하게 하고, 변수마다 각각 get, set메서드를 만들어서 값을 바꿀 수 있게 만들죠.


    obj.num1 =3;


    이것이 안되고,

    이제는,


    obj.setNum1(3);


    위의 식으로 접근이 되겠죠.


    Object object = null;

    위처럼 코드를 적으면, Object형의 object를 만들었지만, 값은 입력하지않았다. 또는, new연산을 하지 않았다, 인스턴스를 만들지 않았다.(또 자바의 경우 Object가 예약어라서, 관련 IDE Tool에서 x표시가 날 듯하네요.) 이렇게 보시면 될 것 같네요.


    재미로 한번 설명해봤네요.

    감사합니다.


    0
  • 상상광
    124
    2017-06-10 16:51:27 작성 2017-06-10 16:51:59 수정됨

    ee32321 깊이 생각하지 않고 올린 질문에 정말 친절한 답변으로 인해 반성하고 갑니다. 당신을 본받아 좋은 개발자가 되겠습니다.

    0
  • ee32321
    1k
    2017-06-10 16:55:09
    0
  • 깜토
    4
    2017-06-10 23:24:30 작성 2017-06-10 23:26:00 수정됨

    Object 는 자바(라고 할 때)에서 예약어라서 클래스를 만들지 못하는 것이 아닙니다.

    이미 있는 API클래스이기 때문에 똑같은 이름의 클래스를 만들지 못하는 것입니다.

    예약어란 for, while, switch, int... break, continue, try, catch.. 이런 것들이고 변수명으로 선언을 못하도록 하는 것을 말합니다.

    자바는 클래스가 위치한 패키지명과 클래스 이름의 대소문자가 완전히 일치하는, 이름이 완전히 똑같은 클래스는 만들 수 없습니다. 그래서 이미 사전에 만들어져 제공되고 있는 클래스 상속도의 최상위 클래스가 Object 클래스이기 때문에 class Object{} 같은 정의는 안되는 것입니다.


    작성자님의 질문으로 돌아가서

    Object object; 

    여기까지만 생각해보면 Object 형태의 객체참조(객체 자체가 아님)를 저장할 수 있는 변수인 (소문자로 시작하는) object 라는 변수가 선언되었다는 이야기 입니다.

    그런데 첫 문장인 

    Object  object  = null; 

    은 object 변수가 아직 실제로 참조하는 곳이 없다. 라고 초기화시킨 것이고

    Object object = new Object();

    는 object 변수에 새로운(new) Object 형태의 객체를 만든 후 그것을 찾을 수 있는 참조값을 저장하도록 했다.

    라는 뜻입니다.

    편의상 객체를 저장한다고 표현하지만 정확하게는 객체참조를 (reference)를 저장하는 것입니다.

    자바가 객체형 데이터를 저장하는 참조저장 방식을 미리 알고계시면 이해가 수월할 것입니다.


    자바의 모든 변수는 

    1. 선언

    2. 초기화

    단계를 거쳐야 

    3. 사용 

    을 할 수 있습니다.

    Object object; 여기까지만 쓰면 선언입니다.

    이 상태에서 object 를 출력해보려고하면 초기화가 되지 않았다고 오류가 뜹니다.

    하지만

    Object object = null; 이렇게쓰면 아무것도 저장하지 않았음을 확정하는 것으로 초기화까지 진행된 것으로 null 이라는 상태값의 출력이 가능해 집니다.


    =null; 은 아무것도 저장되지 않았음의 상태로 변수를 초기화한다는 것.

    = new Object(); 는 새로운 객체(Object형태인)를 만들고 그 것(을 찾아갈 수 있는 참조)을 저장해서 변수를 초기화한다는 것


    입니다.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.