이 글은 Inflearn 강의 중 김영한님의 김영한의 실전 자바 - 기본편 을 감상하며 작성하였습니다.
public class Student {
String name;
int age;
int grade;
}
클래스는 어떤 개념을 하나로 묶는 것이다.
학생 이라는 개념의 클래스는 이름 나이 성적 을 포함할 수 있다.
클래스의 작명은 대문자로 시작하여 낙타표기법(Camelcase)을 사용한다.
여기에서 이름, 나이, 성적에 해당하는 name, age, grade 는 멤버변수(Member Variable) 라고 한다.
클래스는 int String 과 같은 타입을 만드는 것. 즉, 사용자 정의 타입 이라고 볼 수 있다.
클래스는 사용자 정의 타입을 만들기위한 설계도 이다.
이 설계도를 활용하여 메모리에 만들어진 '것' 을 객체 또는 인스턴스 라고 한다.
JAVA 는 클래스를 객체화 또는 인스턴스화 할 때 new 키워드를 사용한다.
Student student1 = new Student();
//이제 Student 객체가 student1 이라는 이름으로 메모리에 인스턴스화 되었다.
아래는 그림은 클래스가 인스턴스화 되는 과정이다.

Student 타입의 변수 student1 을 출력 해보면 new 키워드를 사용하여 생성된 Student 인스턴스의 주소가 들어가 있다.
System.out.println(student1); //결과: class1.Student@2f4d3709
위 결과에서 class1 은 패키지 이름이고 Student 는 Class 명, 2f4d3709 는 참조값(메모리주소) 이다.
student2 라는 이름으로 Student 클래스를 인스턴스화 하면 또 다른 메모리공간에 Student 인스턴스가 생성되고 student2 에는 새로 생성된 Student 인스턴스의 메모리 주소가 들어가게 된다
Student student1 = new Student();
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
생성된 객체의 멤버변수에 접근하기 위해 . 을 사용한다. . 은 student1 에 저장된 참조값(메모리주소)에 접근한다.
위 코드는 student1에 저장되어있는 메모리주소에 생성된 Student 인스턴스의 멤버변수에 값을 저장한다.
아래처럼 사용하면 해당 값을 출력할 수 있다.
System.out.println(student1.name);
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 = new Student[2];
students[0] = student1;
students[1] = student2;
배열(Array)는 같은 타입의 연속된 변수를 저장할 수 있는 공간이다.
클래스는 사용자 정의 타입을 만들기 위한 설계도 라고 했다.
배열에 연속된 사용자 정의 타입을 저장할 수 있다.
위 코드는 Student 클래스를 객체화하고 객체의 참조값(메모리변수)를 저장한 student1,2 변수를 students 배열에 저장하는 코드이다.
위 코드의 메모리구조를 도식화하면 아래와 같다.

이를 증명하기 위해 메모리 주소를 출력해 보자.
System.out.println("students:" + students);
System.out.println("students[0]:" + students[0]);
System.out.println("students[1]:" + students[1]);
System.out.println("student1:" + student1);
System.out.println("student2:" + student2);
/* 결과
students:[Lclass1.Student;@2f4d3709
students[0]:class1.Student@7291c18f
students[1]:class1.Student@34a245ab
student1:class1.Student@7291c18f
student2:class1.Student@34a245ab
*/
students 의 출력값 [Lclass1.Student;@2f4d3709 에서 [L 은 배열을 나타낸다.
이제 배열을 활용하여 객체에 접근하여 편하게 객체의 멤버변수의 데이터를 출력할 수 있다.
//for문
for(int i=0; i<students.length; i++){
System.out.println(students[i].name);
System.out.println(students[i].age);
System.out.println(students[i].grade);
}
//향상된 for문
for (Student item: students) {
System.out.println(item.name);
System.out.println(item.age);
System.out.println(item.grade);
}