본문 바로가기
JAVA

[자바/JAVA] - 클래스(class), 객체(instance)란?

by wook99 2024. 5. 25.

자바는 클래스와 객체로 이루어져 있다고 해도 과언이 아니다. 그만큼 클래스와 객체의 개념은 중요하고,

많은 내용을 포함하고 있어 한번에 이해하기 쉽지 않다.

 

클래스 : 설계도 (낙타 표기법(CamelCase) 사용)

객체 or 인스턴스 : 만들어진 실체

 

클래스는 설계도이고, 이 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라고 생각하고 글을 읽으면 이해에 도움이 될 것이다.

 

객체와 인스턴스는 클래스에서 나온 실체라는 의미에서 비슷하게 사용된다. 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이고, 특정 클래스와의 관계를 명확히 할 때 인스턴스라는 용어를 사용한다.

하지만 둘다 클래스에서 나온 실체라는 핵심은 같기 때문에 보통 구분하지 않고 사용한다.

 

읽기 전, 자바의 대원칙인 "자바에서 대입은 항상 변수에 들어 있는 값을 복사한다." 를 머리에 각인시키고 들어가면 좋다.

 

 

아래의 코드는 학생 3명을 다루는 변수들을 선언 및 초기화 하고, 출력문을 작성한 것이다. 

public class ClassStart1 {
    public static void main(String[] args) {
        String student1Name = "학생1";
        int student1Age = 25;
        int student1Grade = 90;

        String student2Name = "학생2";
        int student2Age = 26;
        int student2Grade = 84;

        String student3Name = "학생3";
        int student3Age = 27;
        int student3Grade = 30;

        System.out.println("이름: " + student1Name + " 나이 : " + student1Age + " 성적 : " + student1Grade);
        System.out.println("이름: " + student2Name + " 나이 : " + student2Age + " 성적 : " + student2Grade);
        System.out.println("이름: " + student3Name + " 나이 : " + student3Age + " 성적 : " + student3Grade);
    }
}

 

이런 코드를 작성한다면, 학생이 들어날때마다 변수를 선언해주어야 하고, 출력하는 코드를 추가해야 한다.

학생이 1000명,10000명 있다면 메모리의 낭비와 번거로운 작업을 반복해야 한다.

 

이러한 문제점을 해결하기 위해 배열을 사용할 수도 있다.

public class ClassStart2 {
    public static void main(String[] args) {
        String[] studentNames = {"학생1","학생2","학생3","학생4"};
        int[] studentAges = {15, 16, 17, 20};
        int[] studentGrade = {90, 80, 70, 60};

        for (int i = 0; i < studentNames.length; i++) {
            System.out.println("이름: " + studentNames[i] + " 나이 : " + studentAges[i] + " 성적 : " + studentGrade[i]);
        }
    }
}

 

배열을 사용하고, 출력을 for문으로 돌리게 되면 코드가 그나마 간소해진다.

하지만 만약 학생이 늘어나서 배열의 요소를 추가해야 하거나, 줄어들어서 삭제해야 한다면, 정확히 그 인덱스의 값을 찾아서 추가/제거 해줘야 하는데, 마찬가지로 학생이 1000명,10000명이 있다면 이는 매우 어려운 일이다. 즉 유지보수가 매우 불편해진다.

 

클래스라는 개념은 이러한 문제들을 해결해준다.

 

1. Student라는 클래스에 필요한 멤버 변수들을 선언해준다. 

public class Student {
    String name;
    int age;
    int grade;
}

 

 

2. 다음과 같이 Student클래스의 객체 student를 만들고, 콜론(.)을 통해 그 객체에 접근하여 값을 대입한다.

-> 변수 student의 값은 객체의 참조값(주소값)이므로, 객체 내의 name, age, grade라는 변수에 접근하려면 객체에 접근 후 변수에 값 대입을 해야한다. 그걸 콜론이 해준다.

Student student = new Student();
student.name = "학생";
student.age = 23;
student.grade = 90;

 

출력때에도 마찬가지이다.

System.out.println(student)
System.out.println("이름 : " + student.name + " 나이 : " + student.age + " 성적 : " + student.grade);

/*출력 결과
class1.Student@10f87f48
이름 : 학생 나이 : 23 성적 : 90
*/

 

 


다음은 Student 타입의 배열을 사용해본 코드이다.

public class ClassStart4 {
    public static void main(String[] args) {
        Student student1 = new Student();

        student1.name = "학생1";
        student1.age = 26;
        student1.grade = 100;

        Student student2 = new Student();
        student2.name = "학생2";
        student2.age = 23;
        student2.grade = 90;

        Student[] students = new Student[2];
        students[0] = student1;
        students[1] = student2;

        System.out.println("이름 : " + students[0].name + " 나이 : " + students[0].age + " 성적 : " + students[0].grade);
        System.out.println("이름 : " + students[1].name + " 나이 : " + students[1].age + " 성적 : " + students[1].grade);

    }
}

 

student 배열의 요소에 student1과 student2를 넣었다. 그렇다면 배열의 각 요소에는 어떤값이 저장될까?

답은 student1과 student2의 객체가 아닌 객체의 참조값(주소값)이 들어있다.

따라서 출력 시에도 student[0].name 이런식으로 접근을 해야한다.


 

다음은 Student클래스를 이용하여 학생1과 학생2의 객체를 만들고, 정보들을 출력한 코드이다. 위의 내용들을 보다 간결하게 표현했다.

public class ClassStart5 {
    public static void main(String[] args) {
        Student student1 = new Student();

        student1.name = "학생1";
        student1.age = 26;
        student1.grade = 100;

        Student student2 = new Student();
        student2.name = "학생2";
        student2.age = 23;
        student2.grade = 90;

        Student[] students = {student1, student2};

        for (Student s : students) {
            System.out.println("이름 : " + s.name + " 나이 : " + s.age + " 성적 : " + s.grade);
        }

    }
}

 

 

 

 

이 글에서의 핵심은

1. 변수에는 객체 자체가 들어있는게 아닌 객체의 위치를 나타내는 참조값이 들어있다.

2. student1과 student2는 같은 클래스에서 만들어졌지만, 서로 다른 객체이다.

3.  "자바에서 대입은 항상 변수에 들어 있는 값을 복사한다."

 

다음 글에서는 기본형과 참조형에 관하여 배운 내용을 포스팅 할 것이다.