클래스 (Class)
클래스를 정의하는 말은 무수히 많다. 그중 많은 사람들이 공통적으로 언급하는 단어는 '설계도'이다. 클래스를 설계도라고 부르는 이유는 프로그래밍은 결국 어떠한 프로덕트를 내기 위함이기 때문이다. TV, 어플리케이션 등 무얼 만들기 위함이든 간에 그것을 위한 설계도를 객체지향 프로그래밍(OOP)에서는 클래스(class)라고 부른다. 자바에게 'TV를 만들어!'라고 하면 이 클래스에 짜여진 대로 TV를 만드는 것이다.
그렇다고 클래스를 만들 대상과 동일하게 생각하면 안 된다. 클래스는 틀일 뿐, 인스턴스화라는 것을 거쳐 클래스내 다양한 객체를 생성해 이것들이 원활하게 동작했을 때 프로그램이 되는 것이다.
'그냥 객체만 계속 만들면 되는 거 아닌가? 왜 이것들을 포괄하는 클래스가 필요한가?'라는 의문이 들 수도 있다. 같은 도면의 아파트 10동을 만든다고 했을 때, 설계도 없이 각 층과 각 호수를 모두 동일하게 짓기란 불가능하다. 반면 설계도가 있으면 같은 아파트를 10동도 100동도 지을 수 있을 것이다. 따라서 클래스가 있으면 매 객체를 어떻게 만들지 고민할 필요가 없고, 잘 설계된 클래스로 객체를 계속 생성해서 쓰기만 하면 된다.
class Dog { // 클래스명 Dog
String age = "10"; // 필드
void bark() { // 메소드
System.out.println("make");
}
Dog(){}; // 생성자
Dog(String age){
this.age = age;
}
class Poodle { // 이너 클래스
String poodle = "This is inner class.";
}
}
클래스는 class 클래스명
형식으로 정의한다. (클래스명은 대문자로 시작하는 것이 통상적이다.) 클래스에는 네 가지 구성요소가 있다.
필드 (Field)
클래스의 속성을 나타내는 변수다. Dog로 치면 age, weight 등이 있을 수 있다.
메서드 (Method)
클래스의 기능을 나타내는 함수다. Dog로 치면 bark, walk, sleep 등이 있을 수 있다.
생성자 (Constructor)
클래스의 객체를 생성하는 역할이다. 추후 포스팅을 통해 자세히 다룰 예정이다.
이너 클래스 (Inner Class)
클래스 내의 클래스를 의미한다. 여기선 Dog 안의 Poodle이라는 내부 클래스를 정의했다.
이 네 가지 구성요소 중 필드, 메서드, 이너 클래스를 클래스 멤버(Class Member)라고 부른다. 클래스 멤버 중에서도 필드와 메서드는 클래스가 가지는 속성과 기능을 대표해 클래스의 주축이자 핵심이라고 볼 수 있다.
객체 (Object)
객체는 속성과 기능이라는 두 구성요소로 이뤄져있다. 위에서 봤듯이 속성과 기능은 필드와 메서드로 정의된다. Dog이라는 객체의 속성은 age, weight등이고 기능은 bark, walk 등이다. 하나의 개체에는 다양한 속성과 기능이 있을 수 있다.
객체의 생성은 위 이미지와 같이 할 수 있다. 먼저, 특정 클래스 타입의 참조변수를 선언한다. 그후 new 키워드와 생성자를 통해 인스턴스를 만들어 참조변수에 할당한다. 참조변수에 할당된 것은 데이터 값이 아니라 실제 데이터가 저장돼 있는 RAM의 힙 메모리 주소값이다. 따라서 new 키워드는 객체를 만들어서 힙 메모리에 넣으라는 의미를 가진다.
객체의 생성 과정은 위 이미지와 같다. 첫 줄의 Boy obj;는 아직 객체를 생성하지 않아 값이 null이다. 두 번째 줄처럼 new연산자와 생성자로 참조변수에 힙 메모리 주소값을 할당해주면, 포인트 연산자 "."를 통해 클래스의 속성과 기능인 필드와 메서드에 접근이 가능해진다. 메모리가 할당되고 저장되는 과정도 중요한데, 복잡하기 때문에 여기서는 다루지 않는다.
public class Cookie {
String gender; // 필드 선언
int age;
String kind;
Cookie () {};
Cookie(String gender, int age, String kind){
this.gender = gender;
this.age = age;
this.kind = kind;
}
public void eat() { // 메서드 선언
System.out.println("밥을 먹는다.");
}
void bark() {
System.out.println("짖는다.");
}
void sleep() {
System.out.println("쿨쿨 잔다.");
}
}
}
public class CookieTest {
public static void main(String[] args) {
Cookie c = new Cookie("남아", 5, "푸들"); // 객체 생성.
System.out.println("쿠키는 " + c.gender + ", 나이는 " + c.age + "살이고, 종은 " + c.kind + "입니다.");
// 필드 호출
System.out.println("쿠키는 배고플 때 ");
c.eat(); // 메서드 호출
System.out.println("쿠키는 긴장할 때 ");
c.bark(); // 메서드 호출
System.out.println("쿠키는 졸릴 때 ");
c.sleep(); // 메서드 호출
}
실습을 통해 작성해본 코드다. 먼저, Cookie라는 클래스에서 필드(속성)는 gender, age, kind다. 메서드(기능)는 eat(), bark(), sleep()이다. 그리고 CookieTest라는 클래스에서 c라는 인스턴스를 만들어 Cookie 클래스의 필드와 메서드를 호출 및 출력했다.