
이전에 보았던 class1.ClassStart3 코드에 중복되는 부분이 2가지 있다.
- name, age, grade에 값을 할당
- 학생 정보를 출력
이런 중복은 메서드를 통해 제거할 수 있다.
✅ 메서드에 객체 전달
✏️ Student
package ref;
public class Student {
String name;
int age;
int grade;
}
✏️ Method1
package ref;
public class Method1 {
public static void main(String[] args) {
Student student1 = new Student();
initStudent(student1, "학생1", 15, 90);
Student student2 = new Student();
initStudent(student2, "학생2", 16, 80);
printStudent(student1);
printStudent(student2);
}
static void initStudent(Student student, String name, int age, int grade) {
student.name = name;
student.age = age;
student.grade = grade;
}
static void printStudent(Student student) {
System.out.println("이름: " + student.name + " 나이: " + student.age + " 성적: " + student.grade);
}
}
참조형은 메서드를 호출할 때 참조값을 전달한다. 따라서 메서드 내부에서 전달된 참조값을 통해 객체의 값을 변경하거나, 값을 읽어서 사용할 수 있다.
- initStudent(Student student, …) : 전달한 학생 객체의 필드에 값을 설정한다.
- printStudent(Student, student, …) : 전달한 학생 객체의 필드 값을 읽어서 출력한다.
✏️ initStudent() 메서드 호출 분석
- student1이 참조하는 Student 인스턴스에 값을 편리하게 할당하고 싶어서 initStudent() 메서드를 만들었다.
- 이 메서드를 호출하면서 student1을 전달한다. 그러면 student1의 참조값이 매개변수 student에 전달된다. 이 참조값을 통해 initStudent() 메서드 안에서 student1이 참조하는 것과 동일한 x001 student 인스턴스에 접근하고 값을 변경할 수 있다.
주의❗️
package ref;
import class1.Student;
public class Method1 {
...
}
- import class1.student;이 선언되어 있으면 안된다.
- 이렇게 되면 class1 패키지에서 선언한 Student를 사용하게 된다. 이 경우 접근 제어자 때문에 컴파일 오류가 발생한다.
- 만약 선언되어 있다면 삭제하자. 삭제하면 같은 패키지에 잇는 ref.Student를 사용한다.
✅ 메서드에서 객체 반환
Student student1 = new Student();
initStudent(student1, "학생1", 15, 90);
Student student2 = new Student();
initStudent(student2, "학생2", 16, 80);
위 코드에도 중복이 있다.
바로 객체를 생성하고, 초기값을 설정하는 부분이다. 이렇게 2번 반복되는 부분을 하나로 합쳐보자.
✏️ Method2
package ref;
public class Method2 {
public static void main(String[] args) {
Student student1 = createStudent("학생1", 15, 90);
Student student2 = createStudent("학생2", 16, 80);
printStudent(student1);
printStudent(student2);
}
static Student createStudent(String name, int age, int grade) {
Student student = new Student();
student.name = name;
student.age = age;
student.grade = grade;
return student;
}
static void printStudent(Student student) {
System.out.println("이름: " + student.name + " 나이: " + student.age + " 성적: " + student.grade);
}
}
createStudent()라는 메서드를 만들고 객체를 생성하는 부분도 이 메서드 안에 함께 포함했다. 이제 이 메서드 하나로 객체의 생성과 초기값 설정을 모두 처리한다.
그런데 메서드 안에서 객체를 생성했기 때문에 만들어진 객체를 메서드 밖에서 사용할 수 있게 돌려주어야 한다. 그래야 메서드 밖에서 이 객체를 사용할 수 있다. 메서드는 호출 결과를 반환(return)할 수 있다. 메서드의 반환 기능을 사용해서 만들어진 객체의 참조값을 메서드 밖으로 반환하면 된다.
✏️ createStudent() 메서드 호출 분석
메서드 내부에서 인스턴스를 생성한 후에 참조값을 메서드 외부로 반환했다. 이 참조값만 있으면 해당 인스턴스에 접근할 수 있다. 여기서는 student1에 참조값을 보관하고 사용한다.
⚙️ 진행 과정
Student student1 = createStudent("학생1", 15, 90); // 메서드 호출 후 결과 반환
Student student1 = student(x001); // 참조형인 student를 반환
Student student1 = x001; // student의 참조값 대입
student1 = x001;
createStudent()는 생성한 Student 인스턴스의 참조값을 반환한다. 이렇게 반환된 참조값을 student1 변수에 저장했다. 앞으로는 student1을 통해 Student 인스턴스를 사용할 수 있다.
'Back-end > Java' 카테고리의 다른 글
| [Java - 기본] 변수와 초기화 (0) | 2024.04.04 |
|---|---|
| [Java] toString()과 String.valueOf()의 차이점과 형변환 방법 (0) | 2024.04.04 |
| [Java - 기본] 기본형 vs 참조형 (3) - 메서드 호출 (0) | 2024.04.03 |
| [Java - 기본] 기본형 vs 참조형 (2) (0) | 2024.04.03 |
| [Java - 기본] 기본형 vs 참조형 (1) (0) | 2024.04.02 |