If you're asking why you need the //SYSOUT DD statement, it's because DFSORT uses SYSOUT by default as the ddname of its message data set (this can be changed with the MSGDDN=ddname parameter).
If you're asking why you would use SYSOUT=*, it's because the * means to use the same output class as the MSGCLASS parameter. You could use a specific message class instead such as SYSOUT=A.
If you're asking why only DFSORT requires a SYSOUT DD statement, it's actually NOT the only product that does. While many products use SYSPRINT, others use SYSOUT, and others use another ddname. It's up to each product to define the ddnames the product uses.
If your question is something else, please state more clearly what you want to know.