(1) It is both. It is a dynamic array because the size changes at run time. It is dynamically allocated because you allocated the memory on the heap using the new operator.
(2) It is not a viable implementation. It would be better to use the std::vector class. It is, however, a great practice project. The skills you learn implementing practice projects like this will pay big dividends as you become more experienced as a programmer.
A couple of comments:
(a) There is no need to copy the original arr array to the copy array. The original arr memory is never being overwritten. Just do T* copy = arr;
(b) You have a memory leak. Somewhere in the function you have to delete the original arr array (and the copy array if you decide to keep it).
(a) Yes. Exactly like that. And then when you are done, just delete[] copy;
I assume you have a constructor for the class that initializes the array to an empty array (arr = NULL, size = 0).
As far as viable, I guess I don't know what you mean. I probably meant "practical". The std::vector is already available, and it probably has more safety built into it than something you would write. It also has features that improve speed and memory copying, etc., that you might not even think about. Why reinvent the wheel when you can be inventing other things?
If you mean "it will work" and can be made robust, then yes, your class could be considered viable.