Private IPs are static and can be used in private and public subnets.
Public addresses can be used on Public Subnets only and are dynamic addresses, this means they
change every time you stop and restart your instance. (if instance is simply rebooted - public address is preserved)
If you need to reference in your application code the public address, then you need an Elastic IP address which is static and will always stay the same.
Elastic IPs are static public addresses and do not change when instance is stopped.
They are, as the public address, associated with a private IP address on the instance but can be moved between instances and ENAs.
Elastic IP Addresses can be remapped across Zones.
One thing to remember is that they are charged once created, even if they are not mapped to an instance and being used. aws docs
https://www.linkedin.com/pulse/aws-difference-bw-public-private-elastic-ip-chirag-jain/