[JAVA]_Class and Data (클래스와 데이터)
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);
}
}
[ClassStart1]
○ 요구사항 ○
- 첫 번째 학생의 이름은 "학생 1", 나이는 15, 성적은 90입니다.
- 두 번째 학생의 이름은 "학생 2", 나이는 16, 성적은 80입니다.
- 각 학생의 정보를 다음과 같은 형식으로 출력해야 합니다. "이름 : [이름], 나이 : [나이], 성적 : [성적]"
- 변수를 사용해서 학생 정보를 저장하고 변수를 사용해서 학생 정보를 출력해야 한다.
○ 예시출력 ○
- 이름 : 학생1, 나이 : 15, 성적 : 90
- 이름 : 학생2, 나이 : 16, 성적 : 80
학생 2명을 다루려면 각각 다른 변수를 사용해야 함.
이 코드의 문제는 학생이 늘어날 때마다 변수를 추가로 선언해야 하고, 또 출력하는 코드도 추가해야 함.
package class1;
public class ClassStart2 {
public static void main(String[] args) {
String[] studentName = {"학생1", "학생2"};
int[] studentAge = {15, 16};
int[] studentGrade = {90, 80};
for(int i = 0; i < studentName.length; i++) {
System.out.println("이름 : " + studentName[i] + ", 나이 : " + studentAge[i] + ", 성적 : " + studentGrade[i]);
}
}
}
[ClassStart2]
이전 문제에 배열을 사용한 방법.
하지만 여기에서도 문제가 발생함.
예를 들어 학생 수가 많아지고, 학생 한 명의 데이터를 제거할 때 그 학생의 요소를 정확하게 찾아서 제거하지 않으면 다른 학생의 요소가 제거되어 정확성이 떨어지고 문제가 생길 수 있음.
package class1;
public class Student {
// 멤버변수(=필드)
String name;
int age;
int grade;
}
package class1;
public class ClassStart3 {
public static void main(String[] args) {
Student student1 = new Student();
student1.name = "학생1";
student1.age = 18;
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);
}
}
[Student, ClassStart3]
클래스를 사용해서 학생이라는 개념을 만들고, 각각의 학생 별로 본인의 이름, 나이, 성적을 관리함.
* 클래스와 사용자 정의 타입 *
- 타입은 데이터의 종류나 형태를 나타냄. (int는 정수타입, String은 문자타입 등)
- 사용자가 직접 정의하는 사용자 정의 타입을 만드려면 설계도가 필요한데, 이 설계도가 바로 클래스.
- 설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라고 함.
- 클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 마음껏 정의할 수 있음.
* 코드 설명 *
- Student student1 : Student 타입을 받을 수 있는 변수 student1 선언. int, String처럼 Student는 Student 타입의 객체를 받을 수 있음.
- student1 = new Student() : Student 인스턴스 생성.
- new는 새로 생성한다는 뜻으로, Student 클래스 정보를 기반으로 새로운 객체 생성. 메모리에 실제 Student 객체(인스턴스) 생성.
- 객체 생성하면 자바는 메모리 어딘가에 있는 이 객체에 접근할 수 있는 참조값(주소)을 반환.
- 즉 new 키워드 통해 객체 생성 후 참조값 반환.
- 클래스를 통해 생성한 객체를 사용하려면 먼저 메모리에 존재하는 객체에 접근해야 함.
- 객체에 접근하려면 .(점, dot)을 사용해야 함.
- student1.name = "학생1";
클래스는 관례상 대문자로 시작하고, 낙타 표기법을 사용.
* 용어정리 *
- 멤버변수(Member Variable) : 이 변수들은 특정 클래스에 소속된 멤버이므로, 이렇게 부름.
- 필드(Field) : 데이터 항목을 가리키는 전통적인 용어. DB, 엑셀 등에서 데이터 각각의 항목을 부름.
- 클래스(Class) : 클래스는 객체 생성하기 위한 '틀' 또는 '설계도'. 객체가 가져야 할 속성(변수)과 기능(메서드)을 정의.
- 객체(Object) : 클래스에서 정의한 속성과 기능을 가진 실체. 객체는 서로 독립적인 상태를 가짐.
- 인스턴스(Instance) : 특정 클래스로부터 생성된 객체를 의미.
객체와 인스턴스는 둘 다 클래스에서 나온 실체라는 의미에서 비슷하게 사용되지만,
용어상 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어.
즉 인스턴스는 특정 클래스와의 관계를 명확히 할 때 인스턴스라는 용어를 주로 사용.
하지만 둘 다 구분하지 않고 사용해도 됨.
package class1;
public class ClassStart4 {
public static void main(String[] args) {
Student student1 = new Student();
student1.name = "학생1";
student1.age = 18;
student1.grade = 90;
Student student2 = new Student();
student2.name = "학생2";
student2.age = 16;
student2.grade = 80;
Student[] students = new Student[2];
students[0] = student1;
students[1] = student2;
System.out.println("이름 : " + students[0].name + ", 나이 : " + students[0].age + ", 성적 : " + students[0].grade);
System.out.println("이름 : " + students[1].name + ", 나이 : " + students[1].age + ", 성적 : " + students[1].grade);
}
}
[ClassStart4]
자바에서 변수의 대입(=)은 모두 변수에 들어있는 값을 복사해서 전달하는 것.
변수에는 인스턴스 자체가 들어있는 것이 아님. 인스턴스의 위치를 가리키는 참조값이 들어있을 뿐. 따라서 대입(=)시에 인스턴스가 복사되는 것이 아닌 참조값만 복사됨.
배열에 들어있는 객체를 사용하려면 먼저 배열에 접근하고, 그 다음에 객체에 접근하면 됨.
package class1;
public class ClassStart5 {
public static void main(String[] args) {
Student student1 = new Student();
student1.name = "학생1";
student1.age = 18;
student1.grade = 90;
Student student2 = new Student();
student2.name = "학생2";
student2.age = 16;
student2.grade = 80;
Student[] students = {student1, student2};
// 방법1
for(int i = 0; i < students.length; i++) {
System.out.println("이름 : " + students[i].name + ", 나이 : " + students[i].age + ", 성적 : " + students[i].grade);
}
// 방법2
for(int i = 0; i < students.length; i++) {
Student s = students[i];
System.out.println("이름 : " + s.name + ", 나이 : " + s.age + ", 성적 : " + s.grade);
}
// 방법3 (향상된 for문) → 단축키 : iter
for(Student s : students) {
System.out.println("이름 : " + s.name + ", 나이 : " + s.age + ", 성적 : " + s.grade);
}
}
}
[ClassStart5]
배열 사용하면서 for문 도입.
사용하는 방법에도 3가지가 있듯이, 상황에 알맞은 방법을 적용해서 사용하면 됨.
1-1. 클래스와 변수 문제
[MovieReview, MovieReviewMain]
MovieReview 클래스는 다음과 같은 멤버 변수 포함
- 영화제목 (title)
- 리뷰내용 (review)
MovieReviewMain 클래스 안에 main() 메서드 포함하여, 영화 리뷰 정보를 선언하고 출력.
출력예시
영화 제목 : 인셉션, 리뷰 : 인생은 무한 루프
영화 제목 : 어바웃 타임, 리뷰 : 인생 시간 영화!
package class1.ex;
public class MovieReview {
String title;
String review;
}
package class1.ex;
public class MovieReviewMain {
public static void main(String[] args) {
MovieReview movieReview1 = new MovieReview();
movieReview1.title = "인셉션";
movieReview1.review = "인생은 무한 루프";
MovieReview movieReview2 = new MovieReview();
movieReview2.title = "어바웃 타임";
movieReview2.review = "인생 시간 영화!";
System.out.println("영화 제목 : " + movieReview1.title + ", 리뷰 : " + movieReview1.review);
System.out.println("영화 제목 : " + movieReview2.title + ", 리뷰 : " + movieReview2.review);
}
}
[MovieReviewMain2]
기존 문제에 배열 도입하고, 영화 리뷰 배열에 관리.
리뷰 출력 시 배열과 for문 사용하여 System.out.println을 한 번만 사용하기
package class1.ex;
public class MovieReviewMain2 {
public static void main(String[] args) {
MovieReview movieReview1 = new MovieReview();
movieReview1.title = "인셉션";
movieReview1.review = "인생은 무한 루프";
MovieReview movieReview2 = new MovieReview();
movieReview2.title = "어바웃 타임";
movieReview2.review = "인생 시간 영화!";
MovieReview[] movieReviews = {movieReview1, movieReview2};
for (MovieReview movieReview : movieReviews) {
System.out.println("영화 제목 : " + movieReview.title + ", 리뷰 : " + movieReview.review);
}
}
}
[ProductOrder, ProductOrderMain]
문제 설명 : 당신은 온라인 상점의 주문 관리 시스템을 만드려고 함. 먼저, 상품 주문 정보를 담을 수 있는 ProductOrder 클래스 생성
요구사항
1. ProductOrder 클래스는 다음과 같은 멤버 변수 포함
- 상품명 (productName)
- 가격 (price)
- 주문 수량 (quantity)
2. ProductOrderMain 클래스 안에 main() 메서드 포함하여 , 여러 상품의 주문 정보를 배열로 관리하고, 그 정보들을 출력하고 최종 결제 금액 계산하여 출력.
3. 출력 예시와 같도록 출력하면 됨.
출력예시
상품명 : 두부, 가격 : 2000, 수량 : 2
상품명 : 김치, 가격 : 5000, 수량 : 1
상품명 : 콜라, 가격 : 1500, 수량 : 2
총 결제 금액 : 12000
package class1.ex;
public class ProductOrder {
String productName;
int price;
int quantity;
}
package class1.ex;
public class ProductOrderMain {
public static void main(String[] args) {
ProductOrder[] productOrders = new ProductOrder[3];
ProductOrder order1 = new ProductOrder();
order1.productName = "두부";
order1.price = 2000;
order1.quantity = 2;
productOrders[0] = order1;
ProductOrder order2 = new ProductOrder();
order2.productName = "김치";
order2.price = 5000;
order2.quantity = 1;
productOrders[1] = order2;
ProductOrder order3 = new ProductOrder();
order3.productName = "콜라";
order3.price = 1500;
order3.quantity = 2;
productOrders[2] = order3;
int totalAmount = 0;
for (ProductOrder productOrder : productOrders) {
System.out.println("상품명 : " + productOrder.productName + ", 가격 : " + productOrder.price + ", 수량 : " + productOrder.quantity);
totalAmount += productOrder.price * productOrder.quantity;
}
System.out.println("총 결제 금액 : " + totalAmount);
}
}