일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- db
- 자바
- GPT3.5
- java
- chatGPTAPI
- 웹소켓연결끊김
- git
- 버킷생성
- 웹소켓재시작
- gitlab
- class
- nvmrc
- javascript
- 패키지설치에러
- ChatGPT
- 웹소켓연결
- 노드버전
- 호스팅영역
- gpt3.5turbo
- Github
- aws
- iam사용자
- 클라우드
- nodejs
- aiapi
- Database
- gptapi
- openaiapi
- 클래스
- Express
- Today
- Total
IT's Jenna
섹션 1. 클래스와 데이터 본문
목차
1. 클래스가 필요한 이유
2. 클래스 도입
3. 배열 도입
4. 리펙토링
1. 클래스가 필요한 이유
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);
}
}
//학생 하나를 추가하려면 변수 3개와 출력 한줄을 추가해야함
우리가 학생 정보를 저장하고 출력한다고 할 때, 정보는 이름과 나이, 성적이 필요하다고 하자.
각 학생마다 이름, 나이, 성적 변수를 각각 만들어서 데이터를 저장하고 출력해야 한다. 이때 학생 한 명이 추가된다면 변수를 3개를 다시 선언해줘야 한다. 이 번거로운 작업을 줄이기 위해서 우리는 배열을 사용할 수 있다.
package class1;
public class ClassStart2 {
public static void main(String[] args) {
String[] studentNames = {"학생1", "학생2", "학생3", "학생4"};
int[] studentAges = {15, 16, 17, 20};
int[] studentGrade = {90, 80, 70, 60};
for (int i = 0; i < studentNames.length; i++) {
System.out.println("이름:" + studentNames[i] + " 나이:" + studentAges[i] + " 성적:" + studentGrade[i]);
}
}
}
이름만 저장한 배열, 나이만 저장한 배열 그리고 성적만 저장한 배열을 선언하여 반복문으로 출력하는 방법이 있다.
첫 번째 방법처럼 매번 변수를 선언하거나 학생마다 출력을 추가할 필요는 없지만 한 학생의 데이터가 3개의 배열에 나눠져 있기 때문에 변경이 필요할 때마다 모든 배열을 수정해야 하고 순서를 맞춰줘야 해서 데이터를 수정하며 문제가 발생할 가능성이 높다.
따라서 데이터를 종류별로 묶는것보단 학생이란 하나의 개념 안에 이름, 나이, 성적을 함께 관리하는 것이 훨씬 효율적이다.
이러한 이유로 만들어진 학생이란 개념이 바로 클래스이다.
2. 클래스 도입
package jclass1;
public class Student {
String name;
int age;
int grade;
}
위와 같이 Student 클래스를 정의할 수 있다.
- 클래스는 관례상 대문자로 시작하며 카멜표기법을 사용한다.
- 클래스안에 정의된 변수(클래스의 속성)는 멤버 변수 혹은 필드라고 부른다.
- 변수는 일반적으로 소문자로 시작한다.
package class1;
public class ClassStart3 {
//psvm 입력하면 main 함수 자동으로 생성
public static void main(String[] args) {
Student student1;
student1 = new Student(); //x001
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
Student student2 = new Student(); //x002
student2.name = "학생2";
student2.age = 16;
student2.grade = 80;
System.out.println(student1); //참조값 출력 : x001
System.out.println(student2); //x002
System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" + student1.grade);
System.out.println("이름:" + student2.name + " 나이:" + student2.age + " 성적:" + student2.grade);
}
}
- Student student1 : 변수선언 int num1처럼 Student 타입의 변수를 선언하는 것
- new Student()
- Student 클래스를 기반으로 학생(객체 또는 인스턴스)이 메모리에 만들어짐
- 내부 멤버 변수의 공간도 메모리에 함께 할당됨
- new Student() 코드는 메모리에 객체를 생성하는 동작일 뿐 어떠한 이름도 가지고 있지 않다
- 따라서 객체가 생상되면 해당 객체가 저장된 메모리의 참조값(주소값 - ex. x001)이 반환되어 student1에 저장된다
- new Student()로 생성된 객체를 찾으려면 이 참조값(주소값)이 필요하다
- Student student2 = new Student()
- 새로운 학생 클래스를 메모리에 생성하여 또 다른 객체를 생성한다
- student2는 새로운 참조값(ex. x002)을 가진다
클래스는 int(정수타입), string(문자타입)처럼 새로운 타입을 정의하는 것이다. 학생이라는 사용자 정의 타입을 만들 때 이 타입의 설계도가 클래스이다.(붕어빵틀) 이 설계도를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라고 한다. (붕어빵)
객체와 인스턴스는 보통 혼용되어 쓰이지만 인스턴스는 주로 객체가 어떤 클래스에 속해있는지 그 관계성을 강조할때 사용된다. 예로 student1 객체는 Student 클래스의 인스턴스이다.
3. 배열 도입
package class1;
public class ClassStart4 {
public static void main(String[] args) {
Student student1 = new Student(); //x001
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
Student student2 = new Student(); //x002
student2.name = "학생2";
student2.age = 16;
student2.grade = 80;
Student[] students = new Student[2]; //x005
students[0] = student1; //[x001, null]
students[1] = student2; //[x001, x002]
System.out.println("이름:" + students[0].name + " 나이:" + students[0].age + " 성적:" + students[0].grade);
System.out.println("이름:" + students[1].name + " 나이:" + students[1].age + " 성적:" + students[1].grade);
}
}
- Student[] students = new Student[2]
- int[] numbers로 정수 배열을 선언하는 것처럼 클래스 배열을 선언할 수 있다
- 배열도 메모리에 생성된 것이다(ex. x005)
- 배열만 선언됐을 뿐 각 배열의 값은 선언되지 않았으므로 [null, null]로 초기화된다
Student 타입의 변수에 인스턴스의 참조값이 보관되는 것처럼 배열에도 인스턴스가 아닌 인스턴스의 참조값이 대입된다.
Students 배열의 항목은 Student 타입의 변수 즉 Student 타입의 참조값이 들어간다.
java에서 대입은 항상 변수의 값을 복사한다.
- students[0] = student1 : 참조값이 복사되어 들어간다.
students[0]에는 실제 인스턴스가 들어있는 것이 아니라 참조값(주소값)만 복사되어 들어있다.
결국 인스턴스는 하나고 그 인스턴스에 접근할 수 있는 경로만 2개가 생긴 것이다.
4. 리펙토링
package jclass1;
//배열도입
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}; //배열에 객체 바로 선언
// Student[] students = {student1, student2}; 이렇게 선언도 가능
for (int i=0; i<students.length; i++){
System.out.println("이름:"+students[i].name+"나이:"+students[i].age+"성적:"+students[i].grade);
}
for (int i=0; i<students.length; i++){
Student s = students[i];
System.out.println("이름:"+s.name+"나이:"+s.age+"성적:"+s.grade);
}
//iter : 단축키
for (Student s : students){
System.out.println("이름:"+s.name+"나이:"+s.age+"성적:"+s.grade);
}
}
}
배열로 선언한 덕분에 for문을 돌려서 간편하게 출력할 수 있게 되었다.
Student s : students 같이 for문 최적화도 가능하다.
'Study > 김영한의 실전 자바 - 기본편' 카테고리의 다른 글
섹션 2. 기본형과 참조형 (0) | 2024.02.04 |
---|