I'm pretty new to Arduino myself, and actually salvaged a bunch of motors from some old printers, so I have been trying to answer the same questions as you.
It all comes down to how much current and voltage are required to drive the motor. Even the smallest hobby motor probably draws more than the 40mA that you can get out of an Arduino pin, especially when it is stalled. You can drive brushed DC motors through standard transistors like the 2N2222 or TIP120 pretty easily, and there are other transistors for even higher current applications.
However, you will be limited in terms of what you can do. For instance, it will not be easy to drive the motor in both directions. For that you would want an H-bridge like the L298N, which is pretty popular. Steppers have the added complication of needing at least 2 'channels' (luckily the L298 is a dual bridge).
And even at that, you need flyback diodes and a bunch of other supporting hardware to managing things like back-EMF from the motors and isolating power supplies.
So the long and short is that you would probably do well to buy a motor driver if you want to play around. Once you have everything figured out you could always buy just the minimum discrete components (like the L298N) to implement in your final project.
Hope that helps.