만약에 내가 여러명의 학생 정보를 출력하는 프로그램을 작성한다고 해보자. 이때 각 학생은 이름, 나이, 성적을 가지고 있다. 만약에 클래스가 없다면 배열을 이용해서 정보를 표현할 것이다.
String[] studentNames = {"학생1", "학생2"};
int[] studentAges = {15, 16};
int[] studentGrades = {90, 80};
만약에 정보가 추가된다면, 각 배열에 정보를 기입해주면 된다. 이때 데이터를 변경한다면 어떻게 될까? 정확하게 N번째 학생의 성적을 변경한다고 할 때 실수의 여지가 매우 높다. 즉, 사람이 관리하기에 좋은 코드라고 할 수 없다. 이러한 문제르 해결해주는 것이 바로 클래스이다.
public class Student {
//맴버 변수 혹은 필드라고 부른다
String name;
int age;
int grade;
}
name
age
grade
를 정의했다. 그리고 이를 활용한 실제 사용은 아래와 같다.public class ClassStart1 {
public static void main(String[] args) {
Student student1 = new Student();
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
Student student2 = new Student();
student2.name = "학생2";
student2.age = 16;
student2.grade = 80;
}
}
학생 한명당 하나의 클래스를 만들어서 관리를 한다. 이렇게 되면 1번 학생의 성적이 변동이 생겼을 때는 단순하게 student1.grade = 70
처럼 정확하게 변경해줄 수 있다.
타입은 데이터의 종류나 형태를 나타낸다. int
이면 정수 타입, String
이면 문자 타입이다. 이때 Student
라는 사용자 정의 타입을 만든 것이다. Student
라는 정의 타입을 만들려면 설계도가 필요한데, 이 설계도를 클래스 라고 한다.
설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다.
int
는 정수를 String
은 문자를 담을 수 있듯이, Student
는 Student
타입의 객체(인스턴스)를 받을 수 있다.객체를 사용하려면 먼저 클래스를 기반으로 객체를 생성해야 한다.
new Student()
는 Student
클래스 정보를 기반으로 새로운 객체를 생성하라는 뜻이다. 이렇게 하면 메모리에 실제 Student
객체를 생성한다.
Student
클래스는 String name
int age
int grade
멤버 변수를 가지고 있는데, 이 변수를 사용하는데 필요한 메모리 공간도 함께 확보한다.
마지막으로 객체가 생성되면 해당 객체에 접근할 수 있는 참조값(주소)를 반환한다. 반환된 참조값을 Student student1
변수에 저장하고, 이 student1
의 참조값을 이용해서 객체에 접근할 수 있다.
둘다 클래스에서 나온 실체라는 의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이다. 모든 인스턴스는 객체지만, 우리가 인스턴스라고 부르는 순간은 특정 클래스로부터 그 객체가 생성되었음을 강조하고 싶을 때 이다. 예시로 studnet1
은 객체이지만, 이 객체가 Student
클래스로부터 생성되었다는 점을 명확히 하기 위해서 student1
을 Studnet
의 인스턴스라고 부른다.