Studying/JAVA

[JAVA]_Class and Data (클래스와 데이터)

mh030128 2024. 12. 23. 15:43

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