개체와 인스턴스의 차이점


82

나는 이런 종류의 질문이 전에 물어 본 적이 있다는 것을 알고 있지만 여전히 대답이 너무 모호하여 (그리고 더 나아가 일부 / 대부분의 초보자가) 이해할 수 없다고 느낍니다.

나는 절차 적 및 기본 OOP보다 더 넓은 프로그래밍 개념을 가르치려고 노력해 왔습니다. 저는 OOP의 구체적인 개념을 이해합니다 (데이터 (멤버)와 함수 (메소드)가있는 클래스를 만든 다음 런타임에 해당 클래스를 인스턴스화하여 실제로 작업을 수행합니다).

클래스가 무엇인지에 대한 핸들이 있다고 생각합니다 ( 컴파일 타임에 인스턴스가 생성되는 일종의 디자인 청사진 ). 하지만 그렇다면 객체 란 무엇일까요? 나는 또한 프로토 타입 기반 언어에서 이것이 더 많은 것을 방해 할 수 있다는 것을 알고 있지만, 아마도 이것이 내 마음 속에서 객체와 인스턴스 사이에 분명한 구별이 필요한 이유 일 것입니다.

그 외에도 "오브젝트"와 "인스턴스"의 개념으로 어려움을 겪습니다. 내가 읽은 많은 리소스 (SO의 답변 포함)는 거의 동일하며 의미론에 차이가 있다고 말합니다. 다른 사람들은 둘 사이에 진정한 개념적 차이가 있다고 말합니다.

SO의 전문가가 초보자가 OOP의 세계에서 앞으로 나아갈 수있는 "아하"순간을 가질 수 있도록 도와 줄 수 있습니까?

참고 : 이것은 숙제가 아닙니다. 저는 학교에 가지 않습니다. 그러나 숙제 도움을 찾는 사람들에게 도움이 될 것이라고 생각합니다.


1
"모든 인스턴스가 객체입니까?"와 같은 추가 질문을 추가하고 싶은지 궁금합니다. , 및 "모든 개체가 인스턴스입니까?" 둘 다 "예"이면 동일하다는 것을 확인할 수 있습니다.
WesternGun 2017

클래스를 인스턴스화하면 (new 사용) 인스턴스화 된 것은 객체가됩니다. 객체는 캡슐화, 다형성, 객체 지향 프로그래밍의 추상화 원칙 및 프로그램이 클래스에 정의 된 인스턴스 멤버를 사용하기 위해 상호 작용하는 실제 사물을 고수 할 수있는 것입니다. 개체에 인스턴스 멤버 (비 정적 멤버)가 포함됩니다. 따라서 클래스의 인스턴스는 객체입니다. 당신이 태어난 곳에서 기원을 언급 할 때 단어 '예'는 말한다면 좀 더 명확있어, 사용되는 '클래스의 객체'에 비해 '클래스의 인스턴스의
p_champ

답변:


129

집 디자인의 청사진은 수업 설명과 같습니다. 그 청사진으로 지어진 모든 집은 그 클래스의 객체입니다. 주어진 집은 예입니다.


6
또한, 동일하게 지어진 8 채의 벽돌집이 연속해서 ( "주택 개발"개념이 등장하기 전) 지역적으로 유명한 거리가 있습니다. 그래서 저는 그것을 아주 멋지게 시각화 할 수 있습니다. "클래스"는 건축가가 작성한 것입니다. 완성 된 집은 모두 동일하게 지어 졌기 때문에 "객체"입니다. 그들이 가지고있는 (그리고 계속 수 있습니다) 모든 그 이후로 다르게 취급하기 때문에 각각의 집은 "인스턴스"입니다 [지금 한 편을 가지고 : O를 (].
TCCV

16
정적 방법은 모든 주택이 공유하는 유틸리티와 같습니다.
WOPR

2
그러나 청사진으로 지어진 집은 실례가 아닙니까?
Hot Licks

1
즉, 클래스 정의가 차지하는 첫 번째 메모리는 인스턴스입니다. 생성 된 모든 개체를 개체라고합니다.
Hafiz Shehbaz Ali

6
객체와 인스턴스가 정확히 같지 않습니까?
Praveen Kumar

42

사실 객체 지향 프로그래밍은 개발의 철학적 측면과 컴퓨터의 실제 기계 작동 사이의 단절을 만들어 혼동을 일으키는 경우가 많습니다. 나는 당신을 위해 두 가지를 대조하려고 노력할 것입니다.

OOP의 기본 개념은 Class >> Object >> Instance입니다.

클래스 = 청사진. Object는 '청사진'(집과 같은)을 기반으로 만들어진 실제 물건입니다. 인스턴스는 개체의 가상 복사본 (실제 복사본이 아님)입니다.

'인스턴스'에 대한보다 기술적 설명은 '메모리 참조'또는 참조 변수라는 것입니다. 에 '예'가 메모리에 변수가 있음이 수단 그 안에 객체의 메모리 주소가 있습니다. 주소를 지정하는 개체는 인스턴스가 '인스턴스'라고하는 것과 동일한 개체입니다. 객체의 인스턴스가 많은 경우 메모리의 다른 위치에 모두 동일한 정확한 메모리 주소를 가진 많은 변수가 있습니다. 모두 동일한 정확한 객체의 주소입니다. 코드에서 할 수있는 것처럼 보이지만 인스턴스를 '변경'할 수 없습니다. 인스턴스를 '변경'할 때 실제로하는 일은 원래 객체를 직접 변경하는 것입니다. 전자적으로, 프로세서는 원래 객체의 데이터를 변경하기 전에 메모리 (참조 변수 / 인스턴스)의 한 추가 위치를 통과합니다.

프로세스는 프로세서 >> 인스턴스의 메모리 위치 >> 원래 개체의 메모리 위치입니다.

사용하는 인스턴스는 중요하지 않습니다. 최종 결과는 항상 동일합니다. 모든 인스턴스는 메모리 위치 (객체의 메모리 주소)에서 동일한 정확한 정보를 계속 유지하며 객체 만 변경됩니다.

클래스와 객체 사이의 관계는 철학적으로 이해하기 가장 쉽지만 조금 더 혼란 스럽습니다 (청사진 >> 집). 객체가 메모리 어딘가에있는 실제 데이터라면 '클래스'란 무엇입니까? 기계적으로 객체는 클래스의 정확한 사본이라는 것이 밝혀졌습니다. 따라서 클래스는 객체가 수행하는 것과 동일한 정확한 정보를 보유하는 메모리의 다른 변수 일뿐입니다. 관계 간의 차이점에 유의하십시오.

개체는 클래스 의 복사본 입니다. 인스턴스는 객체의 메모리 주소를 보유하는 변수입니다.

또한 동일한 클래스의 여러 개체를 보유한 다음 각 개체의 여러 인스턴스를 가질 수도 있습니다. 이러한 경우 각 개체의 인스턴스 집합은 값이 동일하지만 개체 간의 인스턴스는 그렇지 않습니다. 예를 들면 :

클래스 A의 클래스 A가 Object1, Object2 및 Object3을 사용하도록합니다.

// Object1은 object2 및 object3과 동일한 정확한 값을 갖지만 메모리의 다른 위치에 있습니다.

Object1에서 >> let obj1_Instance1, obj1_Instace2, obj1_Instance3

//이 모든 인스턴스는 값과 메모리의 다른 위치에서도 동일합니다. 해당 값 = Object1.MemoryAddress.

기타

유형을 도입하기 시작하면 상황이 더 복잡해집니다. 다음은 C #의 형식을 사용하는 예입니다.

// Person 클래스가 존재한다고 가정 Person john = new Person ();

실제로이 코드를 두 부분으로 나누면 분석하기가 더 쉽습니다.

Person john;
john = new Person();

기술적으로 말하면 첫 번째 줄은 ' 유형 의 변수를 선언 합니다.사람. 하지만 그게 무슨 뜻이야 ?? 일반적인 설명은 이제 Person 객체 만 담을 수있는 빈 변수가 있다는 것입니다. 하지만 잠깐만-빈 변수입니다! 해당 변수 메모리 위치에는 아무것도 없습니다. '유형'은 기계적으로 무의미한 것으로 밝혀졌습니다. 유형은 원래 데이터를 관리하기위한 방법으로 만들어졌습니다. int, str, chr (초기화없이)와 같은 기본 유형을 선언하더라도 컴퓨터 내에서는 아무 일도 일어나지 않습니다. 프로그래밍의이 이상한 구문 적 측면은 사람들이 클래스가 객체의 청사진이라는 아이디어를 얻는 부분입니다. OOP는 대리자 유형, 이벤트 처리기 등을 사용하는 유형과 훨씬 더 혼란스러워졌습니다. 나는 그것들에 너무 집중하지 않고 모두 잘못된 이름이라는 것을 기억할 것입니다.

두 번째 줄도 한 번에 두 가지 작업을 수행하기 때문에 약간 혼란 스럽습니다.

오른쪽 "new Person ()"이 먼저 평가됩니다. Person 클래스의 새 복사본을 만듭니다. 즉, 새 개체를 만듭니다.

그 후 왼쪽 "john ="이 평가됩니다. 그것은 john을 참조 변수로 바꾸어 같은 줄의 오른쪽에 방금 생성 된 객체의 메모리 주소를 제공합니다.

좋은 개발자가되고 싶다면 철학적 이상에 따라 작동하는 컴퓨터 환경이 없다는 것을 이해하는 것이 중요합니다. 컴퓨터는 그다지 논리적이지 않습니다. 실제로는 기본 부울 회로 (대부분 NAND 및 OR)를 사용하여 서로 붙어있는 큰 전선 모음 일뿐입니다.


32

단어 클래스 에서 온다 분류 ( 카테고리 뭔가가 투입되는 지금 우리는 모두가 들었습니다) 클래스는 청사진 유사하지만, 무엇이 정확히 의미? 즉, 클래스 가 특정 카테고리에 대한 설명을 보유하고 있음을 의미합니다. ( Java를 사용하여 예제로 Class, Object 및 Instance의 차이점을 보여주고 싶습니다. 읽는 동안 독자에게 스토리처럼 시각화하도록 요청합니다. 자바에 익숙하지 않다는 것은 중요하지 않습니다. ) 그럼 먼저 HumanBeing 이라는 카테고리만들어서 자바 프로그램이 다음과 같이 표현할 것입니다.

class HumanBeing{ 
   /*We will slowly build this category*/ 
}

이제 HumanBeing 은 일반적으로 어떤 속성을 가지고 있는지 Name , Age , Height , Weight 지금은 우리 자신을이 네 가지 속성으로 제한하고 카테고리에 추가하겠습니다.

class HumanBeing{
    private String Name;
    private int Age;
    private float Height;
    private float Weight; 

   /*We still need to add methods*/

}

이제 모든 범주에는 행동이 있습니다. 범주 Dog 에는 짖고, 가져오고, 구르는 행동 등이 있습니다 ..., 마찬가지로 우리 범주 HumanBeing 도 특정 행동을 가질 수 있습니다. 예를 들어 HumanBeing 에게 귀하의 이름 / 연령 / 체중 / 신장? 이름 / 연령 / 체중 / 높이를 제공해야하므로 자바에서는 다음과 같이합니다.

class HumanBeing{
    private String Name;
    private int Age;
    private float Height;
    private float Weight;  

    public HumanBeing(String Name,int Age,float Height,float Weight){
       this.Name = Name;
       this.Age  = Age;
       this.Height = Height;
       this.Weight = Weight;
    }

    public String getName(){
      return this.Name;
    }

    public int getAge(){
      return this.age;
    }

    public float getHeight(){
      return this.Height;
    }

    public float getWeight(){
      return this.Weight;
    }
}

이제 우리는 HumanBeing 범주에 행동을 추가 했으므로 이름, 나이, 키, 체중을 요청할 수 있지만 이러한 세부 정보는 누구에게 물어 보시겠습니까?class HumanBeing 범주 일 뿐이 므로 청사진입니다. 예를 들어 건축가가 청사진을 작성합니다. 그가 만들고자하는 건물의 종이, 이제 우리는 청사진 ( 건물에 대한 설명) 에서 살 수 없습니다. 우리는 건물이 지어진 후에 만 ​​살 수 있습니다. 그래서 여기서 우리는 우리의 범주에서 인간을 만들어야합니다. 위에서 설명 했으므로 Java에서 어떻게 수행합니까?

class Birth{
  public static void main(String [] args){
    HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90);    
  }
}

이제 위의 예에서 우리는 age height weight라는 이름을 가진 첫 인간을 만들었습니다. 위 코드에서 정확히 무슨 일이 일어나고 있습니까? . 우리는 HumanBeing 범주를 인스턴스화 하고 있습니다. 즉, 클래스의 객체가 생성됩니다.

참고 : 객체와 인스턴스는 동의어가 아닙니다 . 어떤 경우에는 객체와 인스턴스가 동의어 인 것처럼 보이지만 그렇지 않습니다. 두 경우 모두 제공합니다.

사례 1 : 개체 및 인스턴스 동의어 것 같다
우리가 말할 때,하자 나를 조금 정교한 HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90); object를 우리의 카테고리가 만들어집니다 힙 메모리 및 일부 주소가 할당되고, firstHuman그 주소에 대한 참조를 보유하고, 지금이 개체입니다 HumanBeing의 객체HumanBeing의 인스턴스 . 여기서는 객체와 인스턴스가 동의어 인 것 같습니다. 나는 동의어가 아닙니다.

우리의 이야기를 재개합시다, 우리는 우리의 firstHuman을 만들었습니다. 이제 우리는 그의 이름, 나이, 키, 몸무게를 물어볼 수 있습니다. 이것이 우리가 자바에서하는 방법입니다.

class Birth{
  public static void main(String [] args){
    HumanBeing firstHuman = new HumanBeing("Adam",25,6.2,90);
    System.out.println(firstHuman.getName());
    System.out.println(firstHuman.getAge());
    ...
    ...  
  }
}

우리가 처음 인간의 존재가 어떤 자격있는 우리의 첫번째 인간을 제공하여 이동 깃털을 할 수 있도록, 우리라는 범주가 필요하므로 그 의사가하게하자 의사를 그래서 자바에서 우리가 다음 할, 우리의 의사에게 몇 가지 동작을 제공

class Doctor extends HumanBeing{
   public Doctor(String Name,int Age,float Height,float Weight){
      super(Name,Age,Height,Weight);
   }
   public void doOperation(){
    /* Do some Operation*/ 
   }

   public void doConsultation(){
    /* Do so Consultation*/
   }
}  

여기서 우리는 코드에서 재사용 성을 가져 오는 상속 개념을 사용했습니다 . 모든 의사는 항상 인간이 먼저이기 때문에 의사는 이름, 나이, 몸무게, 높이를 다시 작성하는 대신 HumanBeing에서 상속 될 것입니다. 아직 생성하지 않은 의사에 대한 설명을 방금 작성 했으므로class Birth

class Birth{
  public static void main(String [] args){
    Doctor firstDoctor = new Doctor("Strange",40,6,80);
    .......
    .......
    /*Assume some method calls , use of behaviour*/
    .......
    .......    
  }
}

사례 2 : 객체와 인스턴스가 동의어가 아닙니다
. 위 코드에서 Doctor 범주를 인스턴스화하고 생명력을 불어 넣고 있음을 시각화 할 수 있습니다. 즉, 단순히 Doctor 범주객체를 만드는 것입니다. 이미 알고 있듯이 객체는 힙 메모리에 생성됩니다.firstDoctor힙의 해당 개체에 대한 참조를 보유하고;

이 특정 개체 firstDoctor는 다음과 같습니다 ( 개체 에 firstDoctor대한 참조를 보유하고 있으며 개체 자체가 아닙니다)

  1. firstDoctor이다 의 객체class Doctor 그리고 (A)의 인스턴스class Doctor
  2. firstDoctor이다 의 아닌 개체class HumanBeing 그러나 의 인스턴스class HumanBeing

따라서 특정 개체는 특정 클래스의 인스턴스가 될 수 있지만 해당 클래스의 개체 일 필요는 없습니다.

결론:

객체는 특정 범주의 모든 특성을 충족하는 경우 특정 범주의 인스턴스라고합니다.

현실 세계의 예는 다음과 같을 것입니다. 우리는 인간으로 처음 태어 났으므로 우리를 인간의 대상으로 이미지합니다. 이제 우리는 성장할 때 책임을지고 새로운 기술을 배우고 삶의 예에서 다른 역할을 수행합니다. 아들, 형제, 딸, 아버지 , 어머니 이제 우리는 실제로 무엇입니까? 우리는 인간의 대상이지만 형제, 딸 등의 사례라고 말할 수 있습니다.

이게 도움이 되길 바란다

감사합니다


5
... 그리고 왜 우리는이 답변에 대해 3 개의 찬성표를 가지고 있습니까?
Pratik 암 바니

13

여기에 이미지 설명 입력

객체는 메모리에있는 사물이고 인스턴스는이를 참조하는 사물입니다. 위의 그림에서 :

  • std (instance)-> Student Object (오른쪽)
  • std1 (인스턴스)-> Student Object (왼쪽)
  • std2 (인스턴스)-> Student Object (왼쪽)
  • std3 (인스턴스)-> 객체 없음 (null)

4
그거 좋네. 레벨이 낮아진다는 사실이 정말 마음에 듭니다. 나는 이것이 비유보다 더 좋은지에 대해 앞뒤로 가고있다. 나는 2를 함께 아는 것이 내가 정말로 필요한 것이라고 생각한다 . 찬성 투표를했지만 이미 Joe에게 주어 졌기 때문에 답변을 드릴 수 있을지 모르겠습니다. 그래도 고맙다. 이것은 많은 것을 정리합니다.
TCCV 2010

음, 인스턴스는 객체에 대한 포인터입니까? (인스턴스 == 메모리 주소가있는 변수?)
Stano 2013 년

6
Truong, 당신의 대답은 틀렸고 혼란 스럽습니다. 실제로 인스턴스는 기본 클래스 개체에서 파생 된 개체입니다. 인스턴스 == 개체. 이 용어는 예를 들어 this 또는 this answer 에서 잘 설명됩니다 .
Stano

@jww : 이미지는 현재 404 인 math.hws.edu/javanotes/c5/objectsInHeap.png에 대한 링크입니다. 아마도 게시 당시에 볼 수 있었을 것입니다.
Matt Burland 2015

6

객체는 클래스의 인스턴스입니다 (클래스 기반 언어의 경우).

이것이 제가 생각할 수있는 가장 간단한 설명이라고 생각합니다.


1
나는 당신의 설명이 내가 읽은 방식에 대해 옳다는 것에 동의하지만, 둘을 구별하는 온라인 항목이 많이 있습니다. 이런 종류의 질문은 언어를 염두에 두지 않고 대답 할 수 없는지 모르겠습니다 (와우 메타 질문,이 질문은 언어로 인스턴스화하지 않고는 사용할 수없는 클래스입니다).
TCCV 2010

6

클래스는 객체를 정의합니다. 더 많은 언어로 더 나아가 인터페이스가 객체 간의 공통 속성과 메소드를 정의한다고 말할 수 있습니다.

객체는 현실 세계에서 무언가를 표현할 있는 것입니다. 개체가 실제 세계에서 실제로 무언가를 나타내 도록하려면 개체를 인스턴스화해야합니다. 인스턴스화는 일반적으로 생성자를 통해이 특정 개체의 특성 (속성)을 정의해야 함을 의미합니다.

이러한 특성을 정의하면 이제 개체의 인스턴스가 생깁니다.

이것이 문제를 해결하기를 바랍니다.


나는 그것이 기본적으로 Joe가 말한 것을 말하는 것이라고 생각합니다. 틀 렸으면 고쳐줘.
TCCV 2010

3
위의 Joe는 청사진으로 지어진 모든 집이 객체라고 말합니다. 진실. 그리고 그는 주어진 집이 예라고 말합니다. 진실. 그러나 모든 집은 인스턴스이며 주어진 집도 대상입니다. 그는 아무것도없는 곳에서 변화를 일으키고있었습니다. 코드에서는 객체를 생성하는 순간에 객체와 인스턴스를 구별 할 필요가 있습니다. 우리는 그것이 실제로 만들어 질 때 인스턴스화되었다고 말합니다. 일반적인 질문은 다음과 같습니다. 개체를 인스턴스화하는 것을 기억 했습니까? 즉. 객체를 선언 한 후 생성자를 호출하는 것을 잊은 경우.
Derek Litz

1
아, 그것은 좋은 구별입니다. 즉, 인스턴스는 생성 된 (즉, 생성자가 호출 된) 객체입니다.
TCCV 2010

3

"클래스는 인스턴스라고하는 개체 집합을 설명합니다." -제록스 학습 연구 그룹, "스몰 토크 -80 시스템", Byte Magazine Volume 06 Number 08, p39, 1981.


2

개체 란 무엇입니까?

객체는 클래스의 인스턴스입니다. 주변의 실제 사례를 찾아서 사물을 가장 잘 이해할 수 있습니다. 책상, 노트북, 자동차는 모두 실제 사물의 좋은 예입니다.

실제 객체는 두 가지 특성을 공유하며 모두 상태와 동작이 있습니다. 인간은 또한 물체의 좋은 예입니다. 우리 인간은 이름, 키, 몸무게 및 행동과 같은 상태 / 속성을 가지고 있습니다. 걷기, 달리기, 말하기, 수면, 코드 : P.

수업이란 무엇입니까?

클래스는 객체의 세부 정보를 설명하는 청사진 또는 템플릿입니다. 이러한 세부 사항은 비주얼리 제이션입니다.

이름 속성 / 상태 작업 / 방법

class Car 
{
    int speed = 0;
    int gear = 1;

    void changeGear(int newGear)
    {
        gear = newGear;
    }

    void speedUp(int increment) 
    {
        speed = speed + increment;
    }

    void applyBrakes(int decrement) 
    {
        speed = speed - decrement;
    }
}

, 필드 위의 예를 고려 speed하고 gear개체의 상태를 나타냅니다 및 방법 changeGear, speedUp그리고 applyBrakes외부 세계와 자동차 객체의 동작을 정의합니다.

참조 :


1

일반적으로 두 가지가 있다는 점을 지적하는 것이 중요하다고 생각합니다. 청사진과 사본. 사람들은 이러한 다른 이름을 지정하는 경향이 있습니다. 클래스, 객체, 인스턴스는 사람들이 사용하는 이름 중 일부일뿐입니다. 중요한 것은 이름에 관계없이 청사진과 복사본이 있다는 것입니다. 이 두 가지에 대해 이미 이해하고 있다면 혼란스러운 다른 것들을 피하십시오.


0

사과와 사과를 비교할 수 있습니다. 우리는 모두 사과가 무엇인지 알고 있습니다. 어떻게 생겼는지. 어떤 맛이 나는지. 그것은 수업입니다. 사물의 정의입니다. 그것은 우리가 사물에 대해 알고있는 것입니다.

이제 사과를 찾으십시오. 그것은 예입니다. 우리는 그것을 볼 수 있습니다. 우리는 그것을 맛볼 수 있습니다. 우리는 그것으로 일을 할 수 있습니다. 우리가 가진 것입니다.

Class = 무언가에 대해 알고있는 것. 정의.

객체 / 인스턴스 = 우리가 가지고있는 정의에 맞고 할 수있는 것.


0

어떤 경우에는 "객체"라는 용어가 인스턴스를 설명하는 데 사용될 수 있지만 다른 경우 에는 인스턴스에 대한 참조를 설명하는 데 사용됩니다 . "인스턴스"라는 용어는 실제 인스턴스만을 나타냅니다.

예를 들어, List는 객체의 컬렉션으로 설명 될 수 있지만 실제로 보유하는 것은 객체 인스턴스에 대한 참조입니다.


그렇다면이 경우 참조는 인스턴스에 대한 링크를 포함하는 자리 표시 자일 뿐입니 까? 링크는 메모리 주소와 같은 것일 수 있습니까?
TCCV 2010

0

나는 항상 "Abstract Data Type" 의 정의와 같은 클래스의 정의를 좋아했습니다 . 즉, 클래스를 정의 할 때 새로운 유형의 "무언가", 그의 데이터 유형 표현, 프리미티브 및 기타 "무언가", 함수 및 / 또는 메서드 측면에서 그의 동작을 정의하는 것입니다. (일반 성과 형식주의에 대해 죄송합니다)

클래스를 정의 할 때마다 속성과 동작으로 특정 엔티티를 정의 할 수 있는 새로운 가능성 이 열리고, 인스턴스화 및 / 또는 클래스에서 특정 객체를 생성 할 때 실제로 그 가능성을 구체화 하는 것입니다.

때때로 객체와 인스턴스라는 용어는 서로 바꿔 사용할 수 있습니다. 일부 OOP 순수 주의자들은 모든 것이 객체라고 주장하고 불평하지 않을 것이지만 실제 OOP 세계에서는 개발자가 두 가지 개념을 사용합니다.

  1. 클래스 : 다른 ADT를 파생하고 개체를 만들 수있는 추상 데이터 유형 샘플입니다.
  2. 객체 : 인스턴스라고도하며 주어진 추상 데이터 유형으로 표시되는 데이터 구조 및 기능의 특정 예를 나타냅니다.

0

객체 지향 프로그래밍은 프로그램을 더 쉽게 개발할 수 있도록 프로그램에서 처리해야하는 지식을 구성하는 데 도움 이되는 시스템 은유 입니다. OOP를 사용하여 프로그래밍하기로 선택하면 OOP-Google을 선택하고 메시지를 전송하여 많은 개체가 서로 협력하는 것처럼 실제 세계의 문제를 볼 수 있습니다. 차를 운전하는 사람을 보는 대신 차가 무엇을하기를 원하는지 알려주는 메시지를 차에 보내는 사람을 볼 수 있습니다. 자동차는 큰 물체이며, 엔진이나 바퀴에 메시지를 보내서 그 메시지에 응답하여 운전자가 메시지에서하도록 지시 한 것에 적절하게 응답 할 수 있습니다.

시스템 은유를 만들고 메시지를 보내는 개체로 모든 현실을보고 나면 문제 도메인과 관련된 모든 것을 PC에 배치하기로 결정합니다. 다른 카드를 운전하는 많은 Guys가 있다는 것을 알 수 있으며, 모두 같은 방식으로 행동하기 때문에 각각의 행동을 개별적으로 프로그래밍하는 것은 무의미합니다. 따라서 두 가지를 말할 수 있습니다.

  • 이 모든 사람들은 같은 방식으로 행동하므로, 전 세계의 모든 드라이버가 같은 방식으로 행동하는 사람을 지정하는 Driver라는 클래스를 만들 것입니다. (그리고 당신은 클래스 기반 OOP를 사용하고 있습니다)
  • 아니면 헤이! 두 번째 운전자는 첫 번째 운전자와 같은 방식으로 작동하지만 조금 더 빨리가는 것을 좋아합니다. 그리고 세 번째 드라이버는 첫 번째 드라이버와 같은 방식으로 작동하지만 운전할 때 지그재그를 좋아합니다. (그리고 프로토 타입 기반 OOP를 사용합니다).

그런 다음 모든 드라이버가 작동하는 방식 (또는 첫 번째 드라이버의 작동 방식, 두 번째 및 세 번째 드라이버가 해당 드라이버와 어떻게 다른지)에 대한 정보를 컴퓨터에 입력하기 시작하고 잠시 후 프로그램을 만들고 코드를 사용하여 실제 세계에서 본 드라이버를 참조하기 위해 해당 PC 내부에서 사용중인 모델 인 3 개의 드라이버를 만듭니다. PC 내부에서 생성 한 3 개의 드라이버는 프로토 타입 (실제로 첫 번째는 프로토 타입이고, 첫 번째는 모델링 방식에 따라 프로토 타입 자체가 될 수 있음) 또는 생성 한 클래스의 인스턴스입니다. 인스턴스와 객체의 차이점은 객체가 실제 세계에서 사용하는 은유라는 것입니다. 당신은 그 사람과 차를 사물로 보도록 선택합니다 (그들을 인스턴스로 본다고 말하는 것은 잘못된 것입니다). 그런 다음이를 영감으로 사용하여 코드를 만듭니다. 인스턴스는 프로토 타입이나 클래스를 만든 후에 만 ​​프로그램에 존재합니다. "개체"는 실제 세계를 프로그램과 통합하는 데 사용하는 매핑이기 때문에 PC 외부에 존재합니다. Guy를 PC에서 만든 Driver의 인스턴스와 통합합니다. 따라서 객체와 인스턴스는 밀접하게 관련되어 있지만 정확히 동일하지는 않습니다 (인스턴스는 프로그램에서 객체의 "다리"이고 다른 "다리"는 실제 세계에 있음).


0

이미 최선의 답을 낸 것 같습니다.

클래스는 청사진이고 객체는 건물이거나 청사진의 예가 저에게도 트릭을 제공했습니다.

때때로 클래스는 템플릿 (MS Word와 같은)이고 개체는 템플릿을 사용하는 문서라고 생각하고 싶습니다.


0

이 스레드에서 이전에 제공된 예제 중 하나를 확장합니다 ...

시나리오 고려-주거용으로 이웃에 5 채의 주택을 지어야한다는 요구 사항이 있습니다. 5 개 주택 모두 공통 건축 구조를 공유합니다. 건설 아키텍처는 클래스 입니다. 집은 개체 입니다. 사람들이있는 각 집은 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.