- 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";
}
}
'코딩 > 수업 정리' 카테고리의 다른 글
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 |
댓글