You can develop in a local environment or on a public testnet.
Local: You deploy a local blockchain with funded accounts that will behave like Ethereum, but will be much faster and easier for debugging. This is for a development environment.
Testnet: You will acquire test ETH to deploy to a public testnet. Transactions here are mined under the testnet's process and are trackable on tools like etherscan.
Mainnet: This will cost real ETH for when you are comfortable deploying your app to the production environment.
Here are some tools to get you started:
To learn a bit about Solidity language for Ethereum development, you can use the Loom tutorial: https://cryptozombies.io/
To set up your deployment pipeline, you can use tools like Truffle or Waffle. Here are the truffle docs: https://truffleframework.com/docs
To set up your local blockchain where you can deploy contracts in a development environment, you can use Ganache, which is part of the Truffle suite and can be found in the docs above.
To deploy to testnet, you can use one of the public testnets (ropstein, rinkeby, kovan, etc). Truffle docs show you how to deploy to each of these; however, they each have their own way of acquiring ETH. I find the rinkeby faucet to be the easiest: https://faucet.rinkeby.io/ - this will require a public social media account.
You can view transactions deployed to the rinkeby network at https://rinkeby.etherscan.io
To programmatically call functions from smart contracts deployed to your local blockchain from javascript code on your front-end/back-end, you will need to use either web3.js or ethers.js - here are the ethers.js docs: https://docs.ethers.io/ethers.js/html/getting-started.html
There are plenty of other useful tools, but these are the essentials for starting to set up your project and begin developing and learning about Ethereum without requiring real ETH.