티스토리 뷰

학습정리-10-22.txt
0.00MB

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("아쉽군요");
				
			}
			
		
		}

	}

}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함