본문 바로가기
코딩/수업 정리

20.12.11 Fri [015]

by 6^6 2020. 12. 11.
728x90
  • IS-A 와 HAS-A
  • IS-A관계의 예
  • 메소드 오버라이딩
  •  

 

 

 

**기본용어상식

ctrl+Shift+Alt+l 치면 Quick search : 클래스 이름 찾을 수 있다.

 

상속개념복습할때 - 어제수업 tv,192주소, 칼라 까지만 직접 구현할줄알고 문법사항적용 할줄알면 성공임!!!!!

///무조건외우기!!!!

class TV {

	private int size;

	public TV(int size) {
		this.size = size;
	}

	protected int getSize() {
		return size;
	}

}

class ColorTV extends TV {
	int color;

	public ColorTV(int size, int color) {
		super(size);
		this.color = color;

	}

	public void printProperty() {
		System.out.println(super.getSize() + "인치 " + color + "컬러");

	}
}

public class TVMain {

	public static void main(String[] args) {

		ColorTV myTV = new ColorTV(32, 1024);
		myTV.printProperty();

	}
}

 

IS-A와 HAS-A

IS-A : "~이면 ~이다."

쪼끔이라도 의심스러우면 IS-A 가 아니라 HAS-A이다.

 

IS-A 의 예시 : 노트북은 컴퓨터이다. 스마트폰은 모바일폰이다.

HAS-A의 예시 : CPU는 컴퓨터이다.

class Person{

   Heart heart;

   Finger finger;...

}

 

class Computer{

   Cpu cpu;

   Mainboard mainboard;

   Memory memory;...

}

 

 

IS-A관계의 예

//Main함수
package java_1211;

public class Main {
	public static class MobileMain {
		public static void main(String[] args) {
			SmartPhone phone = new SmartPhone("010-5555-7777", "Nougat");
			phone.answer(); // 전화를 받는다.
			phone.playApp(); // 앱을 선택하고 실행한다.
		}
	}
}
//class
package java_1211;

class MobilePhone {
	protected String number; // 전화번호

	public MobilePhone(String num) {
		number = num;
	}

	public void answer() {
		System.out.println("Hi~ from " + number);
	}
}

class SmartPhone extends MobilePhone {
	private String androidVer; // 안드 운영체제 버전

	public SmartPhone(String num, String ver) {
		super(num);	//부모거 호출
		androidVer = ver; //내거 호출
	}

	public void playApp() {
		System.out.println("App is running in " + androidVer);
	}
}//Hi~ from 010-5555-7777
//App is running in Nougat

 

질문 : 메인클래스에서 메모리 어떻게 생성되는지?

 

public class Main {
	public static class MobileMain {
		public static void main(String[] args) {
			SmartPhone phone = new SmartPhone("010-5555-7777", "Nougat");
			MobilePhone ph2 = new SmartPhone("010-1232-1231", "Nougat");
			phone.answer(); // 전화를 받는다.
			phone.playApp(); // 앱을 선택하고 실행한다.
			System.out.println();
			
			
			phone.answer(); 
			phone.playApp();
			System.out.println();
			
			
			// 1. 다형성(부모=자식) - 이 역은 안된다.(without 형변환 - 형변환없이 그냥 들어간다.)
			//MobilePhone ph2 = new SmartPhone("010-1232-1231", "Nougat"); // 이렇게 객체 생성해도 에러 안남

			A a = new A();
			B b = new B();

			// 다형성에 관한것★★면접100%★★
			A ab = new B(); // 에러안남 - A부모 = B자식
			B ba = new A(); // 에러남. - B자식 = A부모 (반대는 안된다.)
			A ac = new C(); //상속받게되면 타입을 달리하기만 하면 A는 다 받아낼수 있따.
			A ad = new D();
			
			ph2.answer(); //p2찾아가서 answer 실행해라
			//ph2.playApp(); 오류 //playApp은 자식클래스 자신만의 추가적인 특성
			//부모-자식은 되는데 자식-부모는 왜 안되는지?
			//부모클래스 메모리가 먼저 올라간 다음 자식클래스 메모리가 올라가기 때문
			//부모클래스 - 부모, 자식클래스 - 부모,자식(자기자신거) // 자식이 먼저올라가면 부모메모리없어서 x
			
		}
	}
}

class A {	//이부분은 수업 추가설명

}

class B extends A {

}

class C extends A {

}

class D extends A {

}


class MobilePhone {
	protected String number; // 전화번호

	public MobilePhone(String num) {
		number = num;
	}

	public void answer() {
		System.out.println("Hi~ from " + number);
	}
}

class SmartPhone extends MobilePhone {
	private String androidVer; // 안드 운영체제 버전

	public SmartPhone(String num, String ver) {
		super(num); // 부모거 호출
		androidVer = ver; // 내거 호출
	}

	public void playApp() {
		System.out.println("App is running in " + androidVer);
	}
}// Hi~ from 010-5555-7777
//App is running in Nougat

 

 

 

 

 

 

메소드 오버라이딩 ppt 12p

 

상속관계에서 데이터타입 파라미터 전부 다 똑같고(=덮어쓰기), 안에있는 구현내용만 다르게한다.

오버라이딩 = 자식거! 자식이 갖고있는 함수를 덮어씀.

class Cake {
	public void yummy() {
		System.out.println("Yummy Cake");
	}
}

class CheeseCake extends Cake {
	public void yummy() {
		System.out.println("Yummy Cheese Cake");
	}

}

public class Main2{
	public static void main(String[] args) {

		Cake c1 = new CheeseCake();

		CheeseCake c2 = new CheeseCake();

		c1.yummy();
		c2.yummy();

	}
}//Yummy Cheese Cake
//Yummy Cheese Cake

 

package java_1211;

class Cake {
	public void yummy() {
		System.out.println("Yummy Cake");
	}
}

class CheeseCake extends Cake {
	public void yummy() {
		System.out.println("Yummy Cheese Cake");
	}

}

class StrawberryCheeseCake extends CheeseCake {
	public void yummy() {
		System.out.println("Yummy StrawberryCheeseCake");

	}
}

public class Main {
	public static void main(String[] args) {

		Cake c1 = new StrawberryCheeseCake(); //자식걸로 다 덮어써짐
		CheeseCake c2 = new StrawberryCheeseCake(); //마찬가지
		StrawberryCheeseCake c3 = new StrawberryCheeseCake(); //마찬가지

		c1.yummy();
		c2.yummy();
	}
}

 

 

자식거가 덮어지지않고 부모거 호출하려면 super!

메소드외부에서 호출방법x

인스턴트내부에서는 super로만 접근가능

 

 

 

 

 

변수자체는 오버라이딩 대상이아니다. 그래서 Cake c2 = new CheeseCake(); 은 Cake에 접근하는것임.

 

 

==========오늘의문제=========

zimt.tk/201211_-_015_-Polymorphism-af5e8a560e1740618555f151adcbf3b1

1.is a 관계와 has a 관계에 대하여 설명하시오.
is-a : ~이면 ~이다. / 상속관계 / 쪼끔이라도 의심스러우면 IS-A 가 아니라 HAS-A이다.
ex)
노트북은 컴퓨터이다. 스마트폰은 모바일폰이다.

has-a :  포함관계
ex)
class Person{

   Heart heart;

   Finger finger;...

}
2.다형성이란 무엇인가?
부모=자식 (wihtout 형변환) 

class A{..}
class B extends A {...}
class C extends A {...}
class D extends A {...}

public class Phone {
	public static void main(String[] args) {
		A a = new A();   //당연히 됨
		B b = new B();   //당연히 됨		
		
		A ab = new B();   //부모 = 자식 B객체 생성
		A ac = new C();   //부모 = 자식 C객체 생성
		A ad = new D();   //부모 = 자식 D객체 생성
		/*
		위의 세 가지 경우는 모두 컴파일이 된다. 
    왜 에러 안남? 부모, 자식의 메모리가 다 올라가있어서 부모가 참조하려고 할 때 가능하다.
		new 객체 생성시 B, C, D는 모두 A를 상속받아서 A의 정보를 가지기 때문에 
		메모리에 A → B, A → C, A → D 순으로 모든 정보가 올라간다.
		ab, ac, ad는 각각 A타입으로, 참조하려는 A의 정보가 메모리에 모두 있기 때문에 컴파일이 가능하다.
		*/
	
		D da = new A();   //자식 = 부모, 에러남
		//왜 에러? 부모 만 메모리에 올라가고 자기것을 메모리에 올리지 않아서 당연히 안됨
	}	
}

 

다형성(Polymerphism)의 필요성은?

//다음 객체들의 전체 면적의 합을 구해라. → 반드시 폴리머피즘 적용해야한다!!

	Shape[] shape = new Shape[2];
	shape[0]= new Circle(10.0);
	shape[1]= new Rectangle(10, 4);

	double area =0;	
		for(int i =0; i<shape.length; i++) {
			area = area + shape[i].getArea();
		}	
	System.out.println(area);



3.아래가 되지 않는 이유에 대하여 메모리 그림으로

설명하시오.

 

MobilePhone(부모) SmartPhone(자식)

부모가 메모리에 올라가있기 때문에


SmartPhone s = new MobilePhone();
부모만 메모리에 올라가 있고 참조 해야할 자신은 메모리에 올라가 있지 않기 때문에


4.메소드 오버라이딩 이란?

자식거. 부모거 호출해도 자식것이 호출된다.
상속관계에서 데이터타입, 파라미터 전부 다 똑같고, 안에 있는 구현내용만 다르게하는 것이다.
오버라이딩은 자식이 갖고있는 함수를 덮어쓰는것이라고 생각하면된다.


5.갬블링 게임을 만들어보자. 두 사람이 게임을 진행한다. 이들의 이름을 키보드로 입력 받으며 각 사람은 Person 클래스로 작성
하라. 그러므로 프로그램에는 2개의 Person 객체가 생성되어야 한다. 두 사람은 번갈아 가면서 게임을 진행하는데 각 사람이 자
기 차례에서 <Enter> 키를 입력하면, 3개의 난수가 발생되고 이 숫자가 모두 같으면 승자가 되고 게임이 끝난다. 난수의 범위를 
너무 크게 잡으면 3개의 숫자가 일치하게 나올 가능성이 적기 때문에 숫자의 범위는 1~3까지로 한다.

1번째 선수 이름>>수희
2번째 선수 이름>>연수
[수희]:
3  1  1  아쉽군요!
[연수]:
3  1  3  아쉽군요!
[수희]:
2  2  1  아쉽군요!
[연수]:
1  1  2  아쉽군요!
[수희]:
3  3  3  수희님이 이겼습니다!

 

 

**선생님 추가 설명 : while문은 주로 Main에서 돌린다!

	public void Gambling() {
		Scanner scan = new Scanner(System.in);

		System.out.println("1번째>");
		Person p1 = new Person(scan.next());
		System.out.println("2번째>");
		Person p2 = new Person(scan.next());

		while (true) {
			if (p1.play()) {
				System.out.println(p1.getPerson() + "이 이겼습니다.");
				break;
			} else {
				System.out.println("아쉽군요");
			}
			if (p1.play()) {
				System.out.println(p2.getPerson() + "이 이겼습니다.");
				break;
			} else {
				System.out.println("아쉽군요");

			}
		}
	}

	class Person {
		private String person;
		int[] num = new int[3];
		int i = 0;

		Person() {

		}

		Person(String person) {
			this.person = person;
		}

		public String getPerson() {
			return person;
		}

		public void setPerson(String person) {
			this.person = person;
		}

		boolean play() {
			Scanner scan = new Scanner(System.in);
			System.out.print("[" + person + "]: <Enter>");
			scan.nextLine();
			for (i = 0; i < num.length; i++) {
				num[i] = (int) (Math.random() * 3) + 1;
				System.out.print(num[i] + " ");
			}
			if ((num[0] == num[1]) && (num[0] == num[2])) {
				return true;
			} else
				return false;
		}

	}

 

package java_1213;

import java.util.Scanner;

public class GamblingMain {

	public static void main(String[] args) {

		Gambling gb = new Gambling();
		gb.Gambling();

	}
}

 

저자풀이

package java_1214;

import java.util.Scanner;

public class Person {//사람2명
	private int num1, num2, num3;//숫자3개
	public String name;
	
	public Person(String name) {
		this.name = name;
	}
	
	public boolean game() {//난수 3개 생성
		num1 = (int)((Math.random()*3))+1;
		num2 = (int)((Math.random()*3))+1;
		num3 = (int)((Math.random()*3))+1;
		
		
	}

	
}

}
//메인함수
package java_1214;

import java.util.Scanner;

public class GameMain {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.print("1번째>>");
		Person person1 = new Person(sc.next());
		Person person2 = new Person(sc.next());

		// 1,2번선수 입력

		String buffer = sc.nextLine(); // 엔터만 때려라.(막히는 부분)
		while (true) {
			System.out.println("<" + person1 + ">: [enter]");
			buffer = sc.nextLine();
			System.out.println("<" + person2 + ">: [enter]");
			buffer = sc.nextLine();

			if (person1.game()) {
				System.out.println(person1 + "이 이겼습니다.");// person1.game() true면 person1이 이겼습니다.
			}
			if (person2.game()) {
				System.out.println(person2 + "이 이겼습니다.");
			}

		}

	}
}

선생님풀이↓

package java_1214;

import java.util.Scanner;

public class GameMain {// 사람2명
	final int CHANCE = 3; // 숫자 3개도 4개도 바꿀수있는것.
	private int[] numArr; // 배열로 처리
	private String name;

	public GameMain(String name) {
		this.name = name;
		numArr = new int[CHANCE];
	}

	public boolean game() {//난수 3개 생성
		
		boolean isDuplicate = true;
		
		for(int i = 0; i<numArr.length; i++) {
		numArr[i] = (int)((Math.random()*CHANCE))+1;
		
	}

		for(int i = 0; i<numArr.length; i++) {
			if(numArr[0] != numArr[i]) { //numArr[0]이 다른거랑 하나라도 안맞으면 바로 false
				isDuplicate = false;
				break;
		}
	
}

public class GameMain{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print(b);
		
		//1,2번선수 입력
		
		String buffer = sc.nextLine(); //엔터만 때려라.(막히는 부분)
		while(true) {
			System.out.println("엔터");
			buffer = sc.nextLine();
			
			if//person1.game() true면 person1이 이겼습니다.
			
			//
			
		}
		
	}
}

 

 


6.문제 10의 갬블링 게임을 n명이 하도록 수정하라. 실행 예시와 같이 게임에 참여하는 선수의 수를 입력받고 각 선수의 이름을 
입력받도록 수정하라.

겜블링 게임에 참여할 선수 숫자>>3
1번째 선수 이름>>황
2번째 선수 이름>>이
3번째 선수 이름>>김
[황]:
2  3  3  아쉽군요!
[이]:
1  2  2  아쉽군요!
[김]:
2  2  3  아쉽군요!
[황]:
3  2  2  아쉽군요!
[이]:
1  1  3  아쉽군요!
[김]:
2  2  1  아쉽군요!
[황]:
2  2  2  황님이 이겼습니다!

//person을 배열로 잡으면됨

 


7.다음을 만족하는 클래스 Employee를 작성하시오
(8번문제부터는 이것과 관련된 문제입니다).

- 클래스 Employee(직원)은 클래스 Regular(정규직)와 Temporary(비정규직)의 상위 클래스

- 필드: 이름, 나이, 주소, 부서, 월급 정보를 필드로 선언 o
 
- 생성자 : 이름, 나이, 주소, 부서를 지정하는 생성자 정의 o

-메소드 printInfo() : 인자는 없고 자신의 필드 이름, 나이, 주소, 부서를 출력 o

8. 다음을 만족하는 클래스 Regular를 작성하시오.

- 클래스 Regular는 위에서 구현된 클래스 Employee의 하위 클래스 o

- 생성자 : 이름, 나이, 주소, 부서를 지정하는 상위 생성자 호출

- Setter : 월급 정보 필드를 지정

- 메소드 printInfo() : 인자는 없고 "정규직"이라는 정보와 월급을 출력 

 

===============오늘의문제==============

 

7번문제

package java_1213;

class Employee {
	String name;
	int age;
	String address;
	String part;

	public Employee(String name, int age,  String address, String part) {
		this.name = name;
		this.age = age;
		this.address = address;
		this.part = part;
		
	}

	public void printInfo() {
		System.out.println("이름 " + name);
		System.out.println("나이 " + age);
		System.out.println("주소 " + address);
		System.out.println("부서 " + part);
		
	}
}

class Regular extends Employee {
	private int money;
	Regular(String name, int age, String address, String part, int money) {
		super(name, age, address, part);
		
	}
	
}
package java_1213;

public class EmployeeMain {
	public static void main(String[] args) {

		Employee employee = new Employee("홍길동",30,"서울","전산직");
		employee.printInfo();
	}
}

 

 

8번문제

package java_1213;

class Employee {
	String name;
	int age;
	String address;
	String part;
	protected int money;

	public Employee(String name, int age, String address, String part) {
		this.name = name;
		this.age = age;
		this.address = address;
		this.part = part;

	}

	public void printInfo() {
		System.out.println("정규직, 월급 " + this.money);
	}
}

class Regular extends Employee {

	Regular(String name, int age, String address, String part,int money) {
		super(name, age, address, part);
		this.money=money;
	}

	public void setMoney(int money) {
		this.money = money;

	}

}
public class EmployeeMain {
	public static void main(String[] args) {

		Regular regular= new Regular("홍길동",30,"서울","전산직",300);
		
		
		regular.printInfo();
		//regular.setMoney(300);
	}
}

 

수정-메인도 두개 employee하나 더 만들어야하는거였음

package java_1214;

class Employee {
	String name;
	int age;
	String address;
	String part;
	protected int money;
 
	public Employee(String name, int age, String address, String part) {
		this.name = name;
		this.age = age;
		this.address = address;
		this.part = part;
 
	}
 
	public void printInfo() {
		//super.printInfo(); //??
		System.out.println("정규직, 월급 " + this.money);
	}
}
 
class Regular extends Employee {
 
	Regular(String name, int age, String address, String part,int money) {
		super(name, age, address, part);
		setMoney(money);//이렇게하면된다...
		//this.money=money; //내코드 - 이렇게하면  0만뜸
	}
 
	public void setMoney(int money) {
		this.money = money;
 
	}
 
}

 

5번문제 내풀이 오류난것↓

 

package java_1211;

import java.util.Scanner;

public class Game {

	public static void main(String[] args) {

		Scanner sc1 = new Scanner(System.in);
		Scanner sc2 = new Scanner(System.in);
		String name1 = sc1.nextLine();
		String name2 = sc2.nextLine();
		System.out.println("1번째 선수 이름>>" + name1);
		System.out.println("2번째 선수 이름>>" + name2);
		int i = 0;
		int j = 0;
		int[] num = new int[3];
		num[i] = (int) ((Math.random() * 3) + 1);
		num[j] = (int) ((Math.random() * 3) + 1);
		
		while (true) {
			System.out.print("[" + name1 + "]:");
			for (i = 0; i < num.length; i++) {
				System.out.print(num[i] + " ");
			}System.out.println("아쉽군요!");

			System.out.print("[" + name2 + "]:");
			for (j = 0; j < num.length; j++) {
				System.out.print(num[j] + " ");
			}System.out.println("아쉽군요!");

			if (num[i] == num[i] && num[i] == num[i]) {
				System.out.println(name1 + "님이 이겼습니다.");
				break;
			}
			if (num[j] == num[j] && num[j] == num[j]) {
				System.out.println(name2 + "님이 이겼습니다.");
				break;
			}
		}
	}
}
//피드백

hasNextLine()
내가입력을했으면 true반환 안했으면 false반환
-버퍼 남아있음 -지워줘야함
sc.nextLine(); -이걸사용하면 버퍼를 텅빈상태로 비워줌/

System.out.println("1번째 선수 이름>>" + name1);
 String name1 = sc1.nextLine();
 이렇게 쓰셔야되요


//이건오류
 String name1 = sc1.nextLine();
      String name2 = sc2.nextLine();
      System.out.println("1번째 선수 이름>>" + name1);
      System.out.println("2번째 선수 이름>>" + name2);

그리고 난수를 전부 같은 배열에 대입하셨어요 
두사람이 다른 배열을 가져야 될거 같아요




==========================
void add(Product p) {

      if (i >= cart.length) { //i=3 일때 실행
         Product[] doubleCart = new Product[cart.length * 2];
         System.arraycopy(cart, 0, doubleCart, 0, cart.length); // p의 0번부터 cart.length길이만큼 doubleCart에 복사
         cart = doubleCart; // 기존-> 새로운 장바구니
         cart[i] = p; // i=3 이기 때문에 복사한 다음번지부터 저장가능

      } else { // 장바구니보다 크지 않다면
         cart[i] = p;
         
      }
      i++; // 장바구니 크기 하나증가 else 문에 쓰면x 3일때 i가 증가x

   }

===========================
[위성일] [오후 6:47] newCart에 기존카트에 있던걸 복사하겠죠?
[위성일] [오후 6:47] 그럼 이제 여기서 중요해요
[위성일] [오후 6:47] 기존카트에 새로운카트로
[위성일] [오후 6:47] 바꿔 줘야해요
[위성일] [오후 6:47] 여긴 생각보다 매우 간단해요
[최현진] [오후 6:47] 주석에서 초기화 하래서
[최현진] [오후 6:47] 하긴 했는데
[최현진] [오후 6:47] 네네
[위성일] [오후 6:47] cart = newCart;

 

 

9번. 그대로 복붙했는데 오류뜸;;;

package java_1214;

public class BuyerMain {
	public static void main(String args[]) {
		Buyer b = new Buyer();
		b.buy(new Tv());
		b.buy(new Computer());
		b.buy(new Tv());
		b.buy(new Audio());
		b.buy(new Computer());
		b.buy(new Computer());
		b.buy(new Computer());
		
		b.summary();
	}
}
package java_1214;

class Buyer {
	int money = 1000;
	Product[] cart = new Product[3]; // 구입한 제품을 저장하기 위한 배열
	int i = 0;

	void buy(Product p) {
		if (money < p.price) {
			System.out.println("잔액이 부족하여" + p + "을 살수 없습니다.");
			return;
		}
		// 2.가진독 충분하면
		money -= p.price;

		// 3.장바구니에 물건을 담는다.
		add(p);
	}

	void add(Product p) {
		// 1. i의 값이 장바구니의 크기보다 같거나 크면 배열2배 늘려줘야한다.

		if (i > cart.length) {
			// 1. 기존의 장바구니보다 2배 더 큰 배열 생성
			Product[] temp = new Product[cart.length * 2]; // ★이 두줄 공식이니 외우기
			// 2. 기존에 있는 내용을 복사.
			System.arraycopy(cart, 0, temp, 0, cart.length);

			cart = temp; // 간단하게 이렇게 표현가능
		}
		cart[i++] = p; // *주의*후위연산이기 때문에 조심!
						// 원랜 cart[i] = p; i++ 를 한번에 합친것임
	}

	void summary() {
		String itemList = "";
		int sum = 0;// 초기화시켜주기

		for (int i = 0; i < cart.length; i++) {
			if (cart[i] == null)
				break;

			// 1 . 장바구니에 담긴 물건들의 목록을 만들어 출력한다
			itemList += cart[i] + ",";
			// 2. 장바구니에 담긴 물건들의 가격을 모두 더해서 출력한다
			sum += cart[i].price;
		}
			System.out.println("구입한 물건은:" + itemList);
			System.out.println("사용금액:" + sum);
			System.out.println("남은금액:" + money);

		}
	}


class Product {
	int price;

	Product(int price) {
		this.price = price;
	}

}

class Tv extends Product {
	Tv() {
		super(100);
	}

	@Override
	public String toString() {
		return "Tv";
	}
}

class Computer extends Product {
	Computer() {
		super(500);
	}

	@Override
	public String toString() {
		return "Computer";
	}

}

class Audio extends Product {

	Audio() {
		super(300);
	}

	@Override
	public String toString() {
		return "Audio";
	}

}
728x90

'코딩 > 수업 정리' 카테고리의 다른 글

20.12.14 Mon [016]  (0) 2020.12.14
질문,헷갈리는 거 정리  (0) 2020.12.13
20.12.10 Thu [014]  (0) 2020.12.10
20.12.09 Wed [013]  (0) 2020.12.09
20.12.08 Tue [012]  (0) 2020.12.08

댓글