먼저 클래스가 없는 첫 번째 예제를 살펴볼게요:
package class1;
public class classStart1 {
public static void main(String[] args) {
String studentName = "학생1";
int studentAge = 15;
int studentGrade = 90;
String studentName2 = "학생1";
int studentAge2 = 16;
int studentGrade2 = 80;
System.out.println("이름:" + studentName + " 나이: " + studentAge + " 성적: " + studentGrade);
System.out.println("이름:" + studentName2 + " 나이: " + studentAge2 + " 성적: " + studentGrade2);
}
}
studentName3
, studentAge3
…)를 계속 만들어야 합니다. studentName100
, studentAge100
… 이름 짓기도 힘들고, 변수 생성해놓고 실수라도 하면 골치 아프겠죠.package class1;
public class classStart2 {
public static void main(String[] args) {
String[] studentNames = {"학생1", "학생2", "학생3", "학생4"};
int[] studentAge = {15, 16, 17, 18};
int[] studentGrade = {90, 80, 70, 60};
for(int i = 0; i < studentNames.length; i++) {
System.out.println("이름:" + studentNames[i] + " 나이: " + studentAge[i] + " 성적: " + studentGrade[i]);
}
}
}
studentNames
, studentAge
, studentGrade
세 가지 배열을 따로 관리해야 해요. 자, 이제 클래스를 도입해봅시다!
package class1;
public class Student {
String name;
int age;
int grade;
}
Student
라는 클래스는 말 그대로 ‘학생’이라는 개념을 코드로 표현(모델링)한 겁니다. package class1;
public class ClassStart3 {
public static void main(String[] args) {
Student student1;
student1 = new Student();
student1.name = "학생1";
student1.age = 18;
student1.grade = 90;
Student student2 = new Student();
student2.name = "학생2";
student2.age = 16;
student2.grade = 80;
System.out.println("이름: " + student1.name + " 나이: " + student1.age + " 성적: " + student1.grade);
System.out.println("이름: " + student2.name + " 나이: " + student2.age + " 성적: " + student2.grade);
}
}
한 덩어리로 묶인 데이터
student1
객체에는 name
, age
, grade
가 모두 들어있습니다. major
, studentId
)가 필요해져도, Student
클래스에 필드를 추가만 해주면 됩니다.확장성 증가
Student
클래스에 해당 메서드를 넣으면 됩니다. public void takeExam() { … }
코드의 가독성
유지보수에 유리
Student
를 생성해서 사용하면 됩니다. name
, age
, grade
)을 공유하니까 어디서든 간단하게 new Student()
로 만들 수 있습니다.Student
클래스를 다른 프로젝트나 다른 부분에서도 재사용 가능. Student
는 실제 “학생”이라는 현실 개념을 코드로 추상화한 것. 한마디로
클래스는 “코드를 효율적으로 조직하고, 유지보수성을 높이고, 재사용까지 가능한 멋진 방법”을 제공하는 기초 중의 기초입니다!
코드를 짤 때마다 “이건 어떤 클래스(객체)로 나타낼 수 있을까?”를 고민해보는 습관을 들이면, 어느 순간 더 이상 엉켜있는 배열과 변수들로 고생하지 않게 될 거예요.
자바에서는 “변수에 들어있는 값을 복사해서 전달한다”라는 말이 자주 등장합니다. 이게 무슨 의미인지 간단히 살펴봅시다.
기본형(Primitive type) 변수
예: int
, double
, boolean
등
→ 실제 숫자(값)나 논리값이 변수 안에 직접 저장됩니다.
참조형(Reference type) 변수
예: String
, Student
, Array
등 (클래스로 만든 모든 객체 포함)
→ 객체 그 자체가 아니라, “객체가 메모리에 위치한 주소(참조)”를 참조하는 값이 저장됩니다.
Student student1 = new Student();
위 코드에서 student1
은 “Student 객체에 대한 참조값”을 갖고 있습니다.
만약
Student student2 = student1;
라고 하면, student1
이 갖고 있던 “참조값”을 student2
에 복사해서 전달합니다. 결국 student1
과 student2
는 같은 객체를 가리키게 되죠.
int a = 10; int b = a;
라면, a
안의 정수 10이 b
로 복사될 뿐입니다.package class1;
public class ClassStart5 {
public static void main(String[] args) {
Student student1 = new Student();
student1.name = "학생1";
student1.age = 18;
student1.grade = 90;
Student student2 = new Student();
student2.name = "학생2";
student2.age = 16;
student2.grade = 80;
Student[] students = {student1, student2};
// 첫 번째 방법: 일반 for문
/*
for(int i = 0; i < students.length; i++) {
System.out.println("이름: " + students[i].name +
" 나이: " + students[i].age +
" 성적: " + students[i].grade);
}
*/
// 두 번째 방법: 일반 for문에서 임시 변수 사용
/*
for(int i = 0; i < students.length; i++) {
Student s = students[i];
System.out.println("이름: " + s.name +
" 나이: " + s.age +
" 성적: " + s.grade);
}
*/
// 세 번째 방법: 향상된 for문
for (Student s : students) {
System.out.println("이름: " + s.name +
" 나이: " + s.age +
" 성적: " + s.grade);
}
}
}
student1
, student2
를 생성하고, 각각의 필드를 초기화합니다. students
라는 Student
배열에 student1
, student2
의 참조를 담습니다. Student[] students = {student1, student2};
Student
객체를 직접 담고 있는 게 아니라, 객체의 참조값을 담고 있어요.for (Student s : students)
구문에서 s
는 배열 students
의 각 요소(참조값)을 복사받아 사용합니다. students[0]
안에는 student1
의 참조값이, students[1]
안에는 student2
의 참조값이 들어있습니다. s
가 students[i]
의 참조값을 받아서 실제 객체(student1
혹은 student2
)에 접근하게 되죠.System.out.println(...)
을 통해 각 학생의 정보를 출력합니다.전통적인 for문
for(int i = 0; i < students.length; i++) {
System.out.println(students[i].name);
}
i
의 범위를 지정해야 합니다.전통적인 for문 + 임시 변수 사용
for(int i = 0; i < students.length; i++) {
Student s = students[i];
System.out.println(s.name);
}
students[i]
를 매번 타이핑할 필요 없이, 한 번 Student s
로 받아서 사용합니다.향상된 for문(Enhanced for)
for (Student s : students) {
System.out.println(s.name);
}
Student[] students
)에 객체를 넣었을 때도, 실제로는 배열이 객체의 주소들을 저장한다. for
혹은 향상된 for
)을 통해 배열 요소에 접근할 때도, 결국 참조값을 가져와서 실제 객체에 접근하는 구조다.한 줄 정리:
자바에서 “= 연산자(대입)”가 일어날 때는 항상 변수에 들어있는 ‘값’을 복사해 간다.
- 기본형이면 ‘실제 값(숫자, 논리값 등)’이 복사되고,
- 참조형이면 ‘객체의 주소(참조값)’가 복사된다.
이 개념을 이해하면, 자바에서 객체를 다룰 때 “내가 지금 새 객체를 만들었나?” “기존 객체에 대한 주소만 복사했나?”를 구분할 수 있게 되고, 예상치 못한 변경(예: “왜 학생1을 바꿨는데 학생2도 바뀌지?” 같은 오류)을 줄일 수 있습니다!