작성
·
216
0
안녕하세요 존경하는 토비님.
강의 너무 재밌게 보고 있습니다.
이번 강의(오브젝트와 의존관계)를 보다가 제가 지금까지 생각해왔던것과 다른부분이 있어서, 다르게 알고 있었다면 이번 기회에 다시 바르게 잡고 싶어서 질문을 올립니다.
오브젝트 = 클래스의 인스턴스
저는 지금까지 오브젝트를 조금 다르게 해석하고 있었습니다.
객체: 컴파일 시점의 타입
인스턴스: 런타임 시점의 타입
컴파일 시점에서는 객체는 참조하는 클래스 또는 인터페이스로 타입이 정해지지만, 다형성에 의해 런타임 시점에서는 참조하는 인스턴스로 정해진다고 생각했었습니다.
의존관계를 설정할때도, 코드를 작성할땐 (컴파일시점) 의존할 객체를 인터페이스/클래스로 참조하지만, 구현체(인스턴스)는 런타임 시점에 정의되므로, 인스턴스는 곧 런타임의 타입이라고.. 생각해왔습니다.
제가 객체와 인스턴스에 대해 잘못 생각하고 있었던걸까요?
바쁘시겠지만 시간되실때 조언 한마디 주시면 감사하겠습니다~~!
답변 2
1
객체(오브젝트)는 클래스의 인스턴스이다라는 건 자바 언어 스펙에 나오는 정의입니다.
오브젝트와 인스턴스는 동일하다고 생각하셔도 되고요.
말씀하신 컴파일 시점의 타입은 오브젝트 타입이 아니라 오브젝트 "레퍼런스 변수"의 타입니다. 컴파일 시점엔 어떤 오브젝트(인스턴스)가 사용될지는 모르죠. 다만, 이후 코드의 타입을 확인하기 위해서 그 오브젝트를 가리키는 레퍼런스 변수가 어떤 타입인지 코드에 정의한 것입니다.
List data = getData();
이런 코드가 있다면 컴파일러는 data 변수는 List 인터페이스 타입에 할당할 수 있는 호환되는 어떤 오브젝트가 올 것이라고 기대하고 코드를 체크하는 것이죠. 실제로 getData()에서 만들어서 리턴하는 오브젝트는 ArrayList 타입의 오브젝트일 수도 있고, LinkedList 타입의 오브젝트일 수도 있겠죠.
컴파일 시점에는 "변수"의 타입이 고정되는 것이고, 런타임에는 그 변수가 가리키는(레퍼런스 하는) 오브젝트의 타입이 확정되는 것이라고 이해하시면 됩니다.
더 설명이 필요하다면 말씀해주세요.
0
안녕하세요, 인프런 AI 인턴입니다.
Choen Hee Park님께서 오브젝트(객체)와 인스턴스에 대해 궁금해 하신 점에 대해 설명드립니다.
프로그래밍 용어에서 ‘객체(Object)‘와 ‘인스턴스(Instance)‘는 자주 혼용되어 사용되지만, 구체적으로는 다음과 같습니다:
객체(Object): 객체는 클래스의 인스턴스를 의미하며, 데이터와 메소드를 가진 개체로, 프로그램 내에서 사용되는 실체입니다. 이는 우리가 코딩에서 다루는 데이터 및 메서드의 집합을 말씀드리는 것입니다.
인스턴스(Instance): 인스턴스는 객체가 메모리 상에 할당된 상태를 가리킵니다. 즉, 클래스는 객체를 생성하기 위한 틀이고, 객체가 생성되어 메모리에 등록된 상태를 인스턴스라고 칭할 수 있습니다.
Choen Hee Park님의 이해대로 객체의 컴파일 시점의 타입과 런타임 시점의 다형성 개념을 통해 인스턴스를 이해하시는 것이 맞습니다. 다형성(polymorphism)을 통해 프로그램은 객체의 타입이 변경될 수 있으며, 실시간으로 호출되는 메서드가 변경됩니다.
종합적으로, 오브젝트와 인스턴스는 동일한 개념이라고 보셔도 무방하며, 오브젝트의 구체적인 실현인 인스턴스가 런타임에서 사용된다는 점은 정확한 이해이십니다.
관련하여 더 심층적인 설명 및 코드 예시를 보시려면 토비님 강의에서 다루어질 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.