처음부터 차근차근

[Java] Class와 데이터 본문

Language/Java

[Java] Class와 데이터

HangJu_95 2023. 12. 21. 22:21
728x90

포스팅은 김영한의 실전 자바 - 기본편의 내용을 정리한 것입니다.

Class가 필요한 이유

Java는 클래스와 객체로 이루어져 있으며, Java의 특징 중 하나가 Class 기반 객체 지향 프로그래밍 언어입니다.

클래스와 객체라는 개념이 왜 필요한지부터 시작하며, 클래스가 어떤 방식으로 발전하면서 만들어졌는지 알아보겠습니다.

간단한 Class 만들어보기

클래스를 사용해서 학생이라는 개념을 만들고, 각각의 학생 별로 본인의 이름, 나이, 성적을 관리하는 것을 만들어보겠습니다.

package class1;

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

Class 키워드를 사용해서 학생 클래스를 정의하였습니다.

학생 클래스는 내부에 이름, 나이, 성적 변수를 가집니다.

 

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

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

이제 학생 클래스를 사용하는 코드를 작성해보겠습니다.

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);
        System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" + student1.grade);
        System.out.println(student2);
        System.out.println("이름:" + student2.name + " 나이:" + student2.age + " 성적:" + student2.grade);
    }
}

(아직 생성자를 주지 않아서 인스턴스에 데이터를 각각 넣어줘야 합니다.)

이 코드를 실행해보면

결과가 이렇게 나옵니다.

클래스와 사용자 정의 타입

  • 타입은 데이터의 종류나 형태를 나타내며, int라고 하면 정수 타입, String이라고 하면 문자타입입니다.
  • 클래스를 사용하면 int, String과 같은 타입을 직접 만들수 있습니다. (위 예시에서 Student라는 타입을 만들었다.)
  • 사용자가 직접 정의하는 사용자 정의 타입을 만들려면 설계도가 필요합니다. 이 설계도가 바로 클래스입니다.
  • 설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스(instance)라고 합니다.
  • 클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 마음껏 정의할 수 있습니다.

코드 분석

1. 변수 선언

Student student1

  • Student 타입을 받을 수 있는 변수를 선언합니다.

2. 객체 생성

student1 = new Student() 코드를 나누어 분석해보겠습니다.

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

3. 참조값 보관

  • 객체를 생성하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)( `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. 최종 결과

위 예제의 코드를 그림으로 간단히 표현하자면

객체 사용

객체에 값을 대입하는 것과, 객체를 사용하는 것은 너무나 쉬우니 코드를 통해 대체하겠습니다.

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

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

  • 객체 접근 방법 : .(dot)을 사용하면 됩니다.
  • 객체에 값 대입 : 점 키워드를 사용한 후, 해당하는 멤버 변수에 값을 대입합니다.
  • 객체 값 사용 : 점 키워드 사용 후, 사용하고 싶은 멤버 변수를 작성하면 됩니다.

클래스, 객체, 인스턴스??

클래스(Class)

클래스란 객체를 정의해 놓은 것이며, 객체를 생성하는데 사용된다.

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

  • 틀: 붕어빵 틀을 생각해보자. 붕어빵 틀은 붕어빵이 아니다! 이렇게 생긴 붕어빵이 나왔으면 좋겠다고 만드는 틀일뿐이다. 실제 먹을 수 있는 것이 아니다. 실제 먹을 수 있는 팥 붕어빵을 객체 또는 인스턴스라 한다.
  • 설계도: 자동차 설계도를 생각해보자. 자동차 설계도는 자동차가 아니다! 설계도는 실제 존재하는 것이 아니라 개념으로만 있는 것이다. 설계도를 통해 생산한 실제 존재하는 흰색 테슬라 모델 Y 자동차를 객체 또는 인스턴스라한다.

인스턴스(instance)

인스턴스는 특정 클래스로부터 생성된 객체를 의미합니다. 그래서 객체와 인스턴스라는 용어를 자주 혼용합니다.

인스턴스는 주로 객체가 어떤 클래스에 속해있는지 강조할 때 사용합니다.

객체(Object)

실제로 존재하는 것, 사물 또는 개념을 의미하며, 객체가 가지고 있는 기능과 속성에 따라 용도가 다르다.

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

(Javascript는 왠만한 것이 객체..)

객체 vs 인스턴스

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

배열 사용

클래스를 통해 하나의 타입을 정의했으니, 이 타입을 통해 배열을 만들어보겠습니다.

배열을 사용하면 특정 타입을 연속한 데이터 구조로 묶어서 편리하게 관리할 수 있습니다.

package class1;

public class ClassStart4 {
    public static void main(String[] args) {
        Student student1 = new Student(); // x001
        student1.name = "학생1";
        student1.age = 15;
        student1.grade = 90;

        Student student2 = new Student(); // x002
        student2.name = "학생2";
        student2.age = 16;
        student2.grade = 80;

        Student[] students = new Student[2]; // 참조값을 보관하는 역할
        students[0] = student1; // x001 대입
        students[1] = student2; // X002 대입

        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 변수를 2개 보관할 수 있는 사이즈 2의 배열을 만든다.
  • Student 타입의 변수는 Student 인스턴스의 참조값을 보관한다. Student 배열의 각각의 항목도 Student타입의 변수일 뿐이다. 따라서 Student 타입의 참조값을 보관한다.
    • student1, student2 변수를 생각해보면 Student 타입의 참조값을 보관한다.
  • 배열에는 아직 참조값을 대입하지 않았기 때문에 참조값이 없다는 의미의 null 값으로 초기화 된다.

배열에 참조값을 대입한 이후 배열 그림

여기서 주의해야 할 점은 student1, student2 변수에는 인스턴스 자체가 들어있는 것이 아닙니다. 인스턴스의 위치를 가리키는 참조값이 들어가 있을 뿐이며, 따라서 대입시에 인스턴스가 복사되는 것이 아니라 참조값만 복사됩니다.

참조

 

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

실무에 필요한 자바 객체 지향의 핵심 개념을 예제 코드를 통해 쉽게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다

www.inflearn.com

자바의 정석 - 기초편

'Language > Java' 카테고리의 다른 글

[Java] 변수와 초기화, null, null  (0) 2023.12.21
[Java] 기본형과 참조형  (1) 2023.12.21
[Java] Method  (1) 2023.12.15
[Java] Array  (1) 2023.12.15
[Java] Scanner  (0) 2023.12.15