Difference between UClass and UObject

I know that UCLASS() macro creates a seperate UClass for every UObject class ,but what is the need for this seperate class , how both of these classes relate to each other and what is the basic difference between both of them??

A “UClass” instance contains reflection data (properties, base types, etc.) about a type, whereas a UObject is the base class for any kind of engine-related object class. Classes you write will almost never inherit from UClass (I’m not even sure if you can), but they can inherit from UObject.

This might be usefull as well!! This Answer on the exact same question

Not about type, but class, UClass is also UObject as all classes with U prefix. There entire family tree of classes that contain reflection system information elements and all inherent from UField

And yes you can inherent from UClass if you ever need to extend reflection system for some reason, Blueprint and UMG have extra code on UClass