(개인공부) - Java (class)

짜스의 하루 ·2024년 1월 26일

클래스가 필요한 이유

자바는 클래스와 객체로 이루어져 있어서, 그만큼 중요하다!

문제) 학생 정보 출력하는 프로그램 만들기
요구 사항:
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개의 배열에 나눠져 있음. 따라서 데이터를 변경할 때에, 각 배열마다 요소를 정확하게 찾아서 제거해주어야 한다.

즉, 이름, 나이, 성적을 따로 나누어서 관리하는 것은 사람이 관리하기 좋은 방식은 아님
--> 사람이 관리하기 좋은 방식은 학생이라는 개념을 하나로 묶는 것, 그리고 각각의 학생 별로 본인의 이름, 나이, 서적을 관리하는 것


클래스의 도입

  • class 키워드를 사용해서 학생 클래스 (Student)를 정의한다.
  • 학생 클래스는 내부에 이름(name), 나이(age), 성적(grade) 변수를 가지고 있다!
  • 클래스는 대문자로 시작하고, 낙타 표기법을 사용한다!

<학생 클래스를 사용하는 코드 작성>

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);
}

클래스와 사용자 정의 타입

  • 타입은 데이터의 종류나 형태를 나타낸다
  • int는 정수 타입, String은 문자 타입이니, 학생(Student)라는 타입을 만들면 되지 않을까?
    --> 클래스를 사용하면, int String과 같은 타입을 직접 만들 수 있음!
  • 사용자가 직접 정의하는 사용자 정의 타입을 만들려면 설계도가 있어야 함
    설계도 --> class
  • class를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라고 함.

클래스, 객체, 인스턴스

클래스 : 설계도
객체: 설계도를 기반으로 실제 메모리에 만들어진 실체

  • Student 클래스를 기반으로 student1, student2 객체 또는 인스턴스를 만들었음.
  1. 변수 선언

    Student student1

  • Student 타입을 받을 수 있는 변수 선언
  • Student는 Student 타입의 객체를 받을 수 있음.
  1. 객체 생성

    student1 = new Student()

  • 객체를 사용하려면, 먼저 설계도인 클래스를 기반으로 객체를 생성해야 함.
  • new Stuent() : new는 새로 생성한다는 뜻 즉, Student 클래스를 기반으로 새로운 객체를 생성하라는 뜻!
  • 객체를 생성할 때에는 new 클래스명()을 사용하면 된다 !
  • Student 클래스는 String name , int age , int grade 멤버 변수를 가지고 있다. 이 변수를 사용하는데 필요한 메모리 공간도 함께 확보한다.
  1. 참조값 보관

    student1 = x001;

  • 객체를 생서하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)를 반환
  • new 키워드를 통해 객체가 생성되고 나면, 참조값을 반환
  • 앞서 선언한 변수인 Student stuent1에 생성된 객체의 참조값(x001)을 보관함
  • Student student1 변수는 이제 메모리에 존재하는 실제 Student 객체(인스턴스)의 참조값을 가지고 있다.

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)에 값을 대입하려면 먼저 객체에 접근해야 한다.

  • 객체에 접근하려면 .(점, dot)키워드를 사용하면 된다. 이 키워드는 변수 (student1)에 들어있는 참조값을 읽어서 메모리에
    존재하는 객체에 접근한다.

student1.name="학생1" //1. student1 객체의 name 멤버 변수에 값 대입
x001.name="학생1" //2.변수에 있는 참조값을 통해 실제 객체에 접근, 해당 객체의 name 멤버 변수에 값 대입

  • student1. 이라고 하면 student1 변수가 가지고 있는 참조값을 통해 실제 객체에 접근한다.
  • student1은 x001이라는 참조값을 가지고 있으므로 x001위치에 있는 Student 객체에 접근한다.
  • x001.name = "학생1" : x001 객체가 있는 곳의 name 멤버 변수에 "학생 1" 데이터가 저장된다.

객체 값 읽기

. 키워드를 통해 참조값을 사용하여 객체에 접근한 다음에 원하는 작업을 하면 됌.

//1. 객체 값 읽기
System.out.println("이름:" + student1.name);
//2. 변수에 있는 참조값을 통해 실제 객체에 접근하고, name 멤버 변수에 접근한다.
System.out.println("이름:" + x001.name);
//3. 객체의 멤버 변수의 값을 읽어옴
System.out.println("이름:" + "학생1");

  • 즉, x001에 있는 student 인스턴스의 name멤버 변수는 "학생1"이라는 값을 가지고 있다. 이 값을 읽어서 사용!

클래스, 객체, 인스턴스 정리

클래스 - class

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

객체 - object

객체는 클래스에서 정의한 속성와 기능을 가진 실체, 객체는 독립적인 상태를 가진다.
student1은 학생 1의 속성을 가진 객체이고, student2는 학생2의 속서을 가지는 객체이다.
--> student1 과 student2 는 같은 클래스에서 만들어졌지만, 서로 다른 객체이다!

인스턴스 - instance

특정 클래스로부터 생성된 객체
인스턴스는 객체가 어떤 클래스에 속해힜는지 강조될 때 사용
--> 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];

  • Student 변수를 2개 보관할 수 있는 사이즈 2개의 배열을 만든다
  • Student 타입의 변수는 Student 인스턴스의 참조값을 보관한다. Student 배열의 각각의 항목도 Student 타입의 변수일 뿐이다. 따라서 참조값을 보관한다.

<배열에 객체 보관해보기>
students[0] = student1;
students[1] = student2;

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

자바에서 대입은 항상 변수에 들어있는 값을 복사한다!

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

<배열에 참조값을 대입한 이후 최종 그림>

자바에서 변수의 대입(=)은 모든 변수에 들어있는 값을 복사해서 전달하는 것.
오른쪽 변수인 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 문을 사용해서 반복 작업을 깔끔하게 처리할 수 있다!
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 문

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

profile
2024. 01. 02 ~ 백앤드 공부 시작, 2024. 04.01 ~ 프론트 공부 시작

0개의 댓글