Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자바의 정석 기초편 ch4
- jpa - 객체지향 쿼리 언어
- 자바의 정석 기초편 ch3
- 게시글 목록 api
- 자바의 정석 기초편 ch8
- 2024 정보처리기사 시나공 필기
- 2024 정보처리기사 수제비 실기
- 자바의 정석 기초편 ch14
- 스프링 mvc1 - 스프링 mvc
- 스프링 mvc1 - 서블릿
- @Aspect
- 스프링 mvc2 - 로그인 처리
- 스프링 mvc2 - 타임리프
- 자바의 정석 기초편 ch13
- 자바의 정석 기초편 ch6
- 타임리프 - 기본기능
- 스프링 mvc2 - 검증
- 자바의 정석 기초편 ch11
- 자바의 정석 기초편 ch2
- 스프링 고급 - 스프링 aop
- 자바의 정석 기초편 ch1
- 스프링 입문(무료)
- 자바의 정석 기초편 ch12
- jpa 활용2 - api 개발 고급
- 자바의 정석 기초편 ch9
- 스프링 db1 - 스프링과 문제 해결
- 자바의 정석 기초편 ch7
- 스프링 db2 - 데이터 접근 기술
- 코드로 시작하는 자바 첫걸음
- 자바의 정석 기초편 ch5
Archives
- Today
- Total
나구리의 개발공부기록
자바의 정석 기초편 ch7 - 27 ~ 30[매개변수다형성,여러종류의 객체를 배열로 다루기] 본문
유튜브 공부/JAVA의 정석 기초편(유튜브)
자바의 정석 기초편 ch7 - 27 ~ 30[매개변수다형성,여러종류의 객체를 배열로 다루기]
소소한나구리 2023. 11. 27. 16:451) 다형성의 장점
- 다형적 매개변수
- 하나의 배열로 여러종류 객체 다루기
2) 매개변수의 다형성 (다형적 매개변수)
- 참조형 매개변수는 메서드 호출시 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있음
- 메서드의 매개변수에 매개변수의 다형성을 활용하여 조상타입의 참조형 매개변수로 정의해두면 해당 메서드를 호출하여 사용할 때 매개변수의 타입의 자손 타입을 모두 입력할 수 있어 메서드의 활용도가 높아짐
(1) 예제
class Product {
int price; // 제품의 가격
int bonusPoint; // 제품구매 시 제공하는 보너스점수
Product(int price) {
this.price = price;
bonusPoint = (int)(price/10.0); // 보너스점수는 제품가격의 10%
}
}
class Tv1 extends Product {
Tv1() { // Tv1의 생성자
// 조상클래스의 생성자 Product(int price)를 호출
super(100); // Tv의 가격 100만원, 보너스포인트는 10만원
}
// Object클래스의 toString()을 오버라이딩
public String toString() { return "Tv"; }
}
class Computer extends Product {
Computer() { super(500); }
public String toString() { return "Computer"; }
}
class Buyer { // 고객, 물건을 사는 사람
int money = 1000; // 소유금액
int bonusPoint = 0; // 보너스점수
void buy(Product p) { // 다형적 매개변수
if(money < p.price) {
System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
return;
}
money -= p.price; // Buyer가 가진 돈에서 구입한 제품의 가격을 뺌
bonusPoint += p.bonusPoint; // Buyer의 보너스포인트를 추가
// 아래의 둘은 같은 코드
System.out.println(p + "을/를 구입하셨습니다.");
// System.out.println(p.toString() + "을/를 구입하셨습니다.");
}
}
class ex7_8 {
public static void main(String args[]) {
Buyer b = new Buyer();
// Tv1 객체를 생성하여 Product 타입 참조변수에 할당
// b.buy()의 인자에 p를 입력하여 메서드 호출
// Product p = new Tv1();
// b.buy(p);
// 위의 2줄의 코드를 한줄로 표현, 동작은 동일함
b.buy(new Tv1());
b.buy(new Computer()); // 위와 동일
System.out.println("현재 남은 돈은 " + b.money + "만원입니다.");
System.out.println("현재 보너스점수는 " + b.bonusPoint + "점입니다.");
}
}
3) 여러종류의 객체를 배열로 다루기
- 조상타입의 객체 배열은 그의 자손의 참조값을 담을 수 있어 여러 객체를 다룰 수 있음
(1) 예제
- 아래의 예제에서는 구입할 상품을 미리 담아두는 장바구니의 기능을 객체 배열로 표현하였음
- 객체 배열의 타입을 조상타입으로 설정하여 자손의 객체타입을 모두 담을 수 있도록 설정함
class Product2 {
int price; // 제품의 가격
int bonusPoint; // 제품구매 시 제공하는 보너스점수
Product2(int price) {
this.price = price;
bonusPoint = (int)(price/10.0);
}
Product2() {} // 기본 생성자
}
class Tv2 extends Product2 {
Tv2() { super(100); }
public String toString() { return "Tv"; }
}
class Computer2 extends Product2 {
Computer2() { super(200); }
public String toString() { return "Computer"; }
}
class Audio2 extends Product2 {
Audio2() { super(50); }
public String toString() { return "Audio"; }
}
class Buyer2 { // 고객, 물건을 사는 사람
int money = 1000; // 소유금액
int bonusPoint = 0; // 보너스점수
Product2[] cart = new Product2[10]; // 구입할 제품을 저장하기 위한 배열(장바구니)
int i =0; // Product배열에 사용될 카운터
void buy(Product2 p) {
if(money < p.price) {
System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
return;
}
money -= p.price; // 가진 돈에서 구입한 제품의 가격을 뺌
bonusPoint += p.bonusPoint; // 제품의 보너스 점수를 추가
cart[i++] = p; // 제품을 Product[] cart에 저장
System.out.println(p + "을/를 구입하셨습니다.");
}
void summary() { // 구매한 물품에 대한 정보를 요약해서 보여줌
int sum = 0; // 구입한 물품의 가격합계
String itemList =""; // 구입한 물품목록
// 반복문을 이용해서 구입한 물품의 총 가격과 목록을 만듦
for(int i=0; i<cart.length;i++) {
if(cart[i]==null) break; // 기본값인 경우 반복문 종료
sum += cart[i].price;
// 배열의 문자열과 컴마를(,) itemList 변수에 저장
itemList += cart[i] + ", ";
// itemList += cart[i].toString()과 같음 + ", ";
}
System.out.println("구입하신 물품의 총금액은 " + sum + "만원입니다.");
System.out.println("구입하신 제품은 " + itemList + "입니다.");
}
}
class ex7_9 {
public static void main(String args[]) {
Buyer2 b = new Buyer2();
b.buy(new Tv2());
b.buy(new Computer2());
b.buy(new Audio2());
b.summary();
}
}
** 참고
- vector클래스는 가변 배열 기능을 가지고 있음 - 11장에서 배움
- 배열의 길이를 관리할 필요 없이 알아서 메모리의 용량에 따라 길이를 조정해 줌 -> 배열의 길이를 직접 관리하지 않아도 됨
- object[ ] (오브젝트배열)을 멤버로 가지고 있으며 모든 종류의 객체를 저장할 수 있음(최고 조상)
** 출처 : 남궁성의 정석코딩_자바의정석
'유튜브 공부 > JAVA의 정석 기초편(유튜브)' 카테고리의 다른 글
자바의 정석 기초편 ch7 - 35 ~ 38 [인터페이스의 선언, 상속, 구현, 인터페이스와 다형성] (0) | 2023.11.29 |
---|---|
자바의 정석 기초편 ch7 - 31 ~ 34[추상 클래스, 추상 메서드, 추상클래스의작성1~2] (0) | 2023.11.28 |
자바의 정석 기초편 ch7 - 24 ~ 26[참조변수의형변환,instanceof 연산자] (1) | 2023.11.27 |
자바의 정석 기초편 ch7 - 22 ~ 23 [캡슐화, 다형성] (1) | 2023.11.24 |
자바의 정석 기초편 ch7 - 17 ~ 21 [제어자, static, final, abstract, 접근제어자] (0) | 2023.11.24 |