11월 2일
1.다형성의 장점
(1)다형적 매개변수
(2)하나의 배열로 여러종류 객체 다루기
2.매개변수의 형변환
참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨 줄수 있다.
package Java;
class Product{
int price;
int bonusPoint;
Product(){} //기본생성자
Product(int price){ //매개변수가 있는 생성자
this.price=price; //매개변수로 넘어온 price 세팅
bonusPoint=(int)(price/10.0); //매개변수로 넘어온 price를 10% 계산하여 세팅
}
}
class Tv1 extends Product{
Tv1(){
super(100); //Product 조상생성자에게 초기화 세팅 토스!
}
public String toString() { //Object클래스의 toString을 오버라이딩함.
return"Tv";
}
}
class computer extends Product{
computer(){
super(200); //Product 조상생성자에게 초기화 세팅 토스!
}
public String toString() { //Object클래스의 toString을 오버라이딩함.
return"computer";
}
}
class Buyer{
int momey=1000;
int bonusPoint=0;
void buy(Product p) { //buy 메서드 만듬
if(momey<p.price) { //Buyer가 가진 돈보다 물건가격이 비싸면 아래메서드 실행
System.out.println("잔액이 부족하여 살수 없습니다.");
return; //buy메서드를 나가버림
}
momey -=p.price; //Buyer가 가진 돈에서 제품가격 빠짐
bonusPoint +=p.bonusPoint; //Buyer의 보너스 포인트가 쌓임
System.out.println(p+"를/을 구입 하셨습니다.");
}
}
public class Ex7_8 {
public static void main(String[] args) {
Buyer b =new Buyer();
b.buy(new Tv1()); //buy메서드를 호출,Tv1()객체를 생성해서 매개변수로 넘겨줌,
b.buy(new computer()); //buy메서드를 호출,computer()객체를 생성해서 매개변수로 넘겨줌
System.out.println("현재 남은 돈은 "+b.momey+"만원입니다.");
System.out.println("현재 보너스 점수는 "+b.bonusPoint+"점 입니다.");
}
}
3.여러 종류의 객체를 배열로 다루기
조상타입의 배열에 자손들의 객체를 담을수 있음
package Java;
class Product2{
int Price;
int bonusPoint;
Product2(){}
Product2(int Price){
this.Price=Price;
bonusPoint=(int)(Price/10.0);
}
}
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 Audio extends Product2{
Audio(){
super(50);
}
public String toString() {
return "Audio";
}
}
class Buyer2{
int money=1000;
int bonusPoint=0;
Product2[] cart=new Product2[10]; //Product2 타입의 장바구니 추가 공간은 10개 짜리
int i=0;
void buy(Product2 p) {
if(money<p.Price) {
System.out.println("잔액이 부족하여 살수 없습니다.");
return;
}
money-=p.Price;
bonusPoint+=p.bonusPoint;
cart[i++]=p; //cart에 Product2 객체주소를 담아줌
System.out.println(p+"을/를 구입하셨습니다.");
}
void summary() {
int sum=0; //구매한 총금액을 구하기 위함
String itemList=""; //구매한 리스트를 알아보기 위함
for(int i=0;i<cart.length;i++) {
if(cart[i]==null)break; //카트에 담긴게 없으면 null로 반환
sum+=cart[i].Price; //총액에 카트에 담은 객체의 금액 더하기
itemList+=cart[i]+", "; //아이템리스트에 카트에 담은객체의 toString을 출력
}
System.out.println("구입하신 물품의 총 금액은"+sum+" 만원입니다.");
System.out.println("구입하신 제품은"+itemList+"입니다.");
}
}
public class Ex7_9 {
public static void main(String[] args) {
Buyer2 b =new Buyer2();
b.buy(new Tv2());
b.buy(new Computer2());
b.buy(new Audio());
b.summary();
}
}
이게 중요한거 같다 남궁성쌤이 자꾸 코드를 보고 그리는 연습을 하라고 했다.그래야지 설계 실력이 는다고 위에 그림이 제일 중요한듯
4.추상클래스
(1)미완성 메서드(즉,추상메서드)를 갖고 있는 클래스는 미완성 설계도 이며, '추상클래스' 라고한다.
(2)추상메서드와 클래스모두 'abstract' 를 붙인다.
abstract class Player{
abstract void play(int pos);
abstract void stop();
}
(3)추상메서드나 추상클래스는 왜 필요한가?
다른 클래스 작성에 도움을 주기 위함.
(4)인스턴스생성 불가! 왜?미완성 설계도 이기 때문
(5)상속을 통해 미완성 메서드를 완성해야 인스턴스 생성이 가능하다.
5.추상메서드
(1)미완성 메서드로 구현부{} 몸통이 없는 메서드 이다.
(2)꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우
(3)2개 미완성 메서드중에 1개만 구현하고,1개는 추상메서드 형태로 남겨두었을때도 어찌됐든 추상메서드를 가지고 있으니까 'abstract'를 붙임
2개 모두 구현했다면 class에서 'abstract'는 뺀다.
(4)abstract 를 붙여서 알려주므로써 추후에 상속받아서 꼭 구현해라는 강제적인 의미도 있고, 대략적으로라도 설계도를 그리는 역할을 하기도 한다.
대략적으로라도 이런 기능은 꼭 있어야하며, 추후에 상속 받아서 이기능을 꼭 만들어야한다 라는 의미
6.추상클래스 작성
(1)여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존클래스의 공통 부분을 뽑아서 추상클래스를 만든다.
(2)공통부분인 선언부를 뽑아내서 추상클래스를 만들고 상속받아서 구현부를 작성함.
package Java;
abstract class Unit{
int x,y;
abstract void move(int x, int y);
void stop(){
System.out.println("현재 위치에서 정지");
}
}
class Marine1 extends Unit{
@Override
void move(int x, int y) {
System.out.println("Marine[x="+x+", y="+y+"]");
}
void stimPack() {
System.out.println("스팀팩을 사용한다.");
}
}
class Tank extends Unit{
@Override
void move(int x, int y) {
System.out.println("Tank[x="+x+", y="+y+"]");
}
void changeMode() {
System.out.println("공격모드를 변환한다.");
}
}
class Dropship extends Unit{
@Override
void move(int x, int y) {
System.out.println("Dropship[x="+x+", y="+y+"]");
}
void load() {
System.out.println("대상을 태운다");
}
void unload() {
System.out.println("대상을 내린다");
}
}
public class Ex7_10 {
public static void main(String[] args) {
Unit[] group= {new Marine1(),new Tank(),new Dropship()};
for(int i=0;i<group.length;i++) {
group[i].move(100, 200);
}
}
}
Unit[] group= {new Marine1(),new Tank(),new Dropship()};
이부분이 객체 배열인데, 참조변수를 묶은것을 말한다.
7.추상클래스의 장점
(1)코드의 중복을 피할수 있다.
(2)기본설계도가 있어 특이점 일부분만 바꿔서 쉽게 작성할수있다. 공통적인 부분은 이미 설계가 되어 있기 때문에
(3)추후 변경시 한번에 변경되기 때문에 관리가 용이하다.
예전에는 변경시 각각 클래스마다 변경 해주면 되었는데, 추상클래스만 변경하면 변경에 용이함.
(4)추상클래스를 의미있는 단계별로 만들어 놓으면 필요에 따라 중간단계에서 구현받아서 구현할수도 있음.
(5)추상화된 코드는 구체화된 코드보다 유연하다. 즉, 변경에 유리하다.