JAVA 12일차

MOZZI KIM·2022년 11월 8일
0

JAVA

목록 보기
12/21
post-thumbnail

1. is a 관계와 has a 관계.


2. 다형성(polymorphism)이란?

📌 다형성이란(polymorphism)?

부모-자식 상속 관계에 있는 클래스에서 상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리.

다형성을 활용하면 부모 클래스가 자식 클래스의 동작 방식을 알수 없어도 ⭐오버라이딩⭐을 통해 자식 클래스를 접근할 수 있다.


📌어떻게 부모가 자식이 어떤 일을 하는 지 몰라도, 자식 멤버 함수를 호출시킬 수 있을까?

동적 바인딩 때문이다.

  • 동적바인딩이란?
    메서드가 실행 시점에서 성격이 결정되는 바인딩이다.
    프로그램의 컴파일 시점에 부모 클래스는 자신의 멤버 함수밖에 접근할 수 없으나,
    실행 시점에 동적 바인딩이 일어나 부모클래스가 자식 클래스의 멤버함수를 접근하여 실행할 수 있다.

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();   //자식 = 부모, 에러남
		//왜 에러? 부모 만 메모리에 올라가고 자기것을 메모리에 올리지 않아서 당연히 안됨
	}	
}


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

SmartPhone ph2 = new MobilePhone();

4. 다음을 만족하는 클래스 Employee를 작성.

- 클래스 Employee(직원)은 클래스 Regular(정규직)Temporary(비정규직)의 상위 클래스
- 필드: 이름, 나이, 주소, 부서, 월급 정보를 필드로 선언
- 생성자 : 이름, 나이, 주소, 부서를 지정하는 생성자 정의
- 메소드 printInfo() : 인자는 없고 자신의 필드 이름, 나이, 주소, 부서를 출력

class Employee {
	String name, addr, dept, money;
	int age;

	public Employee(String name, int age, String addr, String dept) {
		this.name = name;
		this.age = age;
		this.addr = addr;
		this.dept = dept;
	}

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

public class ggigigigi {
	public static void main(String[] args) {
		Employee employee = new Employee("권혁우", 34, "서울 강북구", "개발 1팀");
		employee.printInfo();
	}
}

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

Series_02 (필수)
클래스 Regular는 위에서 구현된 클래스 Employee의 하위 클래스
생성자 : 이름, 나이, 주소, 부서를 지정하는 상위 생성자 호출
Setter : 월급 정보 필드를 지정
메소드 printInfo() : 인자는 없고 "정규직"이라는 정보와 월급을 출력


class Employee {
	String name, addr, dept, money;
	int age;

	public Employee(String name, int age, String addr, String dept) {
		this.name = name;
		this.age = age;
		this.addr = addr;
		this.dept = dept;
	}

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

class Regular extends Employee {
	public Regular(String name, int age, String addr, String dept) {
		super(name, age, addr, dept);
	}

	public void setMoney(String money) {
		super.money = money;
	}
	public void printInfo() {
		System.out.println();
		super.printInfo();
		System.out.println("나는 정규직");
		System.out.println("월급 : " + super.money );
	}

}

public class ggigigigi {
	public static void main(String[] args) {
		Employee employee = new Employee("권혁우", 34, "서울 강북구", "개발 1팀");
		employee.printInfo();

		Regular regular = new Regular("박재범", 35, "서울 강남구", "인사팀");
		regular.setMoney("500만원");
		regular.printInfo();
	}
}

=================================================================================================
👉 결과
이름 : 권혁우
나이 : 34
주소 : 서울 강북구
부서 : 개발 1팀

이름 : 박재범
나이 : 35
주소 : 서울 강남구
부서 : 인사팀
나는 정규직
월급 : 500만원

6. 갬블링 게임 코딩테스트

(Main 안에서 모든 로직을 처리하지 말고, class로 만들어서 활용해 보도록 합시다.)
두 사람이 게임을 진행한다. 
이들의 이름을 키보드로 입력 받으며 각 사람은 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.*;

class Person {
	String name;
	int[] rarr = new int[3];

	public Person(String name) {
		this.name = name;
	}

	public boolean Game() {
		boolean state = true;

		for (int i = 0; i < rarr.length; i++) {
			rarr[i] = (int) (Math.random() * 3) + 1;
			System.out.print(rarr[i] + " ");
		}
		for (int i = 0; i < rarr.length; i++) {
			if (rarr[0] != rarr[i]) {
				state = false;
				break;
			}
		}
		return state;
	}
}

public class gamblering {

	public static void main(String[] args) {
		String name, buffer;
		Scanner sc = new Scanner(System.in);

		System.out.print("1번째 선수 이름>> ");
		name = sc.next();
		Person p1 = new Person(name);

		System.out.print("2번째 선수 이름>> ");
		name = sc.next();
		Person p2 = new Person(name);

		while (true) {

			System.out.println(p1.name + "님 <Enter>를 눌러주세요");
			buffer = sc.nextLine();

			if (p1.Game()) {
				System.out.println(p1.name + "님이 이겼습니다!");
				break;
			}
			System.out.println(">> 아쉽군요!\n");

			System.out.print(p2.name + "님 <Enter>를 눌러주세요");
			buffer = sc.nextLine();
			if (p2.Game()) {
				System.out.println(p2.name + "님이 이겼습니다!");
				break;
			}
			System.out.println(">> 아쉽군요!\n");
		}
		sc.close();

	}

}
profile
코린이

0개의 댓글