JAVA

참조 자료형

seungmin576 2024. 12. 13. 15:15

크기가 정해진 기본 자료형(int, char, float, double 등)으로 선언하는 변수가 있고, 클래스 자료형으로 선언하는 참조 자료형 변수가 있다.

 

  • 클래스를 선언하여 참조형을 이용한 프로그램 구현 예시

어떤 학생이 존재한다.

학생이 국어와 수학 과목을 수강하는데, 시험을 본 후 국어 성적과 수학 성적 정보를 저장하는 프로그램을 만든다고 생각해보자.

객체 지향 프로그래밍을 시작할 때는 일단 클래스를 어떻게 만들지 생각한다.

먼저 클래스가 제공해야 할 멤버 변수와 메서드를 생각해 볼 수 있다.

이를 바탕으로 다음처럼 학생 클래스를 만들어 보자.

package exercise;

public class Student1 {
    int studentID;
    String studentName;
    int koreaScore;
    int mathScore;
}

 

여기서 String이 JDK에서 제공하는 참조 자료형이다.

나머지 변수는 기본 자료형을 사용했다.

그런데 성적을 저장하는 변수가 두 개 있는데, 만약 성적뿐만 아니라 이 학생이 수강하는 과목의 이름도 함께 저장해야 한다면? 아주 간단한 방법으로는 String을 사용해서 과목 이름 변수까지 추가할 수 있다.

 

package exercise;

public class Student1 {
    int studentID;
    String studentName;
    int koreaScore;
    int mathScore;
    String koreaSubject;
    String mathSubject;	//과목 이름 변수 추가
}

이렇게 구현하니 이 클래스는 학생에 대한 클래스인데 과목에 대한 변수가 계속 늘어나고 있다.

이 문제를 해결하기 위해 과목의 이름과 성적을 Subject라는 클래스로 분리하고, 학생에 Subject 변수를 각 과목별로 추가하는 것이 좋아 보인다.

학생
학번
학생 이름
국어 성적
수학 성적
수강하는 과목 이름

이었던 걸

 

학생 과목
학번
학생 이름
국어 과목
수학 과목
과목 이름
과목 점수

로 나눈다.

 

위 내용을 우리가 사용하느 변수 형태로 보면 다음과 같다.

 

Student Subject
int studentID
String studentName
Subject korean
Subject math
String subjectName
int scorePoint

과목을 의미하는 Subject라는 클래스를 새로 만들었다.

Subject 클래스는 과목의 이름과 점수를 멤버 변수로 가지고 있다.

이렇게 수정하면 과목과 관련한 내용은 Subject 클래스로 분리하여 구현할 수 있다.

또한 Student는 SUbject 클래스를 멤버 변수로 가지면 된다.

 

package exercise;

public class Subject {
    String subjectName;
    int scorePoint;
}
package exercise;

public class Student1 {
    int studentID;
    String studentName;
   Subject korean;
   Subject math;   //Subject 형을 사용하여 선언
}

기존엔 Student1 클래스에 과목 이름을 추가해야 한다면 koreanSubjectName, mathSubjectName 이렇게 두 개의 변수를 추가해야 한다.

하지만 Subject로 클래스를 분리하면 subjectName은 Subject 클래스에 선언하면 된다.

그리고 국어 과목 이름은 Korean.subjectName으로 사용하고 수학 과목 이름은 math.subjectName으로 사용할 수 있어 편리하다.

 

참조 자료형은 프로그래머가 필요에 의해 만든 클래스를 사용할 수도 있고, JDK에서 제공하는 클래스를 사용할 수도 있다.

기본 자료형을 사용하듯이 클래스 자료형 변수를 선언해서 사용한다고 생각하면 이해하기 쉽다.

'JAVA' 카테고리의 다른 글

this  (0) 2024.12.16
정보 은닉(접근 제어자, get(),set())  (0) 2024.12.13
생성자  (0) 2024.12.13
클래스와 인스턴스  (0) 2024.12.12
함수(매개변수, return), 스택 메모리, 메서드  (0) 2024.12.11