클래스는 서로 다른 여러 데이터형을 자유로이 조합하여 만들 수 있는 자료구조이다.(객체지향적인 관점에서의 개념과는 다를 수 있다.)
신체검사가 한창 진행중인 병무청이라고 예를 들어보자. (안간 사람은 화이팅)
총 8명의 사람이 신체검사를 받고 각각 이름, 키, 시력을 저장해야 한다.
클래스가 없다면 어떻게 해당 이름, 키, 시력을 저장해야할까?
String[] name = new String[8];
int[] height = new int[8];
float[] vision = new float[8];
name[0] = "정순동"; height[0] = 175; vision[0] = 1.5;
name[1] = "홍길동"; height[1] = 183; vision[1] = 9.0;
이런식으로 각각의 자료형에 맞는 배열을 총 3개 생성해서 한사람이 한 index만 쓰도록 사용해야 한다. 이러면 조회할 때, 3번씩 조회해야 하고 중간 인덱스에서 자료가 누락돼 뒤에서 앞으로 당겨지거나, 누군가 Arrays.sort()로 정렬을 해버린다면 그야말로 대참사가 아닐 수 없다. 지금은 8명 뿐이지만 이 대상이 수천명, 수만명이 된 후 정렬된다면 눈 앞이 깜깜할 것이다.
실제 업무에서는 보통 개인별 신체 정보를 저장하는 카드를 사람 수만큼 준비하여 이름, 키, 시력등의 데이터를 모아서 저장한다. 프로그래밍에서도 이런 방식으로 구현하는 것이 좋다.
따라서 다음과 같이 Human클래스를 만들어 해당 클래스의 인스턴스 변수로 이름, 키, 시력 등을 저장할 수 있는 변수를 만든다.
class Human {
String name;
int height;
float vision;
Human(String name, int height, float vision) { // 생성자
this.name = name;
this.height = height;
this.vision = vision;
}
}
이렇게 만들어진 Human을 배열로 사용한다면? 우리가 원하는 자료구조로써의 클래스를 만들어 사용하는 것이다.
Human[] physicalTest = new Human[8];
physicalTest[0] = new Human("정순동", 175, 1.5);
physicalTest[1] = new Human("홍길동", 183, 9.0);
이렇게 되면 배열 중간에 데이터가 누락되어 당겨져도 이름, 키, 시력간의 데이터가 섞이지 않고, Comparator를 구현하지 않는 이상 sort도 사용이 불가능하다.
클래스 본체와 멤버
클래스 본체에는 아래와 같은 내용을 선언할 수 있음.
그리고 클래스는 다음과 같은 문법 규칙과 특징이 있음.
class A {
private int f1; // private, 해당 클래스, 인스턴스 내에서만 사용 가능
protected int f2; // protected, 같은 패키지 or 상속 받은 클래스에서만 사용 가능
public int f3; // public, 다 사용가능
int f4; // default, 같은 패키지 내에서만 사용 가능
static final int S1 = 0; // 정적 상수 필드
public A() { // 생성자
f1 = f2 = f3 = f4 = 0;
}
public A(int f1, int f2, int f3, int f4) {
this.f1 = f1;
this.f2 = f2;
this.f3 = f3;
this.f4 = f4;
}
public void setF1(int f) { // f1의 setter
f1 = f;
}
public int getF1() { // f1의 getter
return f1;
}
}
더 많은 클래스에 관한 정보는 내 velog나 다른 글을 참조하면 좋다.