클래스와 객체, 인스턴스
- 클래스 (Class)
클래스는 객체를 생성하기 위한 '설계도'이다. 클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다.
- 객체 (Object)
객체는 클래스에서 정의한 속성과 기능을 가진 실체이다. 객체는 서로 독립적인 상태를 가진다.
- 인스턴스 (Instance)
인스턴스는 특정 클래스로부터 생성된 객체를 의미한다. 객체와 인스턴스라는 용어가 자주 혼용되는데, 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용한다.
ex) student1 객체는 Student 클래스의 인스턴스다.
객체 vs 인스턴스
둘다 클래스에서 나온 실체라는 의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이다. 보통 ' student1은 Student 의 객체이다 ' 라고 말하는 대신 ' student1은 Student 의 인스턴스이다 ' 라고 특정 클래스와의 관계를 명확히 할 때 인스턴스라는 용어를 주로 사용한다.
※ 둘다 클래스에서 나온 실체라는 핵심 의미는 같기에 보통 둘을 구분하지 않고 사용한다
클래스는 왜 필요할까
요구 사항
- 첫 번째 학생의 이름은 "학생1", 나이는 15, 성적은 90입니다.
- 두 번째 학생의 이름은 "학생2", 나이는 16, 성적은 80입니다.
- 각 학생의 정보를 다음과 같은 형식으로 출력해야 합니다: "이름: [이름] 나이: [나이] 성적: [성적]"
- 변수를 사용해서 학생 정보를 저장하고 변수를 사용해서 학생 정보를 출력해야 합니다.
1. 변수사용
public class ClassStart1 {
public static void main(String[] args) {
String student1Name = "학생1";
int student1Age = 15;
int student1Grade = 90;
String student2Name = "학생1";
int student2Age = 16;
int student2Grade = 80;
System.out.println("이름 : " + student1Name + "나이 : " + student1Age + "성적 : " + student1Grade);
System.out.println("이름 : " + student2Name + "나이 : " + student2Age + "성적 : " + student2Grade);
}
}
학생의 수에 따라 각각 다른 변수를 사용했다. 이코드의 문제점은 학생이 늘어날 때마다 변수를 추가 선언해야 하고 출력하는 코드가 계속 추가된다.
2. 배열사용
public class ClassStart2 {
public static void main(String[] args) {
String[] studentNames = {"학생1", "학생2"};
int[] studentAges = {15, 16};
int[] studentGrade = {90, 80};
for (int i = 0; i < studentNames.length; i++) {
System.out.println("이름 : " + studentNames[i] + "나이 : " + studentAges[i] + "성적 : " + studentGrade[i]);
}
}
}
배열을 사용해서 데이터가 추가 될때 생기는 문제를 해결했다.
그러나 배열을 사용해서 코드 변경을 최소화했지만, 한 학생의 데이터를 변경할 때 그 학생의 데이터를 찾아서 제거해야한다. 특정 학생의 데이터를 변경할 때 실수할 가능성이 높다. (관리의 불편함)
3. 클래스도입
public class Student {
String name;
int age;
int grade;
}
public class ClassStart3 {
public static void main(String[] args) {
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;
System.out.println(student1);
System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" + student1.grade);
System.out.println("이름:" + student2.name + " 나이:" + student2.age + " 성적:" + student2.grade);
}
}
클래스를 사용해서 학생이라는 개념을 만들고 학생의 데이터를 관리한다.
4. 배열도입
public class ClassStart5 {
public static void main(String[] args) {
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[] {student1, student2};
for (int i = 0; i < students.length; i++) {
System.out.println("이름:" + students[i].name + " 나이:" + students[i].age + " 성적:" + students[i].grade);
}
// 최적화 1
for (int i = 0; i < students.length; i++) {
Student s = students[i];
System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
}
// 최적화 2
for (Student s : students) {
System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
}
}
}
배열을 사용해서 for문으로 출력하여 최적화할 수 있게 되었다.
코드 분석
1. 변수 선언
- Student student1
- Student 타입을 받을 수 있는 변수를 선언
- int는 정수, String은 문자를 담을 수 있듯이 Student는 Student 타입의 객체를 받을 수 있다
2. 객체 생성
- student1 = new Student()
- 객체 사용을 위해 클래스를 기반으로 객체를 생성해야한다
- new 키워드는 새로 생성한다는 뜻, 메모리에 실제 Student 객체를 생성한다
- Student 클래스의 멤버변수(name, age, grade)도 함께 메모리에 공간 확보를 한다
3. 참조값 보관
- 객체를 생성하면 자바는 메모리 어딘가에 있는 객체에 접근할 수 있는 참조값(주소)(x001)을 반환
- new 키워드를 통해 객체가 생성되면 참조값을 반환한다
- Student student1 변수는 메모리에 존재하는 Student 객체의 참조값을 가진다
※ 참조값을 변수에 보관하는 이유
객체를 생성하는 new Student() 코드 자체에는 아무런 이름이 없다. 단순히 Student 클래스를 기반으로 메모리에 실제 객체를 만드는 것이다. 따라서 생성한 객체에 접근할 수 있는 방법이 필요한데 이런 이유로 객체를 생성할 때 반환되는 참조값을 보관할 변수가 필요하다. 변수에 저장한 참조값을 통해서 실제 메모리에 존재하는 객체에 접근하는 것이다.
Student student1 = new Student(); //1. Student 객체 생성
Student student1 = x001; //2. new Student()의 결과로 x001 참조값 반환
student1 = x001; //3. 최종 결과
4. 객체 사용
//객체 값 대입
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
//객체 값 사용
System.out.println("이름:" + student1.name +
" 나이:" + student1.age + " 성적:" + student1.grade);
객체를 사용하려면 메모리에 존재하는 객체에 접근해야한다. 객체에 접근하는 방법은 점(dot)을 사용한다.
5. 배열에 참조값 대입
students[0] = student1;
students[1] = student2;
//자바에서 대입은 항상 변수에 들어 있는 값을 복사한다.
students[0] = x001;
students[1] = x002;
student1, 2에는 참조값이 보관되어 있다. 배열에 저장되는 값은 이 참조값이다.
※ 변수에는 인스턴스 자체가 들어있는 것이 아니라 인스턴스의 위치를 가리키는 참조값이 들어있다. 대입시에 인스턴스가 복사되는 것이 아니라 참조값만 복사된다
'강의내용정리 > Java' 카테고리의 다른 글
[Java] 생성자 (0) | 2025.01.20 |
---|---|
[Java] 객체 지향 프로그래밍 (0) | 2025.01.20 |
[Java] 기본형과 참조형 (0) | 2025.01.13 |