Java

[인프런] 클래스가 필요한 이유와 클래스 도입

sejin2 2024. 5. 20. 15:51
package class1;

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

    }
}

지금은 학생이 2명이라 입력이 쉽지만, 만약 학생이 100명이라면...? => 엄청난 양의 데이터를 입력해주어야한다. 

이러한 문제를 해결하기 위해, 배열을 사용해본다 .

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

        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]);
        } 
    }
}

그런데 이마저도 한계가 있다.
코드 변경은 최소화했지만, 한 학생의 데이터가 3개의 배열 ( 이름, 나이, 등급 )에 나누어져있다.  따라서 데이터를 변경할 때 매우 조심해서 작업해야 한다. 한 학생의 데이터를 관리하기 위해 3개 배열에 인덱스의 순서를 정확하게 맞추어야 한다.

학생이라는 개념을 하나로 묶는 것이 좋다. => 이게 바로 클래스

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

student라는 클래스를 생성 => class 키워드를 사용해서 학생 클래스를 정의한다. 학생 클래스는 내부에 이름, 나이, 등급 변수를 가진다. 
이렇게 클래스의 정의한 변수들을 멤버 변수 또는 필드라 한다.
- 멤버 변수 : 이 변수들은 특정 클래스에 소속된 멤버이기 때문에 이렇게 부른다.
- 필드 : 데이터 항목을 가르키는 전통적인 용어이다. 

클래스는 관례상 대문자로 시작하고 낙타 표기법을 사용한다. 

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)이라는 데이터를 관리할 수 있는 타입을 만들면 되지 않을까? 라고 생각할 수 있음
- 클래스를 사용하면 int, String 과 같은 타입을 직접 만들 수 있다.
- 사용자가 직접 정의하는 사용자 정의 타입을 만들려면 설계도가 필요한데, 이 설계도가 바로 클래스이다.
- 설계도인 클래스를 통해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라고 한다.
- 클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 마음껏 정의할 수 있다.

용어 : 클래스, 객체, 인스턴스

클래스는 설계도이고, 이 설계도를 기반으로 실제 메모리에 만들어진 ( new ) 실체를 객체 또는 인스턴스라 한다.
둘다 같은 의미로 사용되고, 여기서는 학생 클래스를 기반으로 학생1, 학생2 객체 또는 인스턴스를 만든 것이다. 

1. 변수 선언
Student student 1
- Student 타입을 받을 수 있는 변수를 선언한다.
- int는 정수를 String은 문자열을 담을 수 있도록 Studnet는 Studnet 타입의 객체를 받을 수 있다.

2. 객체 생성
student1 = new Student()
- Student 클래스 정보를 기반으로 새로운 객체를 생성하라는 뜻으로 메모리에 실제 Student 객체를 생성한다.
- 객체를 생성할 때는 new 클래스명 ( )을 사용하면 된다.
- Student 클래스는 String name, int age, int grade 멤버 변수를 가지고 있다. 이 변수를 사용하는데 필요한 메모리 공간도 함께 확보한다. 

3. 참조값 보관
student1 = x001;  ( 인스턴스 참조값 보관 )
- 객체를 생성하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값 주소 (x001)을 반환한다.
- new 키워드를 통해 객체가 생성되고 나면, 참조 값을 반환한다. 앞서 선언한 변수인 Student student1에 생성된 객체의 참조값(x001)을 보관한다.
- Student student1 변수는 이제 메모리에 존재하는 실제 Student 객체의 참조값을 가지고 있다. 따라서 이 변수를 통해서 객체에 접근하고 사용할 수 있다. 

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

- 객체를 생성하는 new Student( ) 코드 자체에는 아무런 이름이 없다. 이 코드는 단순히 Student 클래스를 기반으로 메모리에 실제 객체를 만드는 것이다.  Student student1 변수에 참조값을 저장해두었으므로 저장한 참조값을 통해 실제 메모리에 존재하는 객체에 접근할 수 있다. 

 

 

 

공부 내용: [인프런] 김영한의 실전 자바 - 기본편