티스토리 뷰
1. is a 관계와 has a 관계란?
A(자식 클래스)는 B(부모 클래스)이다.
ex) 까마귀는 새이다. 고래는 동물이다. 사과는 과일이다 등등....
(애매할 때는 상속을 사용하면 안된다. 애매하면 has a 관계이다.)
ex) 메모리는 컴퓨터이다.(HAS-A 관계) - 컴퓨터가 메모리를 가진다.
2.다형성(polymorphism)이란 무엇인가?
부모 = 자식(feat: 형 변환 없이) // 오버라이딩은 자식꺼(부모 클래스에 자식 클래스를 메모리에 올릴 수 있다.)
부모 = new 자식;
폴리몰티즘을 이용하면 데이터 타입이 달라도 한번에 해결가능! 대표적인 예가 도형의 넓이를 구할 때 아래와 같이 만들어 주는 것. (부모 클래스로 Shape를 만들어 주고, 자식 클래스로 원, 사각형, 삼각형 등등 만들어 주고, 배열로 객체를 생성한다.)
package edu.kosmo.ex.shape;
public class Shape {
public double getArea() {
return 0;
}
}
package edu.kosmo.ex.shape;
public class Circle extends Shape{
private double r;
public Circle(double r) {
this.r = r;
}
public double getArea() {
return r * r * Math.PI;
}
}
package edu.kosmo.ex.shape;
public class Rectangle extends Shape{
private int width, height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public double getArea() {
return width * height;
}
}
package edu.kosmo.ex.main;
import edu.kosmo.ex.shape.Circle;
import edu.kosmo.ex.shape.Rectangle;
import edu.kosmo.ex.shape.Shape;
import edu.kosmo.ex.shape.Trangle;
public class PolyTest2 {
public static void main(String[] args) {
// 폴리몰티즘 적용
Shape[] shape = {new Circle(10), new Rectangle(10, 10)};
//계속 객체 추가 가능.
double sum = 0;
for (Shape shape2 : shape) {
sum += shape2.getArea();
}
System.out.println(sum);
// 이전에 배웠던 방식
Circle circle = new Circle(10);
Rectangle rec = new Rectangle(10, 10);
double totalArea = circle.getArea() + rec.getArea();
System.out.println(totalArea);
}
}
둘다 출력 값은 414.1592653589793로 같다.
3. 아래가 되지 않는 이유에 대하여 메모리 그림으로 설명하시오.
//MobilePhone(부모) SmartPhone(자식)
SmartPhone ph2 = new MobilePhone();
4.메소드 오버라이딩(Overriding) 이란?
◈ 메소드 오버라이딩
상속 관계에서 같은 함수(타입, 함수명, 파라미터 값이 같다)로 바디(함수 안의 내용)만 달리 한 것.
오버라이딩은 자식꺼.... 무조건 자식이 함수가 실행된다.
메모리 상에서는 함수가 같을 경우 부모 함수를 자식 함수 주소로 바꿔버린다.자식 클래스에 @override를 붙여주면 보기 편하고 프로그램이 오류가 있는지 확인해 준다.
◈ 메소드 오버로딩
같은 함수 이름에 타입이나 파라미터 갯수를 달리한 것. 대표적인 예시가 println. (상속이랑 관련 없음)
5.자바의 정석: 연습 문제 56page - 3개의 함수를 완성 하시오.
package edu.kosmo.ex.main;
import javax.swing.text.StyledEditorKit.ForegroundAction;
class Exercise7_19 {
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();
}
}
class Buyer {
int money = 1000;
Product[] cart = new Product[3]; // 구입한 제품을 저장하기 위한 배열
int i = 0; // Product배열 cart에 사용될 index
void buy(Product p) {
if(money < p.price) {
System.out.println("잔액이 부족하여 " + p.toString() + "을/를 살수 없습니다.");
}
else {
money -= p.price;
add(p);
}
/*
(1) . 아래의 로직에 맞게 코드를 작성하시오
1.1 . 가진 돈과 물건의 가격을 비교해서 가진 돈이 적으면 메서드를 종료한다
1.2 , 가진 돈이 충분하면 제품의 가격을 가진 돈에서 빼고
1.3 .장바구에 구입한 물건을 담는다(add 메소드 호출)
*/
}
void add(Product p) {
if(i >= cart.length) {
Product[] cart1 = new Product[cart.length * 2];
System.arraycopy(cart, 0, cart1, 0, cart.length);
cart = cart1;
}
cart[i] = p;
i++;
/*
(2) . 아래의 로직에 맞게 코드를 작성하시오
1.1 i의 값이 장바구니의 크기보다 같거나 크면
1.1.1 . 기존의 장바구니보다 2배 큰 새로운 배열을 생성한다
1.1.2 . 기존의 장바구니의 내용을 새로운 배열에 복사한다
1.1.3 . 새로운 장바구니와 기존의 장바구니를 바꾼다
1.2 물건을 장바구니(cart) 에 저장한다 그리고 i 의 값을 1 증가시킨다
*/
} // add(Product p)
void summary() {
System.out.print("구입한 물건:");
for (Product product : cart) {
System.out.print(product + ",");
}
System.out.print("\n" + "사용한 금액:");
int sum = 0;
for (Product product : cart) {
sum += product.price;
}
System.out.print(sum);
System.out.println("\n" + "남은 금액:" + money);
/*
(3) . 아래의 로직에 맞게 코드를 작성하시오
1.1 . 장바구니에 담긴 물건들의 목록을 만들어 출력한다
1.2 . 장바구니에 담긴 물건들의 가격을 모두 더해서 출력한다
1.3 . 물건을 사고 남은 금액(money) 를 출력한다
*/
} // summary()
}
class Product {
int price; // 제품의 가격
Product(int price) {
this.price = price;
}
}
class Tv extends Product {
Tv() {
super(100);
}
public String toString() {
return "Tv";
}
}
class Computer extends Product {
Computer() {
super(200);
}
public String toString() {
return "Computer";
}
}
class Audio extends Product {
Audio() {
super(50);
}
public String toString() { return "Audio"; }
}
summary()부분의 foreach문 두개는 아래와 같이 표현 할 수도 있다.
// 구입한 물건
for(int i = 0; i < cart.length; i++) {
System.out.print(cart[i] + ",");
}
// 사용한 금액
for(int i = 0; i < cart.length; i++) {
sum += cart[i].price;
}
toString()함수가 있으면 println에 바로 적어도 오류가 나지 않는다. 굳이 toString()를 호출하지 않아도 된다!
6. 갬블링 게임을 만들어 보자. (문제 5번 과 6번은 상속은 안써도됨)
두 사람이 게임을 진행한다.
이들의 이름을 키보드로 입력 받으며
각 사람은 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 수희님이 이겼습니다!
import java.util.Scanner;
class Person {
private String name;
private int num1, num2, num3;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public boolean game() {
num1 = (int)(Math.random() * 3 + 1);
num2 = (int)(Math.random() * 3 + 1);
num3 = (int)(Math.random() * 3 + 1);
System.out.print(num1 + " " + num2 + " " + num3 + " ");
if(num1 == num2 && num2 == num3) {
return true;
}
return false;
}
}
public class GamblingTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("1번째 선수 이름>>");
String name = sc.next();
Person p1 = new Person(name);
System.out.println("2번째 선수 이름>>");
name = sc.next();
Person p2 = new Person(name);
String buffer = sc.nextLine();
// 엔터키가 남아 있는 것을 비움, 엔터키 받아내기 위한 입력
while (true) {
System.out.print("[" + p1.getName() + "]:");
buffer = sc.nextLine();
if(p1.game()) {
System.out.println("[" + p1.getName() + "]:" + "님이 이겼습니다.");
return;
}
System.out.println("아쉽군요");
System.out.print("[" + p2.getName() + "]:");
buffer = sc.nextLine();
if(p2.game()) {
System.out.println( p2.getName() + "님이 이겼습니다.");
return;
}
System.out.println("아쉽군요");
}
}
}
▷ Java에서 Return은 두가지 기능을 한다.
첫째로 단어 그 의미대로 반환값을 반환해주는 역할을 한다.
둘째로 해당 메소드를 그 즉시 종료시켜주는 역할을 한다.
7. 프로그래밍
문제 5의 갬블링 게임을 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 황님이 이겼습니다!
import java.util.Scanner;
class Person0{
private String name;
private int num1, num2, num3;
public Person0(String name) {
this.name = name;
}
public String getName() {
return name;
}
public boolean game() {
num1 = (int)(Math.random() * 3 + 1);
num2 = (int)(Math.random() * 3 + 1);
num3 = (int)(Math.random() * 3 + 1);
System.out.print(num1 + " " + num2 + " " + num3 + " ");
if(num1 == num2 && num2 == num3) {
return true;
}
return false;
}
}
public class GamblingTest2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("겜블링 게임에 참여할 선수 숫자>>");
int num = sc.nextInt();
Person[] arrPerson = new Person[num];
for(int i = 0; i < arrPerson.length; i++) {
System.out.println((i + 1) + "번쨰 선수 이름>>");
String name = sc.next();
arrPerson[i] = new Person(name);
}
String buffer = sc.nextLine();
// 엔터키가 남아 있는 것을 비움, 엔터키 받아내기 위한 입력
while (true) {
for(int i = 0; i < arrPerson.length; i++) {
System.out.print("[" + arrPerson[i].getName() + "]:");
buffer = sc.nextLine();
if(arrPerson[i].game()) {
System.out.println("[" + arrPerson[i].getName() + "]:" + "님이 이겼습니다.");
return;
}
System.out.println("아쉽군요");
}
}
}
}
'수업문제' 카테고리의 다른 글
[문제] 10월 26일 (Object, interface, abstract) (0) | 2021.10.26 |
---|---|
[문제] 10월 25일 (instanceof, 상속) (0) | 2021.10.25 |
[문제] 10월 21일 (상속) (0) | 2021.10.21 |
[문제]10월 20일 (배열, arraycopy, for-each문) (0) | 2021.10.21 |
- Total
- Today
- Yesterday
- exception
- 예외처리
- SOCKET
- Generic
- string
- hashset
- 채팅
- TreeSet
- equals
- Request
- 참조형
- 부트스트랩
- 입출력
- 세션
- 프로토콜
- Session
- toString
- Servlet
- 진척도 70번
- 제네릭
- JSP
- 사칙연산 계산기
- 쓰레드
- el
- response
- abstract
- object
- compareTo
- 쿠키
- 래퍼 클래스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |