El término clase tiene varias acepciones, aquí intentaremos explicar qué es una clase desde el punto de vista de la Programación Orientada a Objetos.
El ser humano agrupa los objetos según tengan características comunes. Así por ejemplo en nuestro hogar podemos ver muebles, electrodomésticos, medios de movilidad, etc. El televisor que está en la sala pertenece a la categoría electrodomésticos y la mesa sobre la cuál está apoyada a la categoría muebles y, la bicicleta que esta en la cochera a la categoría medios de movilidad. Es decir, el hombre agrupa objetos teniendo como criterio para hacerlo, determinadas características. Este proceso se realiza casi inadvertidamente.
Si seguimos agudizando nuestra observación notamos que el reproductor de sonido que está al lado del televisor también pertenece a la clase electrodoméstico, lo mismo que la heladera, el horno eléctrico y el secador de pelo. Todos estos objetos tienen en común algunas características que podemos enumerarlos a grandes rasgos. Tienen un cable que se conecta a un toma corriente, consumen energía eléctrica que, generalmente se expresa en Vatios/hora. Tienen un botón de encendido/apagado, una marca (que indica el fabricante), etc.
En una primera aproximación podríamos decir que una clase es como una fábrica de objetos de un determinado tipo. Ahora bien, ¿A qué nos referimos con tipo? En nuestro contexto, el tipo viene a ser un "tipo de datos". Así por ejemplo una fecha es un tipo de dato, está compuesto por tres valores enteros en un rango específico. Cada uno de estos "valores enteros", que son también otros datos, corresponden, uno para el día, otro para el mes y otro para el año. Opcionalmente el mes puede expresarse como una "cadena de texto".
Estos tres datos que forman el tipo de datos fecha en POO se llaman atributos o características. En cada objeto del tipo fecha varía el valor que toman estos atributos. Así por ejemplo 21 de septiembre de 2018 es un objeto del tipo fecha y 25/12/2018 también es otro objeto del mismo tipo fecha. Lo que cambia son los valores de sus atributos, pero todos los objetos del tipo fecha tienen un dato correspondiente al día, otro al mes y otro al año. Las cosas que tienen en común son los que se definen en la clase.
Pero el "tipo" fecha es de poca utilidad si solo es una representación de estos tres datos enteros en un orden determinado. El tipo es más útil si puede comprobar si un objeto de ese tipo es válido. Por ejemplo, si quisiéramos escribir "30 de febrero 2017" el tipo debería emitir un mensaje de error y pedir que se vuelva a ingresar los datos porque esa fecha no existe. Ese comportamiento de un objeto de ese tipo se define en la clase.
También querríamos poder representar una fecha en una formato "dd/mm/aaaa" o en cualquier otro formato que puede variar según el país. Entonces estamos hablando de un componente con cierto grado de inteligencia y al cual le podemos "pedir ciertas cosas" y que "nos puede dar otras". Eso se realiza a través de mensajes que enviamos por medio de la interfaz del objeto.
El medio por el cual enviamos (y recibimos) los mensajes a un objeto de una clase se llama método u operación.
Si observamos el mundo a nuestro alrededor notamos que está formado por objetos y que todos los objetos corresponden a una categoría específica que nos permite clasificarlos. Así por ejemplo Pedro "es un" hombre así como también Juan "es un" hombre. Ahora bien, Pedro y Juan son distintos, pero ambos son hombres. Estamos clasificando a los "objetos" Juan y Pedro como hombres. Eso los hace distinto de Pamperito que es mi perro, es decir pamperito "es un" Perro.
Volviendo a pedro y juan, cada uno tiene un valor distinto para su talla, su peso, su color de pelos, su fecha de nacimiento, su hobby, etc., pero de todos ellos se pueden comparar esos atributos. No obstante se pueden agregar muchas características más como los nombres, los apellidos maternos y paternos, el estado civil, la dirección donde vive, los gustos musicales, los deportes favoritos, el nivel de escolarización, la ocupación, por poner algunos más.
Pero un hombre puede correr, caminar, hablar, cantar, etc. Todo eso que puede hacer un hombre son las operaciones o métodos.
En POO Hombre es una clase y tanto juan como pedro son objetos de la clase Hombre. Y pamperito es un objeto de la clase Perro. Se suele decir que pamperito es una instancia de la clase Perro.
Mirando sobre mi escritorio veo muchos objetos, ente ellos varios libros (todos sobre programación en C++). Cada uno de esos libros es un objetos de una clase Libros.
Cada uno de estos libros tiene un Autor, fue editado por una Editorial, y fue impreso en una Fecha determinada. Además puede ser la primera Edición, la segunda Edición, etc.
Libro, Editorial, Fecha, Edición en POO son clases porque hay muchos libros, hay muchas editoriales, infinitas fechas, bueno, casi.
Pensemos en la primera de ellas, Libro. Lo que distingue a un libro de otro son la temática, el o los autores, la cantidad de hojas, la editorial, etc. , cada uno de estos son los atributos o características de la clase Libro.
El lenguaje utilizado para el diseño de programas orientado a objetos es el UML (Lenguaje Unificado de Modelado). En este lenguaje los nombres de objetos se escriben en minúscula y los nombres de clases en mayúsculas, por eso, hemos escrito juan y no Juan cuando hacíamos referencia al objeto y, Libro y no libro cuando nos referíamos a la clase Libro.
Para que no haya confusión cuando hacemos referencia a una clase agregaremos una "C" mayúscula a los nombres de clase, así la clase Libro lo escribimos CLibro, la clase Fecha, CFecha, etc.
En el UML una clase se representa mediante un rectángulo con tres divisiones muy claras, una para el nombre de la clase, una para los atributos y la tercera para las operaciones o métodos (acciones) de la clase.