클래스가 필요한 이유
문제1:
학생 정보를 출력하는데, 변수를 사용하여 표출할 수 있어야 한다.
package Class;
public class Class1 {
public static void main(String[] args) {
String Students1Name = "학생1";
int student1Age = 15;
int student2grade = 85;
String students2Name = "학생2";
int students2Age = 30;
int students2grade = 90;
System.out.println("이름" + Students1Name + "나이" + student1Age);
}
}
이런식으로 학생을 추가할 때마다, 코드를 변경해야 한다.
해결하는 방법:
1. 배열을 사용해보자
package Class;
public class Class2 {
public static void main(String[] args) {
String[] StudentNames = {"학생1", "학생2" };
int [] StudentsAges = {15, 16};
int [] StudentGrades = {90, 80};
for (int i = 0; i < StudentNames.length; i++) {
System.out.println(StudentNames[i] + "나이" + StudentsAges[i] + "성적" + StudentGrades[i]);
}
/* String Students1Name = "학생1";
int student1Age = 15;
int student2grade = 85;
String students2Name = "학생2";
int students2Age = 30;
int students2grade = 90;
System.out.println("이름" + Students1Name + "나이" + student1Age);
}
}
*/
하지만 데이터를 변경하는 부분에서 불편함이 있다.
배열의 한계는 이름, 나이, 성적을 각각 따로 나누어서 관리하는 것이 어렵다.
그래서 클래스를 도입한다.
학생, 나이, 성적을 하나로 묶어서 사용하게 한다.
클래스 도입
1. 클래스 도입
package Class;
public class Class3 {
public class students {
//학생이라는 클래스를 만들고 클래스 내부의 이름 나이 성적 변수를 가진다.
String name;
int age;
int score;
}
}
- 맴버 변수: 이 변수들은 특정 클래스에 소속된 멤버이기 때문에 부른다
- 필드 : 데이터 항모을 가르키는 전통적인 용어
package Class;
public class Class3 {
public static void main(String[] args) {
Student student1;
student1 = new Student();
//학생을 실제 메모리에 넣는다
student1.name = "학생";
//클래스 만든 것을 . 을 이용해 접근한다.
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 );
}
}
위의 생성한 Students class을 통해 만들어졌다.
따로 타입을 지정안하고, 클래스를 사용하여 타입을 직접 지정한다. (int, String... 등등)
클래스는 사용자가 직접 정의하는 사용자 정의 타입을 만든 "설계도"이다.
클래스는 설계도이고, 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체, 또는 인스턴스라고 한다.
위에서 Student 클래스를 기반으로 학생1, 학생2 객체 또는 인스턴스를 만들었다.
student1 = new Student();
Student student2 = new Student();
이를 객체 또는 인스턴스라고 한다.
메모리에 확보해서 만든다.
위의 코드를 분석해보자
1. 변수 선언
a. Student student1
Student 타입을 받을 수 있는 변수를 선언한다.
int는 정수를 String은 문자를 담을 수 있듯이 student는 Student 타입의 객체를 받을 수 있다.
student1 = new Student();
Student student2 = new Student();
2.객체 생성
student1 = new Student()
객체를 사용할려면 먼저 설게도인 클래스를 기반으로 객체를 생성해야 한다.
new Student 의 new는 새로 생성한다는 것이다. 이는 Student 클래스 정보를 기반으로 새로운 객체를 생성하나느 뜻이다.
이럴 경우 실제 메모리에 Student 객체를 생성한다.
객체를 생성할 때는 new 클래스명()을 사용하면 된다. ()은 추가해야한다!
3. 참조값 보관
메모리에서 어느 부분에 만들어졌는지는 모르는데, 이를 알기 위해서 객체를 생성하면 참조 값을 반환한다.
위의 new 키워드를 통해 새로운 객체가 생성되고, 참조값을 반환한다.
실제 Student student1 변수는 Student 객체의 참조값을 가지고 있다. Student Class의 메모리 주소값을 가지고 있다.
참조값을 변수에 보관하는 이유
객체를 생성하는 new student()에는 아무런 이름이 없다. 이 코드는 단순하게 Student 클래스를 기반으로 메모리에 실제 객체(실제 메모리에 존재하는 실체)를 반드느 것이다. 따라서 생성한 객체에 접근하기 위해 참조 한다.
ex) Student student1 변수에 참조값 x001을 저장해두었으므로 저장한 참조값을 통해서 실제 메모리에 존채하는 객체에 접근할 수 있다.
Student student1 = new Student(); //1.Student 객체 생성
Student student1 = x001; //2. new Student()의 결과로 x001 참조값을 반환
student1 = x001; //3. 최종 결과
Student student2 도 new 로 생성했기 때문에, 또 다르게 메모리에 생성된다.
예시)
System.out.println(student1);
System.out.println(student2);
수행시 아래와 같이 반환한다.
Class.Student@133314b
Class.Student@b1bc7ed
'JAVA' 카테고리의 다른 글
[Java] 기본형 vs 참조형 (0) | 2024.10.19 |
---|---|
[Java] 1강- 문제 풀이 (3) | 2024.10.18 |
[Java] 객체 사용 및 클래스, 객체, 인스턴스 정리 (0) | 2024.10.16 |
[Java] Object 클래스 (4) | 2024.10.16 |
[JAVA] lang 패키지 (0) | 2024.10.15 |