처음 자바에 대한 글을 작성할때 변수와 자료형에 대해 알아보았다. 그리고 자료형에는 기본 자료형과 참조 자료형이 있다고 하였다. 참조형에 대해선 그 당시에 다루지 않았는데, 참조 자료형은 클래스에 대한 기본적인 지식을 가지고 있어야 이해하기 편하다고 생각하였다.
참조 자료형은 자료형이 클래스이다. 우리가 자주 사용하는 String, 그리고 우리가 직접 정의한 Student 클래스도 참조 자료형이 될 수 있다. 기본 자료형은 int, char, double, boolean 과 같이 그 크기가 이미 정해져 있지만, 참조자료형은 참조하는 클래스에 따라 그 크기가 다르다.
이전에 학생 클래스를 만들어 학생의 고유번호와 이름을 받아 학생의 정보를 보여주는 일을 하는 클래스를 정의하였다.
public class StudentTest{
public static void main(String[] args){
Student studentGo = new Student();
}
}
그리고 만든 학생 클래스를 객체로 생성하여 위와 같이 참조변수에 할당하였다. 이렇듯 참조변수를 main 메소드 안에서만 정의 하였는데, 참조변수는 클래스의 내부에 맴버변수로써도 사용할 수 있다.
학생 클래스를 만들었으니 학생마다 수강하는 과목을 만들고 싶다. 그리고 그 과목에 대한 점수도 받고싶다. 그렇다면 다음과 같이 작성하면 될까?
public class Student{
int studentId;
String studentName;
String subjectEng;//영어
int subjectEngScore;//영어점수
String subjectMath;//수학
int subjeectMathScore;//수학점수
...
}
위와 같이 과목을 하나하나 적는 것은 비효율 적일 것 같다. 게다가 과목이 갖는 점수 역시 따로 명시해주어야 한다. 우리는 위의 클래스를 Student 라 정의 하였다. 여기서 알 수 있는 것은 학생에 관련된 클래스라는 것 이다. 그렇다면 과목에 관련된 클래스 역시 따로 정의 할 수 있지 않을까? 한번 과목 클래스를 만들어보자.
public class Subject{
int subjectId;//과목 번호
String sbujectName;//과목 이름
int subjectScore;//과목 점수
}
위와 같이 따로 과목에 대한 클래스를 정의할 수 있다. 그렇다면 학생 클래스에서 이 과목 클래스를 가져와 사용하는 예를 보자.
public class Student{
int studentId;
String studentName;
//Subject형 참조변수
Subject eng;
Subject math;
Student(int id, String name){
studentId = id;
studentName = name;
Subject eng = new Subject();
Subject math = new Subject();
}
}
Subject 타입의 참조변수 eng와 math를 맴버변수로 선언한 뒤, 학생 객체의 생성자가 호출될때 동시에 Subject 객체가 생성되고 참조값을 참조하게 된다. 이로써 Student 객체가 생성이 되면 Subject 객체도 같이 생성되는것을 알 수 있다. (사실 위의 Subject를 통해 과목을 직접 나누는 것도 좋은 예는 아니지만 우리는 아직 배열과 리스트를 배우지 않았기 때문에 일단은 위와 같이 작성하자)
public class Student{
...
void setEngSubject(int id, String name, int score) {
eng.subjectId = id;
eng.subjectName = name;
eng.subjectScore = score;
}
void setMathSubject(int id, String name, int score) {
math.subjectId = id;
math.subjectName = name;
math.subjectScore = score;
}
void showStudentScore() {
System.out.println("학생번호:"+studentId);
System.out.println("학생이름:"+studentName);
System.out.println("과목1:"+eng.subjectName);
System.out.println("점수:"+eng.subjectScore);
System.out.println("과목2:"+math.subjectName);
System.out.println("점수:"+math.subjectScore);
System.out.println("총 점수"+(eng.subjectScore + math.subjectScore));
}
}
그리고 Subject를 참조하긴 했지만, 과목번호와 , 과목이름, 과목점수등을 설정하지 않았기때문에 과목의 정보를 입력할 수 있는 메소드와, 학생정보 그리고 수강과목점수등을 보여주는 메소드를 만들었다. 이제 StudentTest에서 Student 객체를 생성하여 사용해보자.
public class StudentTest {
public static void main(String[] args) {
Student sJaebeom = new Student(1, "재범");
sJaebeom.setEngSubject(1, "영어", 50);
sJaebeom.setMathSubject(2, "수학", 30);
sJaebeom.showStudentScore();
System.out.println();
Student sJongwon = new Student(2, "종원");
sJongwon.setEngSubject(1, "영어", 40);
sJongwon.setMathSubject(2, "수학", 70);
sJongwon.showStudentScore();
}
}
StudentTest 클래스에서 테스트해보면 위와 같이 작성할 수 있다. 이번 글의 주제는 참조변수이지만, 참조변수를 다른 클래스에서 사용하여 객체끼리 상호작용을 하는 예제를 살짝 다루었다. 객체지향적인 프로그래밍은 이와 같이 서로 다른 객체가 맞물려서 작동하는 프로그램을 나타낸다.
무작위 포스트가 추천됩니다.
우리는 이미 생성자를 한번 사용한 적이 있다. 객체를 생성할 때 new 키워드 다음에 선언한 클래스명() 이 생성자 이다.
자바의 일반적인 상수는 변수를 선언할 때 final이라는 선언을 추가하면 그 변수는 '상수'가 된다. 그리고 상수는 다음과 같은 특징이 있다.
배열은 자료형이 같은 둘 이상의 값을 저장할 수 있는 메모리 공간을 의미한다. 그리고 배열은 그 구조에 따라서 1차원 배열과 2차원 이상의 다차원 배열로 나뉜다.