2.1.Java - 클래스와 데이터

sein lee·2024년 4월 9일
0

java-study

목록 보기
9/12
post-custom-banner

프로젝트 환경 구성

클래스가 필요한 이유

<ClassStart1.java>

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

=> 학생이 늘어날 때 마다 변수를 추가로 선언해야하고, 출력코드 또한 추가해야한다.

<ClassStart2.java>

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

=> 배열을 활용, 배열에 학생의 데이터만 추가하면 된다.
=> 배열의 한계 : 한 학생의 데이터를 지우기 위해 3개의 배열의 인덱스를 맞춰줘야한다.

학생이라는 개념을 하나로 묶고, 각각의 학생 별로 본인의 이름, 나이, 성적을 관리하자!

클래스 도입

<Student 클래스>
<Student.java>

package class1;

public class Student {
    String name;
    int age;
    int grade;
}

=> class 키워드를 사용해서 학생클래스(Student)를 정의, 학생 클래스 내부에 이름, 나이, 성적 변수를 가진다.

이렇게 클래스에 정의한 변수들을 멤버변수 또는 필드라고 한다.

  • 멤버변수(Member Variable): 특정 클래스에 소속된 멤버
  • 필드(Field): 데이터 항목을 가리키는 용어
  • 자바에서 멤버변수, 필드는 같은 뜻이고 클래스에 소속된 변수를 뜻한다.

클래스는 관례상 대문자로 시작하고 낙타표기법을 사용

<ClassStart3.java>

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

클래스와 사용자 정의 타입

  • 클래스를 사용하면 int, String 과 같은 타입을 만들 수 있다.
  • 사용자가 직접 정의하는 사용자의 정의타입을 만들려변 설계도가 필요하다. 이 설계도가 바로 클래스이다.
  • 설계도인 클래스를 사용해 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라고 한다.
  • 클래스를 통해 사용자가 원하는 종류의 타입을 마음껏 정의할 수 있다.

Student 클래스를 기반으로 student1, student2 객체 또는 인스턴스를 만들었다.

객체사용

클래스를 통해 생성한 객체를 사용하려면 먼저 메모리에 존재하는 객체에 접근해야 한다. 객체에 접근하려면 . (점, dot)을 사용하면 된다.

student1.name
student1.age
student2.grade
...

클래스, 객체, 인스턴스

클래스-Class

클래스는 객체가 가져야할 속석(변수)과 기능(메서드)를 정의한다. 예를 들어 학생이라는 클래스 속성으로 name, age, grade를 가진다.

객체 - Object

객체는 클래스에서 정의한 속성과 기능을 가진 실체이다. 객체는 서로 독립적인 상태를 가진다.
student1은 학생1의 속성을 가지는 객체이다.

인스턴스 - Instance

인스턴스는 특정 믈래스로부터 생성된 객체를 의미한다. 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용한다.
student1 객체는 Student 클래스의 인스턴스이다.

객체 vs 인스턴스

인스턴스는 객테보다 좀 더 관계에 초점을 맞춘 단어이다. 보통 student1 은 Student 의 객체이다. 라고 말하는 대신 student1 은 Student 의 인스턴스이다. 라고 특정 클래스와의 관계를 명확히 할 때 인스턴스라는 용어를 주로 사용한다.
하지만 둘다 클래스에서 나온 실체라는 핵심 의미는 같기 때문에 보통 둘을 구분하지 않고 사용한다.

배열 도입 - 시작

배열을 사용하면 특정 타입을 연속한 데이터 구조로 묶어서 편리하게 관리할 수 있다.
<ClassStart4.java>

package class1;

public class ClassStart4 {
    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[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);
    }
}

배열 도입 - 리펙토링

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

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 (Student s : students) {
 System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
}

문제와 풀이

<MovieReview.java>

package class1.ex;

public class MovieReview {
    String title;
    String review;

}

<MovieReviewMain1.java>

package class1.ex;

public class MovieReviewMain1 {
    public static void main(String[] args) {
        MovieReview movieReview = new MovieReview();

        movieReview.title="쿵푸팬더";
        movieReview.review="재밌다.";

        System.out.println("영화 제목 : "+movieReview.title+" 리뷰 : "+movieReview.review);
    }
}

<MovieReviewMain2.java>

package class1.ex;

public class MovieReviewMain1 {
    public static void main(String[] args) {
        MovieReview[] reviews = new MovieReview[2];

        MovieReview inception = new MovieReview();
        inception.title = "인셉션";
        inception.review = "인생은 무한 루프";
        reviews[0] = inception;

        MovieReview aboutTime = new MovieReview();
        aboutTime.title = "어바웃 타임";
        aboutTime.review = "인생 시간 영화!";
        reviews[1] = aboutTime;

        for (MovieReview review : reviews) {
            System.out.println("영화 제목: " + review.title + ", 리뷰: " +
                    review.review);
        }
    }
}

문제와 풀이2

<ProductOrder.java>

package class1.ex;

public class ProductOrder {
        String name;
        int price;
        int quantity;

}

<ProductOrderMain1.java>

package class1.ex;

public class ProductOrderMain1 {
    public static void main(String[] args) {
        int total =0;

        ProductOrder order1 = new ProductOrder();
        order1.name =  "사과";
        order1.price=2000;
        order1.quantity=3;

        ProductOrder order2 = new ProductOrder();
        order2.name =  "바나나";
        order2.price=1000;
        order2.quantity=7;

        ProductOrder[] orders = {order1,order2};

        for(ProductOrder o : orders){
            System.out.println("상품명:" +o.name+ "  가격:" +o.price+ "  수량:" +o.quantity);
            total += o.price*o.quantity;
        }
        System.out.println("총 금액: "+ total);

    }
}
profile
개발감자
post-custom-banner

0개의 댓글