Computational complexity theory focuses on classifying computational problems as 'easy' or 'hard' according to their resource usage. One of the roles of computational complexity theory is to determine the practical limits on what computers (and human beings) can and cannot do. For example, you may learn an undecidable problem named the Halting Problem in CSCI340. This means, no matter how smart a person is, one cannot find an algorithm to solve the Halting Problem.
Formal languages provide the theoretical underpinnings for the study of programming languages as well as the foundations for compiler design. They are important in such areas as the study of biological systems, data transmission and compression, computer networks, etc. In computational complexity theory, decision problems are typically defined as formal languages and complexity classes are defined as the sets of formal languages. In logic and foundations of mathematics, formal languages are used to represent the syntax of axiomatic systems.
In mathematics and computer science, computable analysis is the study of mathematical analysis from the perspective of computability theory. It was motivated by questions such as: which real numbers and real number functions are computable, and which mathematical tasks in analysis can be solved by algorithmic means? It is concerned with the parts of real analysis and functional analysis that can be carried out in a computable manner.