Backend/Java

김영한의 실전 자바 기본 - 1. 클래스와 데이터

해로몬 2024. 5. 8. 17:09

[클래스]

📌클래스가 필요한 이유 

코드의 문제 : 학생이 늘어날 때 마다 변수를 추가로 선언, 출력하는 코드도 추가해야 함.

 

배열을 이용하여 해결할 수 있다!

but 사람이 관리하기에는 좋은 코드가 아님.

 

사람이 관리하기 좋은 방식은 학생이라는 개념으로 하나로 묶는 것.

그리고 각각 학생의 이름, 나이, 성적을 관리

 

public class Student {
    String name;
    int age;
    int grade;
}

클래스에 정의한 변수들을 멤버 변수 또는 필드라 한다.

-멤버변수 : 특정 클래스에 소속된 멤버

-필드 : 데이터 항목을 가리키는 전통적인 용어. ex) 데이터베이스, 엑셀 등에서 데이터 각각의 항목을 필드라 함.

+자바에서 멤버 변수, 필드는 같은 뜻. 클래스에 소속된 변수를 뜻함.

 

학생 인스턴스 2개

사용자가 직접 정의하는 사용자 정의 타입을 만들기 위해 설계도가 필요함.

설계도 = 클래스

클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 함.

 

1. 변수 선언

Student student1

Studen타입을 받을 수 있는 변수를 선언함.

 

2. 객체 생성

student1 = new Student() => Student 인스턴스 생성

string name
int age
int grade

Sutdent 인스턴스

 

3. 참조값 보관

참조값을 변수에 보관해야 하는 이유
객체를 생성하는 `new Student()` 코드 자체에는 아무런 이름이 없다. 이 코드는 단순히 `Student` 클래스를 기반으로 메모리에 실제 객체를 만드는 것이다. 따라서 생성한 객체에 접근할 수 있는 방법이 필요하다. 이런 이유로 객체를 생 성할 때 반환되는 참조값을 어딘가에 보관해두어야 한다

 

📌객체 사용

객체에 접근하려면 .(점,dot) 키워드를 사용.

student1 변수가 가지고 있는 참조값을 통해 실제 객체에 접근함.

student은 x001이라는 참조값을 가지고 있으므로 x001위치에 있는 Student 객체에 접근함.

⭐️정리⭐️

클래스 - class

클래스는 객체를 생성하기 위한 '' 또는 '설계도'이다. 클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다.

 

객체 -object

클래스에서 정의한 속성과 기능을 가진 실체. 서로 독립적인 상태

student1` 은 학생1의 속성을 가지는 객체이고, `student2` 는 학생2의 속성을 가지는 객체이 다. `student1` `student2` 는 같은 클래스에서 만들어졌지만, 서로 다른 객체이다.

 

인스턴스 - Instance

특정 클래스로부터 생성된 객체 의미.

인스턴스 는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용

예를 들어서 `student1` 객체는 `Student` 클래스의 인스턴스다. 라고 표현한다.

 

객체 vs 인스턴스

둘다 클래스에서 나온 실체라는 의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이다.

하지만 둘다 클래스에서 나온 실체라는 핵심 의미는 같기 때문에 보통 둘을 구분하지 않고 사용함.

 

[배열]

 

students[0] = student1;
 students[1] = student2;
 
//자바에서 대입은 항상 변수에 들어 있는 값을 복사한다. 
students[0] = x001;
students[1] = x002;

자바에서 대입은 항상 변수에 들어 있는 값을 복사함.⭐️

student1, `student2에는 참조값이 보관되어 있음.

따라서 이 참조값이 배열에 저장됨. 또는 `student1, `student2에 보관된 참조값을 읽고 복사해서 배열에 대입한다고 표현함.

자바에서 변수의 대입( `=` )은 모두 변수에 들어있는 값을 복사해서 전달하는 것.

⚠️주의⚠️

변수에는 인스턴스 자체가 들어 있는 것은 아님‼️

인스턴스의 위치를 가리키는 참조값이 들어 있을 뿐. 따라서 대입 시에는 인스턴스가 복사되는 것이 아니라 참조값만 복사됨.

 

배열 도입 - 리펙토링

📌배열 선언 최적화

일반적인 변수와 동일하게 배열을 생성할 때 포함할 수 있음.

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 + " 성적:" + 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문( Enhanced For Loop)

for(Student s : students){
    System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
}