[Java] 클래스와 데이터

SUNNY_KIM·2024년 1월 5일
0
post-thumbnail

클래스가 필요한 이유

클래스가 필요한 이유를 변수만 사용 -> 배열만 사용 -> 클래스 도입 의 과정을 거쳐
예제코드를 이용하여 설명하겠다.


문제 : 학생의 이름, 나이 , 성적을 저장하고 출력하는 과정을 해보자

1. 변수를 사용했을 때

    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. 배열를 사용했을 때

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

배열을 사용한 덕분에 학생이 추가되어도 배열에 학생의 데이터만 추가하면 된다. 이제 변수를 더 추가하지 않아도 되고, 출력 부분의 코드도 그대로 유지할 수 있다.

하지만, "학생 1"의 데이터를 삭제하려면 studentNames, studentAges, studentGrades의
모든 배열을 각각 변경해야한다.
그리고 한 학생의 데이터를 관리하기 위해 3개 배열의 인덱스 순서를 항상 정확하게 맞추어야 한다. 이렇게 하면 특정 학생의 데이터를 변경할 때 실수할 가능성이 매우 높다.

사람이 관리하기 좋은 방식은 학생이라는 개념을 하나로 묶는 것이다. 그리고 각각의 학생 별로 본인의 이름, 나이, 성적을 관리하는 것이다.


3. 클래스 도입

앞서 이야기한 문제를 클래스를 도입해서 해결해보자.

-Student.java-

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

class 키워드를 사용해서 학생 클래스( Student )를 정의한다.
학생 클래스는 내부에 이름( name ), 나이( age ), 성적( grade ) 변수를 가진다.

이렇게 클래스에 정의한 변수들을 멤버 변수, 또는 필드라 한다.

  • 멤버 변수(Member Variable): 이 변수들은 특정 클래스에 소속된 멤버이기 때문에 이렇게 부른다.
  • 필드(Field): 데이터 항목을 가리키는 전통적인 용어이다. 데이터베이스, 엑셀 등에서 데이터 각각의 항목을 필드라 한다.
  • 자바에서 멤버 변수, 필드는 같은 뜻이다. 클래스에 소속된 변수를 뜻한다.


    클래스는 관례상 대문자로 시작하고 낙타 표기법을 사용한다.
    예): Student , User , MemberService

이제 학생 클래스를 사용하는 코드를 작성해보자.

-ClassStrart3.java-

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

실행결과

이름:학생1 나이:15 성적:90
이름:학생2 나이:16 성적:80

쉽게 생각하자면 int, String 처럼 우리는 Student 타입을 만들었다고 생각하면 편하다.
즉, 이렇게 사용자가 직접 정의하는 사용자 정의 타입을 만들려면 설계도가 필요하다.
설계도가 바로 클래스이다.
설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다.

용어: 클래스, 객체, 인스턴스
클래스는 설계도이고, 이 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다. 둘다 같은 의미로 사용된다.
위 코드에서는 학생( Student ) 클래스를 기반으로 학생1( student1 ), 학생2( student2 ) 객체 또는 인스턴스를 만들었다.


객체에 대해 분석해보자!!

1. Student 변수 선언

  • Student student1
    • Student 타입을 받을 수 있는 변수를 선언한다.
    • int 는 정수를, String 은 문자를 담을 수 있듯이 StudentStudent 타입의 객체(인스턴스)를 받을 수 있다.



2. Student 객체 생성 (Student클래스의 인스턴스와 같은말)

student1 = new Student() 코드를 나누어 분석해보자.

  • 객체를 사용하려면 먼저 설계도인 클래스를 기반으로 객체(인스턴스)를 생성해야 한다.
  • new Student() : new 는 새로 생성한다는 뜻이다. new Student()Student 클래스 정보를 기반으로 새로운 객체를 생성하라는 뜻이다. 이렇게 하면 메모리에 실제 Student 객체(인스턴스)를 생성한다.
  • 객체를 생성할 때는 new 클래스명() 을 사용하면 된다. 마지막에 () 도 추가해야 한다.
  • Student 클래스는 String name , int age , int grade 멤버 변수를 가지고 있다. 이 변수를 사용하는데 필요한 메모리 공간도 함께 확보한다.



3. 참조값 보관

  • 객체를 생성하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)( x001 )을 반환한다.
    • 여기서 x001 이라고 표현한 것이 참조값이다. (실제로 x001 처럼 표현되는 것은 아니고 이해를 돕기 위한 예시이다.
  • new 키워드를 통해 객체가 생성되고 나면 참조값을 반환한다.
    앞서 선언한 변수인 Student student1 에 생성된 객체의 참조값( x001 )을 보관한다.
  • Student student1 변수는 이제 메모리에 존재하는 실제 Student 객체(인스턴스)의 참조값을 가지고 있다.
    • student1 변수는 방금 만든 객체에 접근할 수 있는 참조값을 가지고 있다. 따라서 이 변수를 통해서 객체를 접근(참조)할 수 있다. 쉽게 이야기해서 student1 변수를 통해 메모리에 있는 실제 객체를 접근하고사용할 수 있다.

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

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

지금까지 설명한 내용을 간단히 풀어보면 다음과 같다.

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

이후에 학생2( student2 )까지 생성하면 다음과 같이 Student 객체(인스턴스)가 메모리에 2개 생성된다. 각각 참조값이 다르므로 서로 구분할 수 있다.

참조값 직접 확인해보기!

	System.out.println(student1);
	System.out.println(student2);


       출력결과

	class1.Student@7a81197d
	class1.Student@2f2c9b19

@앞은 패키지 + 클래스 정보를 뜻한다. @뒤에 16진수는 참조값을 뜻한다.


객체 사용

클래스를 통해 생성한 객체를 사용하려면 먼저 메모리에 존재하는 객체에 접근해야 한다. 객체에 접근하려면 . (점, dot)을 사용하면 된다.

//객체 값 대입
student1.name = "학생1";            
student1.age = 15;
student1.grade = 90;
//객체 값 사용
System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" +
student1.grade);

student1.name = "학생1"; 을
x001.name="학생1"; 라고 생각하면 편하다


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

클래스 - Class

클래스는 객체를 생성하기 위한 '틀' 또는 '설계도'이다. 클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다. 예를 들어 학생이라는 클래스는 속성으로 name , age , grade 를 가진다.

  • 틀: 붕어빵 틀을 생각해보자. 붕어빵 틀은 붕어빵이 아니다! 이렇게 생긴 붕어빵이 나왔으면 좋겠다고 만드는 틀일뿐이다. 실제 먹을 수 있는 것이 아니다. 실제 먹을 수 있는 팥 붕어빵을 객체 또는 인스턴스라 한다.

  • 설계도: 자동차 설계도를 생각해보자. 자동차 설계도는 자동차가 아니다! 설계도는 실제 존재하는 것이 아니라 개념으로만 있는 것이다. 설계도를 통해 생산한 실제 존재하는 흰색 테슬라 모델 Y 자동차를 객체 또는 인스턴스라한다.

객체 - Object

객체는 클래스에서 정의한 속성과 기능을 가진 실체이다. 객체는 서로 독립적인 상태를 가진다.
예를 들어 위 코드에서 student1 은 학생1의 속성을 가지는 객체이고, student2 는 학생2의 속성을 가지는 객체이다. student1student2 는 같은 클래스에서 만들어졌지만, 서로 다른 객체이다.

인스턴스 - Instance

인스턴스는 특정 클래스로부터 생성된 객체를 의미한다. 그래서 객체와 인스턴스라는 용어는 자주 혼용된다. 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용한다.
예를 들어서 student1 객체는 Student 클래스의 인스턴스다. 라고 표현한다.

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


좀 더 쉽게 풀어보자면, 모든 인스턴스는 객체이지만, 우리가 인스턴스라고 부르는 순간은 특정 클래스로부터 그 객체가 생성되었음을 강조하고 싶을 때이다.
예를 들어 student1 은 객체이지만, 이 객체가 Student 클래스로부터 생성되다는 점을 명확히 하기 위해 student1Student 의 인스턴스라고 부른다.


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


참고

[인프런] 김영한의 실전 자바 - 기본편

profile
호기심이 많은 백엔드 개발자

0개의 댓글