원래는 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 // 재고보다 많이 구매하려해 구매가 되지않았음
'Java공부(코딩)' 카테고리의 다른 글
코딩초보의 Java(자바)공부 7일차 { 객체지향 프로그래밍 } (2) | 2024.12.12 |
---|---|
코딩초보의 Java(자바)공부 6일차-2 { 기본형과 참조형 } (1) | 2024.12.12 |
코딩초보의 Java(자바) 공부 5일차 { 메서드(Method) } (5) | 2024.12.11 |
코딩초보의Java (자바)4일차-2 (배열) (4) | 2024.12.10 |
코딩초보의 Java(자바) 공부 4일차( 훈련과 Scanner ) (4) | 2024.12.09 |