문제) 학생 정보 출력하는 프로그램 만들기
요구 사항:
1. 첫 번째 학생의 이름은 "학생1", 나이는 15, 성적은 90입니다.
2. 두 번째 학생의 이름은 "학생2", 나이는 16, 성적은 80입니다.
3. 각 학생의 정보를 다음과 같은 형식으로 출력해야 합니다:
"이름: [이름] 나이: [나이] 성적: [성적]"
4. 변수를 사용해서 학생 정보를 저장하고 변수를 사용해서 학생 정보를 출력해야 합니다.
이 문제에 배열을 사용해보자
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]);
}
}
}
배열을 사용해, 코드 변경을 최소화 하는데는 성공적, 하지만 한 학생의 데이터가 3개의 배열에 나눠져 있음. 따라서 데이터를 변경할 때에, 각 배열마다 요소를 정확하게 찾아서 제거해주어야 한다.
즉, 이름, 나이, 성적을 따로 나누어서 관리하는 것은 사람이 관리하기 좋은 방식은 아님
--> 사람이 관리하기 좋은 방식은 학생이라는 개념을 하나로 묶는 것, 그리고 각각의 학생 별로 본인의 이름, 나이, 서적을 관리하는 것

<학생 클래스를 사용하는 코드 작성>
Student student1;
student1 = new Student();
student1.name = "학생1";
student1.age = 16;
student1.grade = 90;
Student student2 = new Student();
student2.name = "학생2";
student2.age = 15;
student2.grade = 80;
System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" + student1.grade);
System.out.println("이름:" + student2.name + " 나이:" + student2.age + " 성적:" + student2.grade);
}
클래스 : 설계도
객체: 설계도를 기반으로 실제 메모리에 만들어진 실체
Student student1
student1 = new Student()
student1 = x001;
Student student1 = new Student(); //1. Student 객체 생성
Student student1 = x001; //2. new Student()의 결과로 x001 참조값 반환
student1 = x001; //3. 최종 결과
클래스를 통해 생성한 객체를 사용하려면 먼저 메모리에 존재하는 객체에 접근해야 한다
--> 접근하기 위해서는 . (점, dot)를 사용하면 된다!
//객체 값 대입
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" +
student1.grade);

객체가 가지고 있는 멤버 변수 (name, age, grade)에 값을 대입하려면 먼저 객체에 접근해야 한다.
student1.name="학생1" //1. student1 객체의 name 멤버 변수에 값 대입
x001.name="학생1" //2.변수에 있는 참조값을 통해 실제 객체에 접근, 해당 객체의 name 멤버 변수에 값 대입
. 키워드를 통해 참조값을 사용하여 객체에 접근한 다음에 원하는 작업을 하면 됌.
//1. 객체 값 읽기
System.out.println("이름:" + student1.name);
//2. 변수에 있는 참조값을 통해 실제 객체에 접근하고, name 멤버 변수에 접근한다.
System.out.println("이름:" + x001.name);
//3. 객체의 멤버 변수의 값을 읽어옴
System.out.println("이름:" + "학생1");
클래스는 객체를 생성하기 위한 설계도, 틀이다!
객체가 가져야 할 속성(변수)와 기능(메서드)를 정의한다.
객체는 클래스에서 정의한 속성와 기능을 가진 실체, 객체는 독립적인 상태를 가진다.
student1은 학생 1의 속성을 가진 객체이고, student2는 학생2의 속서을 가지는 객체이다.
--> student1 과 student2 는 같은 클래스에서 만들어졌지만, 서로 다른 객체이다!
특정 클래스로부터 생성된 객체
인스턴스는 객체가 어떤 클래스에 속해힜는지 강조될 때 사용
--> student1 객체는 Studnet 클래스의 인스턴스다
배열을 사용하면, 특정 타입을 연속한 데이터 구조로 묶어서 편하게 관리할 수 있다.
Student 클래스를 사용한 변수들도 Student 타입이기 때문에 학생도 배열을 사용해서 하나의 데이터 구조로 묶어서 관리할 수 있다.
Student[] students = new Student[2];
student[0] = student1;
student[1] = student2;
Student를 클래스를 기반으로 student1, student2 인스턴스를 생성한다.
Student를 담을 수 있는 배열을 생성하고, 해당 배열에 student1, student2 인스턴스를 보관하자
Student[] students = new Student[2];

<배열에 객체 보관해보기>
students[0] = student1;
students[1] = student2;
//자바에서 대입은 항상 변수에 들어있는 값을 복사한다.
students[0] = x001;
students[1] = x002;
<배열에 참조값을 대입한 이후 최종 그림>

자바에서 변수의 대입(=)은 모든 변수에 들어있는 값을 복사해서 전달하는 것.
오른쪽 변수인 student1, student2에는 참조값이 들어있다. 그래서 이 값을 복사해서 왼쪽에 있는 배열에 전달한다. 따라서 기존 student1, student2에 들어있던 참조값은 당연히 유지가 된다.
배열에 들어있는 객체를 사용하려면 먼저 배열에 접근, 그 다음에 객체에 접근
System.out.println(students[0].name); //배열 접근 시작
System.out.println(x005[0].name); //[0]를 사용해서 x005 배열의 0번 요소에 접근
System.out.println(x001.name); //.(dot)을 사용해서 참조값으로 객체에 접근
System.out.println("학생1");

Student [] students = {student1, student2};
for(int i = 0; i < students.lengh; i++){
System.out.println("이름: "+ students[i].name + " 나이:" + students[i].age + " 성적:" + students[i].grade);
Student [] students = new Student[](student1, student2);
Student [] students = {student1, student2};
로 더욱 최적화 할 수 있다!
배열을 사용한 덕분에 for 문을 사용해서 반복 작업을 깔끔하게 처리할 수 있다!
for(int i = 0; i < students.length; i++){
System.out.println("이름:" + students[i].name + " 나이:" + students[i].age
<for문 - 반복 요소를 변수에 담아서 처리하기>
for (int i = 0; i < students.length; i++){
Student s = students[i];
System.out.println("이름 :" + s.name + " 나이:" + s.age + ...);
for( Student s : students){System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
}