클래스가 필요한 이유
문제: 학생 정보 출력 프로그램 만들어보기
요구사항:
- 1. 첫 번째 학생의 이름은 "학생1", 나이는 15, 성적은 90입니다.
- 2. 두 번째 학생의 이름은 "학생2", 나이는 16, 성적은 80입니다.
- 3. 각 학생의 정보를 다음과 같은 형식으로 출력해야 합니다: "이름: [이름] 나이: [나이] 성적: [성적]"
- 4. 변수를 사용해서 학생 정보를 저장하고 변수를 사용해서 학생 정보를 출력해야 합니다
변수사용
package class1;
public class ClassStart1 {
public static void main(String[] args) {
String student1Name = "학생1";
int student1Age = 15;
int student1Grade = 90;
String student2Name = "학생2";
int student2Age = 16;
int student2Grade = 80;
System.out.println("이름:" + student1Name + " 나이:" + student1Age + " 성적:" + student1Grade);
System.out.println("이름:" + student2Name + " 나이:" + student2Age + " 성적:" + student2Grade);
}
}
해당코드는 학생 2명을 다뤄야 하기 때문에 각각 다른 변수 사용. 이 코드의 문제는 학생이 늘어날 때 마다 변수를 추가로 선언해야하고, 출력코드도 추가해야한다.
배열사용
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]);
}
}
}
배열을 사용하여 학생이 추가되어도 배열에 학생 데이터만 추가하면 된다. 이제 변수를 더 추가하지 않아도 되고,
출력 부분의 코드도 그대로 유지할 수 있다.
배열사용의 한계
예를 들어 학생2를 제거한다고 했을때 한 학생의 데이터가 3개의 배열에 나누어져 있기 때문에 3개의 배열을 변경해야 한다. 그리고 한 학생 데이터를 관리하기 위해 3개의 배열 인덱스 순서를 정확하게 맞춰야한다.
이렇게 하면 특정 학생의 데이터를 변경할 때 실수할 가능성이 높다.
컴퓨터가 볼때는 문제가 없지만 , 사람이 관리하기에는 좋은 코드가 아니다.
관리하기 좋은 방식은 학생이라는 개념을 하나로 묶는것이다. 그리고 학생별로 본인의 이름,나이,성적을 관리하는것이다.
클래스도입
클래스를 사용해서 학생이라는 개념을 만들고, 각각 학생별로 본인의 이름, 나이, 성적을 관리해보자
package class1;
public class Student {
String name;
int age;
int grade;
}
class 키워드를 사용해서 학생 클래스( Student )를 정의한다. 학생 클래스는 내부에 이름( name ), 나이( age ), 성 적( grade ) 변수를 가진다.
클래스에 정의한 변수들을 멤버 변수, 또는 필드라 한다.
클래스 사용
package class1;
public class ClassStart3 {
public static void main(String[] args) {
Student student1;
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.name + " 나이:" + student1.age + " 성
적:" + student1.grade);
System.out.println("이름:" + student2.name + " 나이:" + student2.age + " 성
적:" + student2.grade);
}
}
실행 결과
이름:학생1 나이:15 성적:90
이름:학생2 나이:16 성적:80
클래스와 사용자 정의 타입
- 타입은 데이터의 종류나 형태를 나타낸다.
- 클래스를 사용하면 int(정수타입), String(문자타입)과 같은 타입을 직접 만들수있다.
- 사용자 정의 타입을 만들려면 설계도가 필요하는데 이 설계도가 바로 클래스 이다.
- 설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다.
- 클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 마음껏 정의 가능
여기서는 학생(Student)클래스를 기반으로 학생1(studeunt1), 학생2(student2) 객체 또는 인스턴스를 만들었다.
코드분석
1.변수선언
Student student1 //Student 변수선언
- Student타입을 받을 수 있는 변수를 선언한다.
- int 는 정수를, String 은 문자를 담을 수 있듯이 Student 는 Student 타입의 객체(인스턴스)를 받을 수 있다.
2.객체 생성
student1 = new Student() // Student 인스턴스 생성
- 객체를 사용하려면 설계도인 클래스를 기반으로 객체(인스턴스)를 생성해야 한다.
- new Student(): new Student()는 Student클래스 정보를 기반으로 새로운 객체를 생성하라는 뜻이다.
이렇게 하면 메모리에 실제 Student객체를 생성한다. - 객체를 생성할 때는 new 클래스명() 사용
3.참조값 보관
- 객체를 생성하면 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)(x001)을 반환한다.
- 예시로 x001을 참조값으로 표시
- new 키워드를 객체가 생성되고 나면 참조값을 반환하고, 앞서 선언한 변수인 student1에 생성된 객체의 참조값 보관
- student1 변수는 객체에 접근할 수 있는 참조값을 가지고 있다. 그래서 해당 변수를 통해 메모리에 있는 실제 객체에 접근하고 사용할 수 있다.
참조값을 변수에 보관해야 하는 이유
new Student()코드에는 이름이 없다. 그냥 메모리에 실제 객체를 만드는것이다. 따라서 객체를 생성할때 반환되는 참조값을 보관해두어야 저장된 참조값을 통해서 메모리에 존재하는 객체에 접근할 수 있다.
객체 사용
객체를 사용할면 메모리에 존재하는 객체에 접근을 해야하는데, .(점,dot)을 사용하면 된다.
//객체 값 대입
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
//객체 값 사용
System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" +
student1.grade);
객체에 값 대입
student1.name="학생1" //1. student1 객체의 name 멤버 변수에 값 대입
x001.name="학생1" //2.변수에 있는 참조값을 통해 실제 객체에 접근, 해당 객체의 name 멤버 변수에 값
대
객체 값 읽기
//1. 객체 값 읽기
System.out.println("이름:" + student1.name);
//2. 변수에 있는 참조값을 통해 실제 객체에 접근하고, name 멤버 변수에 접근한다.
System.out.println("이름:" + x001.name);
//3. 객체의 멤버 변수의 값을 읽어옴
System.out.println("이름:" + "학생1");
클래스, 객체, 인스턴스 정리
클래스- class
클래스는 객체를 생성하기 위한 틀 또는 설계도 이다. 클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다.
- 틀: 클래스를 붕어빵 틀을 생각하면 되는데, 붕어빵 틀은 붕어빵이 아니다. 클래스인 붕어빵틀을 통해서 만든 팥 붕어빵을 객체 또는 인스턴스라 한다.
- 설계도: 설계도는 실제존재하는 것이 아니라 개념으로만 있는 것이다. 설계도를 통해 생산한 차를 객체 또는 인스턴스라 한다.
객체 - Object
객체는 클래스에서 정의한 속성과 기능을 가진 실체이다. 객체는 서로 독립적인 상태를 가진다.
예를 들어 위에 student1과 student2는 같은 클래스에서 만들어졌지만, 서로 다른 객체이다.
인스턴스
인스턴스는 특정 클래스로부터 생성된 객체를 의미한다. 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때
사용한다. 예를들어 student1 객체는 Student 클래스의 인스턴스다.
배열 도입
package class1;
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문 적용
for (int i = 0; i < students.length; i++) {
System.out.println("이름:" + students[i].name + " 나이:" +
students[i].age + " 성적:" + students[i].grade);
}
}
}
배열을 사용하면 특정 타입의 데이터 구조로 묶어서 편리하게 관리할 수 있다.
그래서 배열을 사용하면 새로운 학생이 추가될 때 마다 출력하는 부분도 해결된다.
'코딩' 카테고리의 다른 글
[ Java ] 실전자바-기본편 3.객체 지향 프로그래밍 (1) | 2024.02.11 |
---|---|
[ Java ] 실전자바-기본편 2. 기본형과 참조형 (1) | 2024.02.10 |
[ Java ] 자바-입문 8.배열 (1) | 2024.02.07 |
[ Java ] 자바-입문 7.Scanner (0) | 2024.02.06 |
[ Java ] 자바-입문 6. 스코프,형변환 (0) | 2024.02.05 |