
자바의 세상은 클래스와 객체로 이루어져 있다.
학생 정보를 다루는 예시를 통해 클래스를 왜 도입해야 하는지 살펴보자.
String student1Name = "학생1";
int student1Age = 15;
int student1Grade = 90;
String student2Name = "학생2";
int student2Age = 16;
int student2Grade = 80;
System.out.println("이름:" + student1Name + " 나이:" + student1Age + " 성적:" + student1Grade);
System.out.println("이름:" + student2Name + " 나이:" + student2Age + " 성적:" + student2Grade);
학생이 늘어날 때마다 변수를 추가해야 하고, 출력 코드도 계속 늘어난다.
String[] studentNames = {"학생1", "학생2"};
int[] studentAges = {15, 16};
int[] studentGrades = {90, 80};
for (int i = 0; i < studentNames.length; i++) {
System.out.println("이름:" + studentNames[i] + " 나이:" + studentAges[i] + " 성적:" + studentGrades[i]);
}
배열 덕분에 반복문을 적용할 수 있게 되었지만, 한 학생의 정보가 세 개의 배열에 분리되어 있어 관리가 불편하다.
학생의 정보를 하나로 묶기 위해 Student 클래스를 정의한다.
package class1;
public class Student {
String name;
int age;
int grade;
}
이제 학생 객체를 생성해서 데이터를 담을 수 있다.
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;
System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" + student1.grade);
System.out.println("이름:" + student2.name + " 나이:" + student2.age + " 성적:" + student2.grade);
Student) 모든 인스턴스는 객체이지만, 특정 클래스에서 나왔음을 강조할 때 인스턴스라고 한다.
클래스를 이해하려면 객체가 생성되는 과정을 살펴보는 것이 중요하다.
Student student1;
Student 타입의 변수를 선언한다.
이는 정수를 담는 int, 문자를 담는 String과 비슷하게, Student라는 타입의 객체를 담을 수 있는 공간을 만든 것이다.
student1 = new Student();
new 키워드는 새로운 객체를 생성한다는 의미다. new Student()를 실행하면 설계도(Student 클래스)를 기반으로 메모리에 실제 객체가 만들어진다. name, age, grade에 필요한 메모리 공간도 확보된다.Student student1 = new Student();
student1 변수에 보관한다. student1은 객체 자체가 아니라 객체의 위치(참조값)를 저장한다. student1 → x001 (참조값) → 실제 Student 객체
즉,
student1을 통해 메모리에 있는 실제 객체에 접근할 수 있게 된다.
객체에 접근할 때는 .(dot) 연산자를 사용한다.
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
System.out.println(student1.name);
동작 순서:
1. student1이 가진 참조값(x001)을 읽는다.
2. 참조값이 가리키는 실제 객체에 접근한다.
3. 객체 안의 name, age, grade 멤버 변수에 접근하거나 값을 읽고 쓴다.
객체 변수를 그대로 출력하면 참조값이 나온다.
System.out.println(student1);
예시 출력:
class1.Student@7a81197d
class1.Student: 패키지와 클래스 이름 @7a81197d: 객체의 참조값(16진수) 클래스와 배열을 결합하면 여러 객체를 손쉽게 관리할 수 있다.
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;
Student[] students = {student1, student2};
for (Student s : students) {
System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
}
배열에는 객체 자체가 아니라 객체의 참조값이 들어간다.
따라서 배열을 통해서도 각 객체에 접근할 수 있다.