클래스

황상익·2024년 3월 25일

Inflearn JAVA

목록 보기
12/61

Why we need class??

자바는 객체와 클래스로 구성

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;

        String student3Name = "학생3";
        int student3age = 17;
        int student3Grade = 50;

        System.out.println("이름 : " + student1Name + " 나이 : " + student1age + " 성적 : " + student1Grade);
        System.out.println("이름 : " + student2Name + " 나이 : " + student2age + " 성적 : " + student2Grade);
    }
}
public class ClassStart2 {
    public static void main(String[] args) {
        String[] studentsNames = {"학생1", "학생2"};
        int[] age = {15, 16};
        int[] grade = {90, 80};

        for (int i = 0; i < studentsNames.length; i++) {
            System.out.println("이름 : " + studentsNames[i] + " 나이 : " + age[i] + " 성적 : " + grade[i]);
        }
    }
}

하나는 변수를 위주로 구성한 코드이고, 다른 하나는 배열을 위주로 구성한 code이다.
둘은 각각 한계가 있다. 변수로 짠 코드는 코드가 계속 반복적인 부분도 있고, 새로 만들어 질 때마다 게속 하나씩 만들어야 한다는 한계가 있고, 배열의 경우 코드 변경은 최소화 할 수 있지만, 데이터 변경할때 상당히 조심해서 변경해야 하는 것 이 있다.

이제 학생 클레스를 사용하는 Code로 작성

public class ClassStart3 {
    public static void main(String[] args) {
        Student student = new Student();
        student.name = "학생 1";
        student.age = 15;
        student.grade = 90;

        Student student2 = new Student();
        student2.name = "힉셍2";
        student2.age = 16;
        student2.grade = 80;

        System.out.println(student);
        System.out.println(student2);

        System.out.println("===================");

        System.out.println("이름 : " + student2.name  + " 나이 : " + student2.age
                + " 성적 : " + student2.grade);

        System.out.println("이름 : " + student.name  + " 나이 : " + student.age
                + " 성적 : " + student.grade);



    }
}

클래스와 사용자 정의 타입
1. 타입은 데이터의 종류나 형태
2. int라고 하면 정수, String 문자
3. 클래스를 생성해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스
4. 클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 마음껏 정의

클레스, 객체, 인스턴스

1) 변수선언
Student student1 // Student 변수 선언
-> Student는 Student 타입의 객체를 받을 수 있다.

2) 객체 생성
Student student1 = new Student() //Student 인스턴스 생성
객체를 사용하러면 먼저 설계도인 클레스를 기반으로 객체 생성
new Student => new는 새로 생성한다는 의미. new Student()는 Student 클래스 정보 기반으로 새로운 객체를 생성하라는 의미.
객체를 생성할때는 new 클래스명을 사용.
Student 클래스는 String name, int age, int grade 변수 명

3) 참조값 보관
student = x001
객체를 생성하면 자바는 메모리 어딘가에 있는 객체에 접근할 수 있는 참조값 x001을 반환
new 키워드를 통해 객체가 생성, 참조값 반환. student1에 생성된 객체의 참조값 x001을 보관
실제 Student 객체의 참조값을 갖고 있음
student1 변수는 방금 만금 객체에 접근 할 수 있는 참조값을 갖고 있다. 따라서 이 변수를 통해 객체에 접근 가능.

-> 참조값을 변수에 보관해야 하는 이유
객체를 생성하는 new Student() 코드 자체에는 아무런 이름이 없음.
단순히 Student 클래스를 기반으로 메모리에 실제 객체를 만드는 것. 따라서 생성한 객체에 접근할 수 있는 방법이 필요

Student student1 = new Student(); //1. Student 객체 생성
Student student1 = x001; //2. new Student()의 결과로 x001 참조값 반환
student1 = x001; //3. 최종 결과

객체 사용
클래스를 통해 생성한 객체를 사용하려면 먼저 메모리에 존재하는 객체에 접근하려면 . 을 사용

//객체 값 대입
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
//객체 값 사용
System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" +
student1.grade)

객체에 값 대입
객체가 가지고 있는 멤버 변수 (name, age, grade)에 값을 대입하려면 객체이 접근
객체에 접근하려면 .키워드 사용
.을 사용하면 참조값을 가지고 참조값 위체에 있는 객체에 접근

객체 값 읽기

클래스 객체 인스턴스 정리

  1. 클래스
    클래스는 객체를 생성하기 위한 설계도. 클래는 객체가 가져야할 속성과 기능을 정의함

  2. 객체
    객체는 클레스에서 정의한 속성과 기능을 가진 실체. 객체는 서로 독립적 상태를 갖는다.

  3. 인스턴스
    인스턴스는 특정 클래스로 부터 생성된 객체를 의미. 그래서 객체와 인스턴스라는 용어는 자주 혼용. 인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할때 사용

객체 VS instance

둘다 클래스에서 나온 실체라는 의미에서 비슷하게 사용, 인스턴스는 객체보다 좀더 관계에 초점을 맞춘 단어. 모든 인스턴스는 객체이지만, 우리가 인스턴스라고 부르는 순간 특정 클래스로 부터 그 객체가 생성되었음을 강조

배열 도입

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

배열에 참조값 대입

Student 변수를 2개 보관할 수 있는 사이즈 2의 배열을 형성
Student 타입의 변수는 Student 인스턴스의 참조값을 보관, Student 배열의 각각의 항목도, Student 타입의 변수일 뿐,

students[0] = student1;
students[1] = student2;
//자바에서 대입은 항상 변수에 들어 있는 값을 복사한다.
students[0] = x001;
students[1] = x002;

중요!!!
자바에서 대입은 항병 변수에 들어있는 값을 복사한다.

배열은 참조값을 갖고 있기 때문에 Student인스턴스에 모두 접근 가능

주의!!!
변수에는 인스턴스 자체가 들어있는것이 아닌, 인스턴스의 위치를 가리키는 참조값이 들어있을 뿐이다.

배열에 들어있는 객체 사용

학생1 예제 
System.out.println(students[0].name); //배열 접근 시작
System.out.println(x005[0].name); //[0]를 사용해서 x005 배열의 0번 요소에 접근
System.out.println(x001.name); //.(dot)을 사용해서 참조값으로 객체에 접근
System.out.println("학생1"); ```

학생2 예제 
System.out.println(students[1].name); //배열 접근 시작
System.out.println(x005[1].name); //[1]를 사용해서 x005 배열의 1번 요소에 접근
System.out.println(x002.name); //.(dot)을 사용해서 참조값으로 객체에 접근
System.out.println("학생2");

배열 도입 -> 리펙토링

public class ClassStart5 {
    public static void main(String[] args) {
        Student st1 = new Student();
        st1.name = "학생 1";
        st1.age = 15;
        st1.grade = 90;

        Student st2 = new Student();
        st2.name = "학생 2";
        st2.age = 16;
        st2.grade = 80;

        Student[] sts = new Student[]{st1, st2};
        for (int i = 0; i < sts.length; i++) {
            System.out.println("이름 : " + sts[i].name
            + " 나이 : " + sts[i].age + " 학점 : " + sts[i].grade);
        }

        for (int i = 0; i < sts.length; i++) {
            //배열의 요소를 하나 축약해서 생성
            Student s = sts[i];

            System.out.println("이름 : " + s.name
                    + " 나이 : " + s.age + " 학점 : " +
                    s.grade);
        }

        for (Student s:
             sts) {
            System.out.println("이름 : " + s.name
                    + " 나이 : " + s.age + " 학점 : " +
                    s.grade);
        }
    }
}

문제풀이

public class Review {
    String title;
    String review;
}
public class ReviewMain {
    public static void main(String[] args) {
        Review review = new Review();
        review.title = "인셉션";
        review.review ="인생은 무한 루프";

        Review review1 = new Review();
        review1.title = "어바웃 타입";
        review1.review = "인셍 시간 영화";

        Review[] reviews = {review, review1};
        for (int i = 0; i < reviews.length; i++) {
            Review r = reviews[i];
            System.out.println("영화 제목 : " + r.title
            + " 리뷰 : " + r.review);
        }

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

    }
}
public class Order {
    public String productName;
    public int price;
    public int quantity;
}
public class OrderMain {
    public static void main(String[] args) {
        Order order = new Order();
        order.productName = "두부";
        order.price = 2000;
        order.quantity = 2;

        Order order1 = new Order();
        order1.productName = "김치";
        order1.price = 5000;
        order1.quantity = 1;

        Order order2 = new Order();
        order2.productName = "콜라";
        order2.price = 1500;
        order2.quantity = 2;

        Order[] orders = {order, order1, order2};
        int total = 0;
        for (Order o :
                orders) {
            System.out.println("상품명 : " + o.productName + " 가격 : " + o.price + " 수량 : " + o.quantity);
            total += o.price * o.quantity;
            System.out.println(" 총액 : " + total);
        }
    }
}
profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글