클래스, 객체 및 인스턴스의 차이점


답변:


86

Java (및 기타 프로그래밍 언어)는 유형 측면에서 모델링 됩니다 . 이론적 수준에서 은 정보의 일부 양자에 대한 표현이고 유형 은 값의 집합입니다. 값 X Y 유형 의 인스턴스 라고 말할 때 , 우리는 X가 Y 유형 인 값 세트의 구성원이라는 것을 의미합니다.

이것이 "인스턴스"라는 용어가 실제로 의미하는 것입니다. 그것은 사물이 아닌 관계를 설명합니다.

Java 프로그래밍 언어의 유형 시스템은 기본 유형참조 유형 의 두 가지 유형을 지원합니다 . 참조 유형은 클래스배열 유형 으로 더 나뉩니다 . Java 객체 는 참조 유형의 인스턴스입니다.

객체는 클래스 인스턴스 또는 배열입니다. ( JLS 4.3.1 )

그것이 유형 이론적 관점입니다.

실제로 대부분의 Java 개발자는 "인스턴스"와 "객체"라는 단어를 동의어로 취급합니다. (그리고 여기에 저도 포함됩니다. 저는 무언가를 빨리 설명하려고합니다.) 그리고 대부분의 개발자는 원시 유형의 인스턴스를 참조하기 위해 "인스턴스"보다는 "가치"라는 단어를 사용합니다.


3
답변 해주셔서 감사합니다. 질문이 하나 더 있습니다. "컴파일러가 0 인수 생성자를 적중 할 때마다 클래스의 인스턴스를 생성합니다."라고 말합니다. 이 맥락에서 실제로 생성되는 인스턴스 또는 객체는 무엇입니까? 내가 추측하고 우리는 "인스턴스"라는 단어를 동의어로 사용합니다.하지만 더 잘 확인한다면 친절 할 것입니다.
Pranjut

3
@Ryan : 기본적으로 예 : 문제가되는 클래스의 인스턴스 인 개체를 만들고 있습니다. (하지만 인용 된 문장은 "인스턴스"가 아니라 "클래스의 인스턴스"를 말하고 있다는 점에 유의하십시오. 따라서 저자는 실제로 "인스턴스"를 여기서 동의어로 사용하지 않습니다.)
Stephen C

1
@RuneFS-내가 말하는 "모델링"은 표현에 관한 것이 아닙니다. 이론적입니다. 예, 일부 언어에는 유형을 표시하거나 유형의 모든 인스턴스를 열거 할 수있는 객체가 있습니다. 그러나 이러한 속성은 일반 "모델링"을 무효화하지 않고 확대합니다.
Stephen C

1
@RuneFS-아니요 ... "유형 이론"에 대해 이야기하고 있습니다. 그것은 수학의 한 분야입니다. 프로그램을 실행하는 데 사용되는 기술과는 독립적입니다. 계산에 가장 가까운 유형 이론은 람다 미적분입니다. (관심이 있다면 Benjamin C. Pierce의 "Types and Programming Languages"사본을 받아보십시오.)
Stephen C

1
당신은와 같은 실수를하고 user2390183있습니다. 변수를 "이름"으로 취급합니다. 그렇지 않습니다. 변수는 개체에 대한 참조를 포함하는 "참조 홀더"입니다. 개체에는 고유 이름이 없습니다. 참조는 상수 표현이 없다는 점을 제외하고는 객체의 "이름"에 가장 가까운 것입니다. 합니다 (GC는 참조를 나타 내기 위해 사용되는 비트 패턴을 변경하는 오브젝트를 이동할 수있다.)
스테판 C에게

96

클래스를 생성하는 데 사용하는 청사진 객체 . 객체는 클래스 의 인스턴스 입니다. 특정 클래스를 사용하여 만든 구체적인 '사물'입니다. 따라서 '객체'와 '인스턴스'는 동일하지만 '인스턴스'라는 단어는 객체와 클래스의 관계를 나타냅니다.

예를 보면 이해하기 쉽습니다. 예를 들어 클래스가 있다고 가정합니다 House. 자신의 집은 객체이며 클래스의 인스턴스입니다 House. 여동생의 집은 또 다른 객체입니다 (class의 또 다른 인스턴스 House).

// Class House describes what a house is
class House {
    // ...
}

// You can use class House to create objects (instances of class House)
House myHouse = new House();
House sistersHouse = new House();

이 클래스 House는 집이 무엇인지에 대한 개념을 설명하고 클래스의 객체이자 인스턴스 인 구체적인 구체적인 집이 있습니다 House.

참고 : 이는 모든 객체 지향 프로그래밍 언어에서와 마찬가지로 Java에서도 정확히 동일합니다.


class House { // blue print for House Objects } class Car { // blue print for Instances of Class Car } House myHouse = House new(); Car myCar = Car new();
SURAJ 자이나교

myHouse 및 myCar는 객체입니다. myHouse는 House의 인스턴스입니다 (Object-myHouse와 Class-House와 관련됨). myCar는 Car의 인스턴스입니다. 이것이 사실입니까? user2390183의 위 답변을 참조하십시오. 맞습니까?
SURAJ 자이나교

29

클래스는 기본적으로 정의이며 객체의 코드를 포함합니다. 객체는 클래스의 인스턴스입니다.

예를 들어

String word = new String();

클래스는 객체 (인스턴스) 단어를 설명하는 String 클래스입니다.

클래스가 선언되면 메모리가 할당되지 않으므로 클래스는 템플릿 일뿐입니다.

클래스의 객체가 선언되면 메모리가 할당됩니다.


개체와 인스턴스가 동일하다는 것을 의미 했습니까?
Pranjut

링크 주셔서 감사합니다. 주제에서 나는 이것을 얻었다. 상태와 행동을 가진 모든 현실 세계는 "객체"라고 부를 수있다. 그리고 이러한 객체를 분류하기 위해 클래스를 사용합니다 (클래스는 개별 객체가 생성되는 청사진입니다). 그리고 그것은 클래스의 객체가 인스턴스라고 말합니다. 이제 누군가가 객체와 인스턴스의 차이점이 무엇인지 말해 주시겠습니까? 이것은 객체가 실제로 프로그래밍 컨텍스트에 존재하지 않고 인스턴스가 객체를 나타냄을 의미합니까?
Pranjut

@Mustafa : 모순되어 미안하지만 JLS에 따르면 배열은 Java의 객체이기도합니다. 그리고 JLS가 '인스턴스'라는 용어를 전혀 정의하지 않는다는 것을 알게 될 것입니다. 내 대답을 참조하십시오.
Stephen C

@Ryan : "인스턴스"와 "객체"의 구별에 대한 내 대답을 참조하십시오. @Mustafa의 답변과 의견은 (IMO) 오해의 소지가 있습니다.
Stephen C

@mustafabar- "클래스가 선언되면 메모리가 할당되지 않으므로 클래스는 템플릿 일뿐입니다." -그리고 이것도 사실이 아닙니다. 메모리는 (적어도) static클래스 의 변수를 나타내는 데 할당됩니다 . (. 그리고 클래스의 유형 정체성에 관련된 너무 다른 것들에 대한)
스티븐 C

13

나는 평신도 용어로 Jesper의 설명을 좋아합니다

Jesper의 답변에서 예를 즉석에서

class House {
// blue print for House Objects
}

class Car {
// blue print for Instances of Class Car 
}

House myHouse = new House();
Car myCar = new Car();

myHouse와 myCar는 객체입니다.

myHouse는 House의 인스턴스입니다 (Object-myHouse와 Class-House와 관련됨) myCar는 Car의 인스턴스입니다.

간단히 말해서

"myHouse는 Class House 의 인스턴스 입니다. "라는 말은 "myHouse는 House 유형객체 입니다 "라고 말하는 것과 같습니다.


6

클래스는 데이터 유형입니다.이 유형을 사용하여 개체를 만듭니다.

  • 인스턴스는 논리적이지만 객체는 물리적 인 것은 일부 메모리를 차지함을 의미합니다.

  • 우리는 인터페이스뿐만 아니라 추상 클래스에 대한 인스턴스를 만들 수 있지만이를위한
    객체를 만들 수는 없습니다 .

  • 객체는 클래스의 인스턴스이고 인스턴스는 클래스 즉 객체를 대표하는 것을 의미합니다.

  • 인스턴스는 개체의 참조를 나타냅니다.

  • 개체는 실제로 해당 인스턴스의 메모리 주소를 가리 킵니다.

  • 인스턴스를 레이어 위로 전달할 수는 없지만 개체를 ​​레이어 위로 전달할 수는 있습니다.

  • 인스턴스는 저장할 수 없지만 객체는 저장할 수 있습니다.

  • 단일 개체는 둘 이상의 인스턴스를 가질 수 있습니다.

  • 인스턴스에는 클래스 정의와 객체 정의가 모두 있으며 객체에서와 같이 객체 정의 만 있습니다.

개체 구문 :

 Classname var=new Classname();

그러나 인스턴스 생성의 경우 객체를 참조하는 포인터 만 반환합니다. 구문은 다음과 같습니다.

 Classname varname;

3

자바에서는 객체가 힙 메모리에 생성됩니다. 이는 우리의 응용 프로그램에서 지적하고 사용하기 위해 참조가 필요합니다. 참조에는 응용 프로그램에서 개체를 사용할 수있는 개체의 메모리 위치가 있습니다. 간단히 말해서 참조는 메모리 위치에 인스턴스화 된 객체의 주소를 저장하는 변수의 이름 일뿐입니다.

An instanceobject. 참고 Object로 클래스입니다.

예를 들어

Class A{

}

A ref = new A();

위 코드 조각에서 ref는 힙에서 생성 된 클래스 A의 개체에 대한 참조입니다.


3

솔직히 저는 Alfred 블로그 정의가 더 편합니다 .

개체 : 실제 개체는 두 가지 주요 특성, 상태 및 동작을 공유합니다. 인간은 상태 (이름, 나이)와 행동 (달리기, 수면)이 있습니다. 자동차에는 상태 (현재 속도, 현재 기어) 및 동작 (브레이크 적용, 기어 변경)이 있습니다. 소프트웨어 객체는 개념적으로 실제 객체와 유사합니다. 또한 상태 및 관련 동작으로 구성됩니다. 개체는 상태를 필드에 저장하고 메서드를 통해 동작을 노출합니다.

클래스 : 개체를 만드는 데 사용되는 "템플릿"/ "청사진"입니다. 기본적으로 클래스는 필드, 정적 필드, 메서드, 정적 메서드 및 생성자로 구성됩니다. 필드는 클래스의 상태를 저장하는 데 사용됩니다 (예 : 학생 개체의 이름). 메서드는 클래스의 동작을 나타내는 데 사용됩니다 (예 : Student 개체가 일어서는 방법). 생성자는 클래스의 새 인스턴스를 만드는 데 사용됩니다.

인스턴스 : 인스턴스는 객체를 나타내는 클래스의 고유 한 복사본입니다. 클래스의 새 인스턴스가 생성되면 JVM은 해당 클래스 인스턴스에 대한 메모리 공간을 할당합니다.

다음 예가 주어지면 :

public class Person {
    private int id;
    private String name;
    private int age;

    public Person (int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }

    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (id != other.id)
            return false;
        return true;
    }

    public static void main(String[] args) {
        //case 1
        Person p1 = new Person(1, "Carlos", 20);
        Person p2 = new Person(1, "Carlos", 20);

        //case 2
        Person p3 = new Person(2, "John", 15);
        Person p4 = new Person(3, "Mary", 17);
    }
}

사례 1의 경우 Person 클래스의 두 인스턴스가 있지만 두 인스턴스는 모두 동일한 객체를 나타냅니다.

경우 2의 경우 Person 클래스의 인스턴스가 두 개 있지만 각 인스턴스는 다른 개체를 나타냅니다.

따라서 클래스, 객체 및 인스턴스는 다른 것입니다. 정답으로 선택한 답변에서 제안 된 객체와 인스턴스는 동의어가 아닙니다.


2

자동차를 모델링하는 프로그램이 있다면 자동차를 나타내는 클래스가 있으므로 코드에서 다음과 같이 말할 수 있습니다.

Car someCar = new Car();

someCar는 이제 Car 클래스의 인스턴스입니다. 프로그램이 수리점에서 사용되고 someCar가 시스템에서 귀하의 자동차를 나타내는 경우 귀하의 자동차가 대상입니다.

따라서 Car는 실제 자동차를 나타낼 수있는 클래스입니다. someCar는 Car 클래스의 인스턴스이고 someCare는 하나의 실제 개체 (사용자의 자동차)를 나타냅니다.

그러나 인스턴스와 객체는 코딩을 논의 할 때 매우 자주 사용됩니다.


1
엄밀히 말하면 someCarCar 인스턴스에 대한 참조입니다. 인스턴스 자체에는 이름이 없습니다.
Joachim Sauer

2

컴퓨터가 저장하고 처리하는 모든 종류의 데이터는 가장 기본적인 형태의 비트 행입니다. 이러한 비트가 해석되는 방식은 데이터 유형을 통해 수행됩니다. 데이터 유형은 원시적이거나 복잡 할 수 있습니다. 기본 데이터 유형은-예를 들어-int 또는 double입니다. 그것들은 특정한 길이와 특정한 해석 방법을 가지고 있습니다. 정수의 경우 일반적으로 첫 번째 비트가 부호에 사용되고 나머지 비트는 값에 사용됩니다.

복합 데이터 유형은 기본 및 기타 복합 데이터 유형의 조합 일 수 있으며 Java에서는 "클래스"라고합니다.

성과 이름이라는 두 개의 문자열로 구성된 복잡한 데이터 유형 PeopleName을 정의 할 수 있습니다. Java의 각 문자열은 또 다른 복잡한 데이터 유형입니다. 반환되는 문자열은 (아마도) Java가 저장하는 데 필요한 비트 수와 해석 방법을 알고있는 원시 데이터 유형 char을 사용하여 구현됩니다.

데이터 유형의 인스턴스를 생성하면 객체가 생성되고 컴퓨터는이를 위해 일부 메모리를 예약하고 해당 위치와 해당 인스턴스의 이름을 기억합니다. 메모리에있는 PeopleName의 인스턴스는 두 개의 String 변수의 공간과 부기 관리를 위해 조금 더 많은 공간을 차지합니다. 정수는 Java에서 32 비트를 차지합니다.

복잡한 데이터 유형에는 메소드가 할당 될 수 있습니다. 메서드는 해당 인수 또는이 메서드를 호출하는 데이터 형식의 인스턴스에 대해 작업을 수행 할 수 있습니다. p1과 p2라는 두 개의 PeopleName 인스턴스가 있고 p1.getFirstName () 메서드를 호출하면 일반적으로 첫 번째 사람의 이름을 반환하지만 두 번째 사람의 이름은 반환하지 않습니다.


2

클래스와 개체의 개념은 논리를 단일 프로그래밍 단위로 캡슐화하는 것입니다. 클래스 는 객체가 생성되는 청사진입니다.

다음은 Car를 나타내는 클래스의 예입니다.

public class Car {

    int currentSpeed;
    String name;

    public void accelerate() {  
    }

    public void park() {
    }

    public void printCurrentSpeed() {
    }
}

다음 과 같이 Car 개체의 인스턴스 를 만들 수 있습니다 .

Car audi = new Car();
Car toyota = new Car();

이 튜토리얼 에서 예제를 가져 왔습니다.


2

클래스 : 구조

대상 : 물리적 표현

인스턴스 : 클래스에서 생성 된 각 객체

참조 : 개체 주소


1

수업

  • 논리적으로 존재합니다. 즉, 생성 될 때 메모리 공간이 할당되지 않습니다.

  • 일련의 개체입니다.

  • 클래스는 객체를 생성하는 청사진으로 간주 될 수 있습니다.

    • class 키워드를 사용하여 생성됩니다.

    • 클래스는 객체가 소유 할 메서드와 데이터 멤버를 정의합니다.


목적

  • 물리적 인 존재가 있습니다. 즉, 생성 될 때 메모리 공간이 할당됩니다.

  • 클래스의 인스턴스입니다.

  • 객체는 OOP 언어로 함께 데이터 멤버와 멤버 함수를 포함하는 고유 한 엔티티입니다.

    • 새 키워드를 사용하여 생성됩니다.

    • 객체는 클래스의 데이터 멤버가 소유 할 메서드와 값의 구현을 지정합니다.


1
클래스가 "생성"될 때 공간이 할당 될 수 있습니다. 이 공간은 클래스에서 정의한 모든 정적 변수에 필요합니다. (오브젝트 표시 일부 메모리 장치 내의 패턴 도움 비트 전용되기 때문에 AND "논리" "물리적"대 그것을 연신된다.)
스테판 C

@StephenC 그렇다면 다른 차이점은 무엇일까요?

내 대답을 참조하십시오. 이 질문은 차이점에 대해 이야기하는 것만으로는 적절하게 대답 할 수 없습니다.
Stephen C

0

클래스는 객체 (= 인스턴스)를 만드는 데 필요한 청사진입니다.

객체와 인스턴스의 차이점은 객체는 사물이고 인스턴스는 관계라는 것입니다.

즉, 인스턴스는 객체가 만들어진 클래스에 대한 객체의 관계를 설명합니다.


-1

"Object is an instance of a class"정의는 개념적으로 잘못되었지만 구현에 따라 정확합니다. 실제로 객체 지향 기능은 프로그래머의 마음을 더 많이 집중하기 위해 실제 생활에서 가져 왔습니다. 실생활에서 수업은 대상을 관리하도록 설계되었습니다. 예를 들어 인간은 카스트, 종교, 국적 등을 가지고 있습니다. 이 캐스트, 종교, 국적은 계급이며 인간 없이는 존재하지 않습니다. 그러나 구현에서 클래스가없는 객체는 존재하지 않습니다. Object- Object는 잘 정의 된 속성을 가진 개별 엔티티입니다. 여기서 이산이란 다른 것에서 독특하게 만드는 것을 의미합니다. 잘 정의 된 속성은 어떤 상황에서는 의미가 있습니다. 클래스-일부 공통 동작 또는 일부 공통 유형의 객체를 갖는 객체의 분류.


-1

위의 답변은 정확하지만 클래스 및 객체에 대한 또 다른 생각은 실제 예제를 사용하는 것입니다. Animal이라는 클래스에는 Cat, Dog 또는 Fish와 같은 객체가 포함될 수 있습니다. 성경 제목이있는 개체는 Book 클래스 등이됩니다. 클래스는 일반적이고 개체는 구체적입니다. 이 생각 예제는 Java를 배울 때 도움이되었습니다.


예 ...하지만 비유도 혼란 스러울 수 있습니다. 경우 Animal클래스이며, Cat인스턴스는, 내 애완 동물 강아지 고양이 "무성한"무엇인가?
Stephen C

-2

클래스는 템플릿 또는 유형입니다. 객체는 클래스의 인스턴스입니다.

예를 들면 :

public class Tweet {

}

Tweet newTweet = new Tweet();

Tweet은 클래스이고 newTweet는 클래스의 객체입니다.


이것들은 단지 단어입니다. 당신은 실제로 그 단어의 의미를 설명하지 않습니다. (사실 자바 클래스는 실생활에서 또는 자바 스크립트, Python, Ruby 등과 같은 언어에서하는 방식으로 템플릿처럼 작동하지 않습니다.)
Stephen C
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.