Java

클래스, 객체, 인스턴스

공부처음하는사람 2024. 5. 7. 00:47

강의 예제 중 클래스가 왜 필요한지에 대한 내용이다.

 

package class1;

public class ClassStart1 {
    public static void main(String[] args) {
        String student1Name = "학생1";
        String student2Name = "학생2";

        int student1Age = 15;
        int student2Age = 16;

        int student1Score = 90;
        int student2Score = 80;

        System.out.println("이름: " + student1Name + "나이: " + student1Age + "점수: " + student1Score);
        System.out.println("이름: " + student2Name + "나이: " + student2Age + "점수: " + student2Score);
    }
}

 

이름: 학생1 나이: 15 성적: 90

이름: 학생2 나이: 16 성적: 80

이라는 내용을 출력해야 한다.

 

위와 같이 코드를 작성할 수 있으나, 학생3이 추가된다면 추가될 때마다 변수를 추가로 선언해야하고 여러가지로 번거롭다.

 

입문강의에서 배운 배열을 사용해 리팩토링을 해보자.

 

package class1;

public class ClassStart2 {
    public static void main(String[] args) {

        String[] studentName = {"학생1", "학생2"};
        int[] studentAge = {15, 16};
        int[] studentScore = {90, 80};

        for (int i = 0; i < studentName.length; i++) {
            System.out.println("이름: " + studentName[i] + " 나이: " + studentAge[i] + " 점수: " + studentScore[i]);
        }
    }
}

 

배열을 사용해 코드를 리팩토링 해봤다.

확실히 이전보다 코드가 간결해졌다. 하지만 마찬가지로 데이터가 추가되거나 삭제할 때 해당 데이터에 맞는 인덱스를

일일이 지우는게 쉽지만은 않을 것이다.

배열을 사용하는 것도 데이터를 관리하기 좋은 방식은 아닌 것 같다.

 

다음은 클래스를 도입해봤다.

package class1;

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

}

 

Student Class를 생성했다.

학생 클래스의 내부에 name, age, grade 의 변수가 있다.

 

위와 같이 클래스에 정의한 변수를 멤버 변수, 또는 필드라고 한다.

 

package class1;

public class ClassStart3 {
    public static void main(String[] args) {
        Student student1;
        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);
    }
}

 

학생 클래스를 사용하는 코드를 작성해봤다.

타입은 데이터의 종류나 형태를 나타낸다. int 는 정수, String은 문자 타입이다.

위 코드는 Student라는 타입을 직접 만든것이다.

사용자가 직접 정의하는 사용자 정의 타입을 만들기 위해 설계도가 필요한데, 이 설계도가 클래스이다.

클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라고 한다.

 

위 코드에선 Student 클래스를 이용해 student1, student2 객체 (인스턴스)를 만들었다.

Student 객체라고 하기보단 인스턴스!!

 

student1 = new Student의 코드가 실행되면, Student 인스턴스의 참조값이 student1에 대입된다.

이로써 student1이 Student 클래스에 접근할 수 있게 되고, Student 필드를 사용할 수 있게된다.

 

객체를 사용하기 위해선 점 (.)을 사용해 객체에 접근할 수 있다.

 

1. x001 접근 / 2. name 접근

 

println(student1.name)이 작동하면 위와 같은 순서로 작동하게 된다.

 

클래스, 객체, 인스턴스 정리

 

클래스 (Class)

클래스는 객체를 생성하기 위한 '틀' 또는 '설계도'이다. (이전에 지겹도록 들은 붕어빵틀과 자동차 설계도를 생각하자)

클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다. 위 코드에서의 속성은 name, age, grade가 되겠다.

메서드는 위 코드에서 다루지 않았다.

- 틀: 붕어빵 틀은 붕어빵이 아니다. 실제로 먹을 수 있는 붕어빵은 팥 붕어빵(객체 또는 인스턴스라 한다.)이다.

- 설계도: 자동차 설계도는 자동차가 아니다. 설계도를 통해 생산한 흰색 테슬라 모델Y 자동차를 객체 또는 인스턴스라 한다.

 

객체 (Object)

객체는 클래스에서 정의한 속성과 기능을 가진 실체이다. (팥 붕어빵, 흰색 테슬라)

위 코드에선 student1은 학생1의 속성을 가진 객체이다. student2도 마찬가지.

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

 

객체 vs 인스턴스

객체와 인스턴스는 많이 혼용되어 부른다. 다만 용어상으로 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이다.

예를 들어 student1은 Student의 객체이다(x) / student1은 Student의 인스턴스이다(o)

위에선 좀 극단적으로 o,x를 사용했지만 둘 다 클래스에서 나온 실체라는 핵심의미는 같기에 둘을 구분하지 않아도 된다.

굳이 따지자면 '인스턴스이다'가 조금 더 자연스럽지 않나?라는 느낌인듯하다.

 


 

그림이 꽤 지저분한데 정보공유의 목적을 둔 블로그가 아니기 때문에.. 혹시나 이 글로 공부를 하는사람이 있다면 양해 부탁드립니다....

'Java' 카테고리의 다른 글

생성자  (0) 2024.05.15
객체 지향 프로그래밍  (1) 2024.05.08
기본형과 참조형  (0) 2024.05.07
클래스 - 배열  (1) 2024.05.07
삼항 연산자  (1) 2024.04.25