Java공부(코딩)

코딩 초보의 Java(자바)공부 6일차 -클래스와 데이터-

동곤일상 2024. 12. 11. 19:54
반응형
원래는 IntelliJ 로 공부했었지만
Eclipse로 바꾸고나서 환경이많이달라졌어요ㅠ
그래도 열심히 공부하고 올려보겠습니다

 

 


1) 클래스

1-1)클래스가 필요한 이유

자바 세상은 클래스와 객체로 이루어져 있다.

그만큼 클래스와 객체라는 개념은 중요하다.

여기서는 클래스와 객체라는 개념이 필요한지 부터 시작해서.

클래스가 어떤 방식으로 발전하면서 만들어졌는지 점진적으로 알아보겠다.

 

왜필요한지 예제를 통해 알아봅시다!!

public static void main(String[] args) {

String[] students = new String[]{"학생1","학생2"};

int[] studentsAge = new int[]{19,20};

int[] studentsGrade = new int[] {80 , 92};

 

for (int s = 0; s < studentsGrade.length; s++) {

System.out.println(students[s]+"의 나이 : "+studentsAge[s]+" | "

+ "점수 : "+studentsGrade[s]);

}

}

이와 같이 배열을 통해 학생의 나이와 점수를 넣고 출력하는 코드!

문제점이 보이시나요??

유지보수가 되게 불편할 것 같습니다!!!

클래스를 통해 이 점을 해결해볼게요


 

      //Students 클래스생성 후 name, age, grade 변수 선언 ///

public class Students {

String name;

int age;

int grade;

}

 


public static void main(String[] args) {

Students students = new Students();

//students인스턴스 생성 후

//참조값 보관

 

students.name="학생1";

students.age = 15;

students.grade=90;

 

Students students2 = new Students();

students2.name="학생2";

students2.age = 16;

students2.grade=78;

 

System.out.println(students.name+"의 나이:"+students.age

+" |점수 : "+students.grade);

 

System.out.println(students2.name+"의 나이:"+students2.age

+" |점수 : "+students2.grade);

}

 

코드설명)

 

Students 클래스에 name , age , grade 변수를 선언했다

이를 멤버변수 또는 필드라고 부른다.

 

일단 클래스는 설계도 라고 생각을하고(Students)

클래스로 인해 실제 생성된 것을 인스턴스라 부른다.(students1,2)

인스턴스들은 참조값을 보관한다 

 

각 인스턴스는 참조값이 다르다.

System.out.println(students);

System.out.println(students2); //참조값 확인하는 법(인스턴스를 출력해봐라)

class_.Students@87aac27

class_.Students@3e3abc88


참조값을 왜 변수에 보관해야할까???

객체를 생성하는 `new Student()`코드 자체에는 아무런 이름이 없다.

코드는 단순히 `Student` 클래스를 기반로 메모리에 실제 객체를 만드는 것이다.

 

이런 이유로 객체를 생성할 반환되는 참조값을 어딘가에 보관해두어야 한다.

앞서 Student 해두었으므로 저장한 참조값(@xxxxx) 통해서

실제 메모리에 존재하는 객체에 접근할 있다.

Student students = new Student();  //1. Student 객체 생성

Student students = @87aac27;  //2. new Student() 결과로 @87aac27 참조값 반환

students = @87aac27; //3. 최종 결과

 

students2 까지 생성하면 

Students객체가 메모리에 2개 생성되는 것.

참조값이 다르므로 구분 가능


객체 접근법

객체에 접근하려면 . (,dot) 사용하면 된다.

 

객체에 대입

ex)students.name = "동coding";

@87aac27 = "동coding" 으로 이해하자

 

변수에있는 참조값을통해 객체에 접근하는거다

 

객체 값 읽기

System.out.println((students2.name);

처럼 참조값을통해 객체에 접근 후 출력

 


2) 클래스 , 객체 , 인스턴스 정리

클래스 - Class**

클래스는 객체를 생성하기 위한 '' 또는 '설계도'이다. 클래스는 객체가 가져야 속성(변수) 기능(메서드) 정의한

.

: 붕어빵 틀을 생각해보자. 붕어빵 틀은 붕어빵이 아니다! 이렇게 생긴 붕어빵이 나왔으면 좋겠다고 만드는 틀일

뿐이다. 실제 먹을 있는 것이 아니다. 실제 먹을 있는 붕어빵을 객체 또는 인스턴스 한다.

 

 

**객체 - Object**

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

예를 들어 코드에서 `student1` 학생1 속성을 가지는 객체이고, `

student2` 학생2 속성을 가지는 객체이다. 서로 다른 객체이다.

 

**인스턴스 - Instance**

인스턴스는 특정 클래스로부터 생성된 객체를 의미한다. 그래서 객체와 인스턴스라는 용어는 자주 혼용된다. 인스턴스

주로 객체가 어떤 클래스에 속해 있는지 강조할 사용한다. 예를 들어서 `student1` 객체는 `Student` 클래스의

인스턴스다. 라고 표현한다. 객체와 의미가 같다고 생각하자 그냥!!!

 


3) 배열을 이용한 리팩토링

위에 예제가 뭔가 더 간단히 만들 수 있을거같지않나요??

출력의 중복을 줄여보아요!!!

public static void main(String[] args) {

Students students1 = new Students();

students1.name="학생1";

students1.age = 15;

students1.grade=90;

 

Students students2 = new Students();

students2.name="학생2";

students2.age = 16;

students2.grade=78;

 

 

Students[] student = new Students[] {students1,students2};

 

//for문

for (int s = 0; s < student.length; s++) {

System.out.println((student[s].name+"의 나이 : "+student[s].age+" | "

+ "점수 : "+student[s].grade));

}

 

//향상된 for-each문 사용(배열에서많이사용)

for (Students s : student) {

System.out.println(s.name +"의나이 :"+s.age

+" | 점수 : "+s.grade);

}

}

 

배열은 참조값을 보관한다

즉 인스턴스도 보관을 할수 있겠죠?

그냥 기본형과 같은 방식으로 배열생성 가능!

 

주의할점이 있다면 값이 복사되는것이 아닌

students , students2 의 참조값이 복사되는 것.

 

 

배열을 사용한 덕분에 for문으로 최적화가 가능해짐

여기서 for문을 두개를 사용했는데 더 끌리는 것을 사용하자 !!!!

 

 


3) 예제

예제를 꼭 보고하지마시고 직접해보세요!!! 실력이 금방 늘거에요

자기만의 예제를 직접만들어보는것도 좋은 방법입니다 !

 

문제 :    책의 정보를 관리한다고 생각하자

 

Book 클래스를 만든 후

멤버변수로  책이름 , 가격,재고를 넣어

해당책의 이름과 가격을 추출해보자.!!

 

 

 

먼저 제가 만든 Class 는 이렇습니다.!

public class Book {

String name;

int price;

int quantity;

 

public int buy(int a) {

if(quantity >= a) {

System.out.println(name+"책 "+a+"개 구매 ==> "+(price * a)+"지출");

return this.quantity -= a;

}

else {

System.out.println("재고가부족해요!! ");

return quantity;

}

}

}

단순히 멤버변수만을 생성하지않고

사는 경우까지 고려해 buy메서드를 집어넣었습니다

 

buy메서드는

재고 >= 입력수량

int형(구매갯수)를 매개변수로 받습니다!

그 후 quantity(재고) 에서 입력받은 수량만큼을

빼준 후 (변경된)재고를 반환함!!

 

재고 < 입력수량  

: 재고가부족하다는 출력 ,

   기존 재고를 반환

 

메인 클래스 )

public static void main(String[] args) {

Book book = new Book();

book.name = "채식주의";

book.price = 10000;

book.quantity = 5;

 

 

Book book2 = new Book();

book2.name = "김영한의JPA";

book2.price = 25000;

book2.quantity = 8;

 

Book[] books = new Book[] {book,book2};

 

//향상된 for문을 이용해 보다 간편하게 멤버변수들을 출력!!

for (Book b : books) {

System.out.println(b.name+"의 가격 : "+b.price+

" | 현재수량 : "+b.quantity);

}

System.out.println("");

System.out.println("@@책 구매후 재고@@");

book.buy(3); //책을 사는 메서드 추가 (5개중에3개샀으므로 2개의재고가남아야함)

book2.buy(9);

System.out.println("");

 

for (Book b : books) {

System.out.println(b.name+"의 가격 : "+b.price+

" | 현재수량 : "+b.quantity);

}

}

 

 출력)

채식주의의 가격 : 10000 | 현재수량 : 5

김영한의JPA의 가격 : 25000 | 현재수량 : 8

 

@@책 구매후 재고@@

채식주의책 3개 구매 ==> 30000지출

재고가부족해요!!

 

채식주의의 가격 : 10000 | 현재수량 : 2  //3개를 구매해서 줄어듬

김영한의JPA의 가격 : 25000 | 현재수량 : 8 // 재고보다 많이 구매하려해 구매가 되지않았음