1. is a 관계와 has a 관계에 대하여 설명하시오.

  • ia a: 상하 관계가 분명한 두 클래스가 가지는 특성
  • ex) 자식 is a 부모
  • has a: 하위 분류 클래스가 여러개로 가지는 상하 관계가 불분명한 특성
  • ex) 아이폰, 갤럭시, G has a 스마트폰

 

 

2. 다형성이란 무엇인가?

: 부모 클래스는 곧 자식 클래스(부모 = 자식)가 되는 성질을 가진 객체지향프로그래밍 기법 중 하나이다.

SubCLS cls1 = new Sub(); // 일반적인 상속받은 클래스의 객체 생성 
SupCLS cls2 = new Sub(); // 다형성을 이용하면 상위객체 타입으로도 하위 클래스의 객체가 생성가능하다.

 

 

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

SmartPhone s = new MobilePhone(); // MobilePhone(부모) SmartPhone(자식)

 

 

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

: 메소드 오버라이딩(Overriding) 상위와 하위 클래스 모두 같은 반환 타입, 이름, 파라미터 수를 가진 메소드가 존재할 때, 하위 클래스의 메소드의 구현부만이 출력하게 되는 특성을 지니는 기법이다.

// 상위 클래스 
class Cake { 
    public void yummy() { 
    	System.out.println("Yummy Cake"); 
    } 
} 


// 하위 클래스 
class CheeseCake extends Cake {
    @Override // Annotation 표기로 오버라이드 메소드임을 컴파일에 명시하여, 이러한 방법이 적용되지 않은 메소드인 경우 컴파일 에러가 뜨게 한다. 
    public void yummy() { // 메소가 상위 클래스와 반환타입, 이름이 서로 동일 
    	System.out.println("Yummy Cheese Cake"); 
    } 
} 


// 메인 클래스 
class MyCake {
    public static void main(String[] args) { 
        Cake cake = new CheeseCake(); // 상위 = new 하위 
        CheeseCake cheeseCake = new CheeseCake(); // 하위 = new 하위 
        cake.yummy(); // 메소드 오버라이딩이 적용 cheeseCake.yummy(); 
    } 
}

 

> Yummy Cheese Cake > Yummy Cheese Cake

 

 

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

> 1번째 선수 이름>>수희
> 2번째 선수 이름>>연수

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

 

5-1. 메인 클래스

public class GamblingMain { 
    public static void main(String[] args) { 
        Gambling gambling = new Gambling(); 
        gambling.getGame();
    } 
}

 

5-2. Gambling 클래스(참조 클래스)

import java.util.Random; 
import java.util.Scanner;

public class Gambling {
    private int i,j;
    private final int NUM = 2; // 참가 선수 인원 설정
    Scanner scanner = new Scanner(System.in);
    Random random = new Random();
    Person[] person = new Person[NUM]; // 선수 
    Person[][] card = new Person[NUM][3]; // 카드

    private void inputPlayer() { // 선수 이름 입력 
        for (i = 0; i < person.length; i++) { 
            System.out.print((i+1) + "번째 선수 이름>>"); 
            String user = scanner.nextLine(); 
            person[i] = new Player(user); 
        } 
    }

    public void getGame () { 
        inputPlayer(); 
        
        loop:
        while (true) { 
            for (i = 0; i < card.length; i++) { // 카드 패 돌리기 
                for (j = 0; j < card[i].length; j++) { 
                    int cdnum = random.nextInt(3) + 1;
                    card[i][j] = new CardNum(cdnum); 
                } 
            } 

            for (i = 0; i < card.length; i++) { 
                System.out.print("[" + person[i].getUser() + "]:");
                scanner.nextLine(); // 엔터키를 입력하여 턴 넘기기
                
                for (j = 0; j < card[i].length; j++) {
                	System.out.print(card[i][j].getCard() + " "); // 한 줄마다 세 개씩 출력
                } 
                
                if ((card[i][0].getCard() == card[i][1].getCard()) 
                  && (card[i][0].getCard() == card[i][2].getCard())) { // 세 패 모두 숫자가 같은지 비교 
                    System.out.println(person[i].getUser() + "님이 이겼습니다!"); 
                    break loop;
                } else { 
                	System.out.println("아쉽군요!"); 
                } 
            } 
        }
    } 
}

 

5-3. Person 클래스(상위 클래스)

public class Person { 
    private int card; 
    private String user;

    public Person(int card) {
    	this.card = card;
    }

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

    public String getUser() { 
    	return user; 
    } 

    public void setUser(String user) { 
    	this.user = user; 
    }

    public int getCard() {
    	return card;
    } 

    public void setCard(int card) { 
    	this.card = card;
    } 
}

 

5-4. Player 클래스(하위 클래스 extends Person)

public class Player extends Person{ 
    public Player(String user) { 
    	super(user); 
    } 
}

 

5-5. CardNum 클래스(하위 클래스 extends Person)

public class CardNum extends Person {
    public CardNum(int card) { 
    	super(card);
    }
}

 

 

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
> 황님이 이겼습니다!

 

6-1. 메인 클래스

public class GamblingMain { 
    public static void main(String[] args) { 
        Gambling gambling = new Gambling(); 
        gambling.getGame();
    } 
}

 

6-2. Gambling 클래스(참조 클래스)

import java.util.Random; 
import java.util.Scanner;

public class Gambling {
    private int i,j; 
    private final int NUM; // 참가 선수 인원 설정 
    Scanner scanner = new Scanner(System.in); 
    Random random = new Random();
    Person[] person = new Person[NUM]; // 선수 
    Person[][] card = new Person[NUM][3]; // 카드

    private void inputPlayer() { // 선수 숫자 및 이름 입력 
        System.out.print("겜블링 게임에 참여할 선수 숫자>>") 
        NUM = scanner.nextInt(); 

        for (i = 0; i < person.length; i++) {
            System.out.print((i+1) + "번째 선수 이름>>"); 
            String user = scanner.nextLine(); 
            person[i] = new Player(user); 
        }
    }

    public void getGame () {
        inputPlayer(); 
        
        loop:
        while (true) {
            for (i = 0; i < card.length; i++) { // 카드 패 돌리기
                for (j = 0; j < card[i].length; j++) { 
                    int cdnum = random.nextInt(3) + 1; 
                    card[i][j] = new CardNum(cdnum);
                } 
            } 

            for (i = 0; i < card.length; i++) {
                System.out.print("[" + person[i].getUser() + "]:");
                scanner.nextLine(); // 엔터키를 입력하여 턴 넘기기
                
                for (j = 0; j < card[i].length; j++) {
                	System.out.print(card[i][j].getCard() + " "); // 한 줄마다 세 개씩 출력
            	}

                if ((card[i][0].getCard() == card[i][1].getCard()) 
                  && (card[i][0].getCard() == card[i][2].getCard())) { // 세 패 모두 숫자가 같은지 비교
                    System.out.println(person[i].getUser() + "님이 이겼습니다!"); 
                    break loop;
                } else { 
                    System.out.println("아쉽군요!"); 
                } 
            } 
        }
    } 
}

 

6-3. Person 클래스(상위 클래스)

public class Person {
    private int card; 
    private String user; 

    public Person(int card) { 
    	this.card = card; 
    }

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

    public String getUser() {
    	return user;
    } 

    public void setUser(String user) { 
    	this.user = user; 
    } 

    public int getCard() { 
    	return card;
    }

    public void setCard(int card) {
    	this.card = card; 
    }
}

 

6-4. Player 클래스(하위 클래스 extends Person)

public class Player extends Person{ 
    public Player(String user) {
    	super(user);
    } 
}

 

6-5. CardNum 클래스(하위 클래스 extends Person)

public class CardNum extends Person { 
    public CardNum(int card) {
    	super(card);
    }
}

 

 

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

(8번문제부터는 이것과 관련된 문제입니다).

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

 

7-1. HumanAffairsMain(메인 클래스)

public class HumanAffairsMain {
    public static void main(String[] args) { 
        HumanAffairs humanAffairs = new HumanAffairs();
        humanAffairs.printInfo(); // 직원 정보 출력 
    } 
}

 

7-2. HumanAffair(참조 클래스)

import java.util.Scanner;

public class HumanAffairs {
    Scanner scanner = new Scanner(System.in);
    Employee regular = new Regular();
    Employee temporary = new Temporary(); 
    int age; // 나이
    String name; // 이름 
    String address; // 주소
    String department; // 부서

    // 정규직 
    private String writeRegularName() { 
        System.out.print("당신의 이름을 입력하시오. >> ");
        name = scanner.next(); 
        regular.setName(name);

        return regular.getName(); 
    } 

    private int writeRegularAge() { 
        System.out.print("당신의 나이를 입력하시오. >> ");
        age = scanner.nextInt(); 
        regular.setAge(age); 

        return regular.getAge(); 
    } 

    private String writeRegularAddress() { 
        System.out.print("당신의 주소를 입력하시오. >> "); 
        address = scanner.next();
        regular.setAddress(address); 

        return regular.getAddress(); 
    }

    private String writeRegularDepartment() { 
        System.out.print("당신의 부서를 입력하시오. >> "); 
        department = scanner.next();
        regular.setDepartment(department);

        return regular.getDepartment(); 
    } 

    // 비정규직 
    private String writeTemporaryName() { 
        System.out.print("당신의 이름을 입력하시오. >> "); 
        name = scanner.next(); 
        temporary.setName(name); 

        return temporary.getName();
    } 

    private int writeTemporaryAge() {
        System.out.print("당신의 나이를 입력하시오. >> ");
        age = scanner.nextInt(); 
        temporary.setAge(age); 

        return temporary.getAge(); 
    } 

    private String writeTemporaryAddress() { 
        System.out.print("당신의 주소를 입력하시오. >> "); 
        address = scanner.next();
        temporary.setAddress(address); 

        return temporary.getAddress();
    } 

    private String writeTemporaryDepartment() { 
        System.out.print("당신의 부서를 입력하시오. >> ");
        department = scanner.next();
        temporary.setDepartment(department); 

        return temporary.getDepartment();
    } 

    private void getInfo() { // 예시용으로 정규직 정보만 가져오기
        writeRegularName();
        writeRegularAge();
        writeRegularAddress(); 
        writeRegularDepartment(); 
    } 

    public void printInfo() { // 정보 출력 
        getInfo(); 
        System.out.println(regular.toString()+ " " + regular.getName() + "님의 직원 정보는 다음과 같습니다.");
        System.out.println(); 
        System.out.println("------------------------------------");
        System.out.println("이 름:\t" + regular.getName());
        System.out.println("나 이:\t" + regular.getAge());
        System.out.println("주 소:\t" + regular.getAddress()); 
        System.out.println("부 서:\t" + regular.getDepartment()); 
    } 
}

 

7-3. Employee(상위 클래스)

public class Employee { 
    int age; // 나이 
    int salary; // 급여
    String name; // 이름
    String address; // 주소
    String department; // 부서

    public Employee() { } 

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

    public int getAge() { 
    	return age;
    } 

    public void setAge(int age) {
    	this.age = age; 
    }

    public int getSalary() {
    	return salary;
    } 

    public void setSalary(int salary) { 
    	this.salary = salary;
    } 

    public String getName() { 
    	return name;
    } 

    public void setName(String name) { 
    	this.name = name; 
    } 

    public String getAddress() { 
    	return address; 
    } 

    public void setAddress(String address) { 
    	this.address = address; 
    } 

    public String getDepartment() {
    	return department; 
    } 

    public void setDepartment(String department) { 
    	this.department = department;
    } 
}

 

7-4. Regular(하위 클래스 extends Employee)

public class Regular extends Employee {
    public Regular() { }

    public Regular(String name, int age, int salary, String address, String department) { 
    	super(name, age, salary, address, department); 
    } 

    @Override public int getAge() {
    	return age;
    } 

    @Override public void setAge(int age) {
    	this.age = age; 
    }

    @Override public int getSalary() {
    	return salary; 
    } 

    @Override public void setSalary(int salary) { 
    	this.salary = salary;
    } 

    @Override public String getName() { 
    	return name; 
    }

    @Override public void setName(String name) {
    this.name = name;
    } 

    @Override public String getAddress() {
    	return address; 
    } 

    @Override public void setAddress(String address) {
    	this.address = address; 
    } 

    @Override public String getDepartment() { 
    	return department; 
    }

    @Override public void setDepartment(String department) { 
    	this.department = department; 
    } 

    public String toString() { 
    	return "정규직";
    } 
}

 

7-5. Temporary(하위 클래스 extends Employee)

public class Temporary extends Employee {
    public Temporary() { } 

    public Temporary(String name, int age, int salary, String address, String department) { 
    	super(name, age, salary, address, department); 
    } 

    @Override public int getAge() {
    	return age; 
    } 

    @Override public void setAge(int age) {
    	this.age = age; 
    }

    @Override public int getSalary() {
    	return salary;
    } 

    @Override public void setSalary(int salary) {
    	this.salary = salary;
    } 

    @Override public String getName() { 
    	return name; 
    } 

    @Override public void setName(String name) { 
    	this.name = name;
    } 

    @Override public String getAddress() {
    	return address;
    } 

    @Override public void setAddress(String address) { 
    	this.address = address;
    } 

    @Override public String getDepartment() { 
    	return department; 
    } 

    @Override public void setDepartment(String department) {
    	this.department = department; 
    } 

    public String toString() {
    	return "비정규직"; 
    }
}

 

 

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

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

 

8-1. HumanAffairsMain(메인 클래스)

public class HumanAffairsMain {
    public static void main(String[] args) {
        HumanAffairs humanAffairs = new HumanAffairs(); 
        humanAffairs.printInfo(); // 직원 정보 출력 
    }
}

 

8-2. HumanAffair(참조 클래스)

import java.util.Scanner; 

public class HumanAffairs { 
    Scanner scanner = new Scanner(System.in);
    Employee regular = new Regular();
    Employee temporary = new Temporary();
    int age; // 나이
    int salary; // 급여
    String name; // 이름
    String address; // 주소
    String department; // 부서

    // 정규직
    private String writeRegularName() {
        System.out.print("당신의 이름을 입력하시오. >> "); 
        name = scanner.next(); 
        regular.setName(name); 

        return regular.getName();
    } 

    private int writeRegularAge() {
        System.out.print("당신의 나이를 입력하시오. >> ");
        age = scanner.nextInt(); 
        regular.setAge(age);

        return regular.getAge();
    } 

    private String writeRegularAddress() {
        System.out.print("당신의 주소를 입력하시오. >> "); 
        address = scanner.next(); 
        regular.setAddress(address); 

        return regular.getAddress(); 
    } 

    private String writeRegularDepartment() {
        System.out.print("당신의 부서를 입력하시오. >> ");
        department = scanner.next();
        regular.setDepartment(department); 

        return regular.getDepartment();
    } 

    private int writeRegularSalary() { 
        System.out.print("당신의 급여를 입력하시오. >> ");
        salary = scanner.nextInt(); 
        regular.setSalary(salary); 

        return regular.getSalary(); 
    } 

    private void getInfo() { // 정보 가져오기
        writeRegularName();
        writeRegularAge();
        writeRegularAddress(); 
        writeRegularDepartment();
        writeRegularSalary(); 
    } 

    public void printInfo() { // 정보 출력 
        getInfo(); 
        System.out.println(regular.toString()+ " " + regular.getName() + "님의 직원 정보는 다음과 같습니다.");
        System.out.println(); 
        System.out.println("------------------------------------"); 
        System.out.println("이 름:\t" + regular.getName()); 
        System.out.println("나 이:\t" + regular.getAge());
        System.out.println("주 소:\t" + regular.getAddress());
        System.out.println("부 서:\t" + regular.getDepartment());
        System.out.println("급 여:\t" + regular.getSalary());
    }
}

 

8-3. Employee(상위 클래스)

public class Employee {
    int age; // 나이
    int salary; // 급여
    String name; // 이름 
    String address; // 주소
    String department; // 부서

    public Employee() { } 

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

    public int getAge() { 
    	return age;
    } 

    public void setAge(int age) {
    	this.age = age;
    } 

    public int getSalary() { 
    	return salary; 
    } 

    public void setSalary(int salary) {
    	this.salary = salary; 
    }

    public String getName() { 
    	return name;
    } 

    public void setName(String name) { 
    	this.name = name; 
    }

    public String getAddress() { 
    	return address; 
    } 

    public void setAddress(String address) { 
    	this.address = address;
    }
    
    public String getDepartment() { 
    	return department;
    }

    public void setDepartment(String department) {
    	this.department = department;
    }
}

 

8-4. Regular(하위 클래스 extends Employee)

public class Regular extends Employee { 
    public Regular() { } 

    public Regular(String name, int age, int salary, String address, String department) { 
    	super(name, age, salary, address, department);
    } 

    @Override public int getAge() {
    	return age;
    }

    @Override public void setAge(int age) {
    	this.age = age;
    }

    @Override public int getSalary() { 
    	return salary;
    } 

    @Override public void setSalary(int salary) {
    	this.salary = salary;
    } 

    @Override public String getName() { 
    	return name;
    } 

    @Override public void setName(String name) {
    	this.name = name; 
    } 

    @Override public String getAddress() {
    	return address; 
    }

    @Override public void setAddress(String address) {
    	this.address = address; 
    } 

    @Override public String getDepartment() { 
    	return department; 
    } 

    @Override public void setDepartment(String department) { 
    	this.department = department; 
    } 

    public String toString() {
    	return "정규직";
    }
}

'WebDev > 본과정' 카테고리의 다른 글

인터페이스 심화 및 예외처리  (0) 2021.05.12
객체 비교와 인터페이스  (0) 2021.05.12
정렬 심화와 상속  (0) 2021.05.12
배열의 탐색 및 정렬  (0) 2021.05.12
String 클래스의 메소드 및 배열 기초  (0) 2021.05.12