강의내용정리/Java

[Java] 클래스와 객체

송병민 2025. 1. 13. 16:42

클래스와 객체, 인스턴스

  • 클래스 (Class)

클래스는 객체를 생성하기 위한 '설계도'이다. 클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다.

 

  • 객체 (Object)

객체는 클래스에서 정의한 속성과 기능을 가진 실체이다. 객체는 서로 독립적인 상태를 가진다.

 

  • 인스턴스 (Instance)

인스턴스는 특정 클래스로부터 생성된 객체를 의미한다. 객체와 인스턴스라는 용어가 자주 혼용되는데, 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용한다.

 

ex) student1 객체는 Student 클래스의 인스턴스다.

객체 vs 인스턴스

 둘다 클래스에서 나온 실체라는 의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이다. 보통 ' student1은 Student 의 객체이다 ' 라고 말하는 대신 ' student1은 Student 의 인스턴스이다 ' 라고 특정 클래스와의 관계를 명확히 할 때 인스턴스라는 용어를 주로 사용한다.

 

※ 둘다 클래스에서 나온 실체라는 핵심 의미는 같기에 보통 둘을 구분하지 않고 사용한다

 

클래스는 왜 필요할까

요구 사항

  1. 첫 번째 학생의 이름은 "학생1", 나이는 15, 성적은 90입니다.
  2. 두 번째 학생의 이름은 "학생2", 나이는 16, 성적은 80입니다.
  3. 각 학생의 정보를 다음과 같은 형식으로 출력해야 합니다: "이름: [이름] 나이: [나이] 성적: [성적]"
  4. 변수를 사용해서 학생 정보를 저장하고 변수를 사용해서 학생 정보를 출력해야 합니다.

 

1. 변수사용

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

        String student2Name = "학생1";
        int student2Age = 16;
        int student2Grade = 80;

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

학생의 수에 따라 각각 다른 변수를 사용했다. 이코드의 문제점은 학생이 늘어날 때마다 변수를 추가 선언해야 하고 출력하는 코드가 계속 추가된다.

 

2. 배열사용

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

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

배열을 사용해서 데이터가 추가 될때 생기는 문제를 해결했다.

그러나 배열을 사용해서 코드 변경을 최소화했지만, 한 학생의 데이터를 변경할 때 그 학생의 데이터를 찾아서 제거해야한다. 특정 학생의 데이터를 변경할 때 실수할 가능성이 높다. (관리의 불편함)

 

3. 클래스도입

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

public class ClassStart3 {
    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;

        System.out.println(student1);

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

 

 

클래스를 사용해서 학생이라는 개념을 만들고 학생의 데이터를 관리한다.

 

4. 배열도입

public class ClassStart5 {
    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;

        Student[] students = new Student[] {student1, student2};

        for (int i = 0; i < students.length; i++) {
            System.out.println("이름:" + students[i].name + " 나이:" + students[i].age + " 성적:" + students[i].grade);
        }

        // 최적화 1
        for (int i = 0; i < students.length; i++) {
            Student s = students[i];
            System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
        }

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

배열을 사용해서 for문으로 출력하여 최적화할 수 있게 되었다.

 

코드 분석

1. 변수 선언

  • Student student1
    • Student 타입을 받을 수 있는 변수를 선언
    • int는 정수, String은 문자를 담을 수 있듯이 Student는 Student 타입의 객체를 받을 수 있다

2. 객체 생성

  • student1 =  new Student()
    • 객체 사용을 위해 클래스를 기반으로 객체를 생성해야한다
    • new 키워드는 새로 생성한다는 뜻, 메모리에 실제 Student 객체를 생성한다
    • Student 클래스의 멤버변수(name, age, grade)도 함께 메모리에 공간 확보를 한다

3. 참조값 보관

  • 객체를 생성하면 자바는 메모리 어딘가에 있는 객체에 접근할 수 있는 참조값(주소)(x001)을 반환
  • new 키워드를 통해 객체가 생성되면 참조값을 반환한다
  • Student student1 변수는 메모리에 존재하는 Student 객체의 참조값을 가진다

※ 참조값을 변수에 보관하는 이유

 객체를 생성하는 new Student() 코드 자체에는 아무런 이름이 없다. 단순히 Student 클래스를 기반으로 메모리에 실제 객체를 만드는 것이다. 따라서 생성한 객체에 접근할 수 있는 방법이 필요한데 이런 이유로 객체를 생성할 때 반환되는 참조값을 보관할 변수가 필요하다. 변수에 저장한 참조값을 통해서 실제 메모리에 존재하는 객체에 접근하는 것이다.

Student student1 = new Student(); //1. Student 객체 생성
Student student1 = x001; //2. new Student()의 결과로 x001 참조값 반환
student1 = x001; //3. 최종 결과

4. 객체 사용

//객체 값 대입
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;

//객체 값 사용
System.out.println("이름:" + student1.name + 
" 나이:" + student1.age + " 성적:" + student1.grade);

객체를 사용하려면 메모리에 존재하는 객체에 접근해야한다. 객체에 접근하는 방법은 점(dot)을 사용한다.

5. 배열에 참조값 대입

students[0] = student1;
students[1] = student2;

//자바에서 대입은 항상 변수에 들어 있는 값을 복사한다.
students[0] = x001;
students[1] = x002;

student1, 2에는 참조값이 보관되어 있다. 배열에 저장되는 값은 이 참조값이다.

※ 변수에는 인스턴스 자체가 들어있는 것이 아니라 인스턴스의 위치를 가리키는 참조값이 들어있다. 대입시에 인스턴스가 복사되는 것이 아니라 참조값만 복사된다

'강의내용정리 > Java' 카테고리의 다른 글

[Java] 생성자  (0) 2025.01.20
[Java] 객체 지향 프로그래밍  (0) 2025.01.20
[Java] 기본형과 참조형  (0) 2025.01.13