There are some very elementary data types in PLCs: BOOLEAN, INTEGER, REAL etc. Each one represents a single item of data scoped and displayed in a predefined manner.
You could also regard something like a timer as being a complex data type: it is composed of several simple data types linked for a particular purpose. For example, there will be two or three BOOLs and two TIMEs (present and remaining).
A UDT (in any PLC - not just STEP7) gives you the opportunity to define a complex data type to represent a type of object relevant to your plant, process or tasks. You can group together any combination of simple data types to creat this User Defined Datatype.
In the same way as a timer is an object, and you will use many different timers in a program, each sharing the characteristics of that object, the same happens with a UDT. For example you could create a UDT to represent a motor and all its appropriate data. Let's call that UDT "Motor". When you come to use this UDT you create variables with their own names (e.g. BigPump_01, Conveyor_Mtr_25) and declare their data type to be "Motor". Both of these examples will then have the same component elements as the parent UDT. It's like a template for all motors in your system. Of course you can create as many different UDTs as you need. And you can embed UDTs within UDTs. You could have a UDT to represent a conveyor. This might include BOOLs for switches etc, plus a few existing UDT declarations representing motors.