Claire's Study Note

[Java 기본] 1. 클래스와 데이터

by Hi.Claire
반응형

🖥️ 김영한의 실전 자바 - 기본편 (김영한, 인프런)

 

섹션1. 클래스와 데이터

1-1. 클래스가 필요한 이유

(문제) 학생 정보 출력 프로그램 만들기

두 명의 학생 정보를 출력하는 프로그램을 작성하려고 한다.

각 학생은 이름, 나이, 성적을 가지고 있다.

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

 

(풀이1) 변수 사용

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

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

 

  • 문제점
    • 각각 다른 변수를 사용해서 학생이 늘어날 때마다 변수를 추가 선언하고, 출력하는 코드도 추가해야 한다.
  • 해결 방법
    • 학생이 추가될 때 코드 변경을 최소화하기 위해 배열을 사용하자!

 

(풀이2) 배열 사용

package class1;

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

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

 

  • 문제점
    • 관리가 어렵다. 한 학생의 데이터가 studentNames[], studentAges[], studentGrades[] 라는 3개의 배열에 나누어져 있다. 따라서 학생의 데이터를 변경할 때 각각의 배열을 모두 변경해야 하고, 한 학생을 관리하기 위해 3개 배열의 인덱스 순서를 항상 정확하게 맞춰야 한다.
  • 해결 방법
    • 학생이라는 개념을 하나로 묶어서 관리하자. 그리고 각각의 학생별로 본인의 이름, 나이, 성적을 관리하자.

 

1-2. 클래스 도입

클래스와 사용자 정의 타입

데이터의 종류나 형태를 타입이라고 한다.

그렇다면 학생(Student)이라는 타입을 만들면 어떨까?

사용자가 직접 정의하는 사용자 정의 타입을 만들기 위한 설계도가 바로 클래스이다.

클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 마음껏 정의할 수 있다.

 

그럼 이제 1-1의 문제를 해결하기 위해 클래스를 도입해보자.

클래스를 사용해서 학생이라는 타입을 만들고, 각각의 학생별로 이름, 나이, 성적을 관리한다.

 

(풀이3.1) 클래스 도입

package class1;

public class Student {
    // 멤버 변수 (필드)
    String name;
    int age;
    int grade;
}

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

name, age, grade와 같이 클래스에 정의한 변수들을 멤버 변수(Member Variable), 또는 필드(Field)라고 한다.

 

(풀이3.2) 클래스를 사용하는 코드

package class1;

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

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

 

위의 코드를 간단하게 살펴보면 다음과 같다.

new 키워드를 통해 메모리에 실제 Student 타입의 객체(인스턴스)를 생성하고, 해당 객체(인스턴스)의 참조값(메모리 주소)을 student1이라는 변수에 대입한다.

이 참조값을 저장하고 있는 student1 변수를 통해서 실제 메모리에 존재하는 객체에 접근할 수 있다.

 

1-3. 객체 사용

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

객체에 접근하려면 .(점, dot)을 사용하면 된다.

 

(예시)

student1.name = "학생1";

student1 변수가 가지고 있는 참조값을 통해 메모리상의 실제 객체에 접근한다.

그리고 해당 객체의 name 멤버 변수에 접근해서 "학생1" 데이터를 저장한다.

 

1-4. 클래스, 객체, 인스턴스 정리

클래스(Class)

클래스(Class)객체를 생성하기 위한 '틀' 또는 '설계도'이다.

클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)을 정의한다.

자동차 설계도를 통해 실제 자동차를 만들듯이 클래스는 실제 존재하는 것이 아니라 개념으로만 있는 것이고, 이 클래스를 통해 실제 생성한 자동차가 객체 또는 인스턴스이다.

 

객체(Object)

객체(Object)클래스에서 정의한 속성과 기능을 가진 실체이다.

클래스를 통해 만든 각각의 객체는 서로 독립적인 상태를 가진다.

예를 들어, Student 클래스를 통해 생성한 student1, student2는 서로 다른 객체이다.

 

인스턴스(Instance)

인스턴스(Instance)특정 클래스로부터 생성된 객체를 의미한다.

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

객체와 인스턴스는 둘다 클래스에서 나온 실체라는 의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다는 좀 더 관계에 초점을 맞춘 단어이다.

 

1-5. 배열 도입

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

Student 클래스를 사용한 변수들도 Student 타입이기 때문에 배열을 사용해서 하나의 데이터 구조로 묶어서 관리할 수 있다.

 

(풀이4) 배열 도입

package class1;

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 = {student1, student2};

        for (Student student : students) {
            System.out.println("이름: " + student.name + " 나이: " + student.age + " 성적: " + student.grade);
        }
    }
}

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

 

Student[] 배열의 각 항목도 Student 타입의 변수이므로 Student 인스턴스의 참조값을 보관한다.

배열에 참조값을 대입하지 않으면 참조값이 없다는 의미의 null 값으로 초기화된다.

 

배열에 Student 타입의 참조값을 대입할 때에도 자바의 대원칙이 적용된다.

즉, 참조값을 복사해서 대입한다.

이때 주의할 점은 student1 변수에 인스턴스 자체가 들어있는 것이 아니라 인스턴스의 위치를 가리키는 참조값이 들어있다는 것이다.

따라서 students[0]에 student1을 대입(=)할 때, 인스턴스가 복사되는 것이 아니라 참조값만 복사해서 대입한다.

반응형

블로그의 정보

Claire's Study Note

Hi.Claire

활동하기