본문 바로가기

bitcamp/면접족보

면접족보 20/12/11_다형성, 오버라이딩

1. Is~A 관계와 Has~A 관계란?

· is~a관계: '..은 ..이다' 의미를 지니며, "노트북은 컴퓨터이다", "전기자동차는 차이다" 예시와 같이 상속 관계의 형태를 가진다.

· has~a 관계: "CPU와 mainboard는 컴퓨터를 구성한다" 예시와 같이 포함/구성 관계의 형태를 가진다.

 (is~a 조금이라도 의심스럽다면 has a로 표현)

 

 

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

· 부모 = 자식(without 형변환), 부모 클래스는 자식 클래스를 참조하여 다형성 구현이 가능하다.

 (쉽게 말해, 하나의 객체를 여러 가지 타입으로 선언하여 사용가능)

· ex) class A를 상속받는 class B, C, D 모두를 class A는 참조가능

 

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

· SmartPhone ph1 = new MobilePhone(); 객체 생성이 불가하다.

  why? 부모클래스에는 자식클래스의 함수와 변수가 존재하지 않기 때문에 참조할 수 없다.

· MobilePhone ph2 = new SmartPhone(); 객체 생성은 가능하지만 함수사용은 불가하다.

  why? 메모리에 부모클래스가 먼저 저장된 후, 자식클래스가 저장되기 때문에 객체 생성까지는 가능하지만

          ph2는 Moblie 타입이기 때문에 Moblie까지만 사용가능하다.(smatr 함수에 접근 불가)

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

· 상속관계에서 리턴타입, 함수명, 파라미터가 동일한 경우 자식클래스에서 재정의하여 사용하는 것을

  메소드 오버라이딩이라 일컬으며, 이 때 부모 클래스가 아닌 상속하는 자식클래스의 구현내용을 실행한다.

  (오버라이딩은 자식, 후손 따름!! 외우기!! 자식의 실행내용을 출력)

 

 

5. 대결 프로그램을 작성하시오.

 두 사람이 이름을 키보드로 입력 받으며 각 사람은 Person 클래스로 작성하라.

 그러므로 프로그램에는 2개의 Person 객체가 생성되어야 한다. 두 사람은 번갈아 가면서 게임을 진행하는데 각 사람이

 자기 차례에서 <Enter> 키를 입력하면, 3개의 난수가 발생되고 이 숫자가 모두 같으면 승자가 되고 게임이 끝난다.

 난수의 범위를 너무 크게 잡으면 3개의 숫자가 일치하게 나올 가능성이 적기 때문에 숫자의 범위는 1~3까지로 한다.

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
32
33
34
35
/* 
1번째 선수 이름>>수희
2번째 선수 이름>>연수
[수희]:
3 1 1 아쉽군요!
[연수]:
3 1 3 아쉽군요!
[수희]:
2 2 1 아쉽군요!
[연수]:
1 1 2 아쉽군요!
[수희]:
3 3 3 수희님이 이겼습니다! */
 
class Person {
    public String name;
    private int num1, num2, num3;
    
    public Person(String name) {
        this.name = name;
    }
    public boolean getPlay() {
        num1 = (int)(Math.random() * 3+ 1;
        num2 = (int)(Math.random() * 3+ 1;
        num3 = (int)(Math.random() * 3+ 1;
 
        System.out.print("\t" + num1 + " " + num2 + " " + num3 + " ");
        
        if((num1==num2)&&(num2==num3)) {
            return true;
        }else {
            return false;
        }
    }
}
cs

 

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
class Personmain {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        System.out.print("1번째 선수 이름 >> " );
        Person person1 = new Person(sc.next());
        System.out.print("2번째 선수 이름 >> " );
        Person person2 = new Person(sc.next());
        
        while(true) {
            System.out.println("[" + person1.name + "]:");
            sc.nextLine();
            if(person1.getPlay()){
                System.out.println("승리입니다!!");
                break;
            }else { 
                System.out.println("아쉽군요");
            }
            System.out.println("[" + person2.name + "]:");
            sc.nextLine();
            if(person2.getPlay()){
                System.out.println("승리입니다!!");
                break;
            }else { 
                System.out.println("아쉽군요");
            }    
        }
    }
}
cs

 

6. 문제 5번 게임을 n명이 하도록 수정하라.

실행 예시와 같이 게임에 참여하는 선수의 수를 입력받고 각 선수의 이름을 입력받도록 수정하라. 

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 
/*
겜블링 게임에 참여할 선수 숫자>>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  황님이 이겼습니다!   */
 
//난수 생성은 10번과 동일
 
class Personmain2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("겜블링 게임에 참여할 선수 숫자>> ");
        int num = sc.nextInt();
        Person2[] person = new Person2[num];
 
        for(int i = 0; i < person.length; i++) {
            System.out.print((i+1+ "번째 선수 이름>> ");
            person[i] = new Person2(sc.next());
        }
        
        while(true) {
            for(int j = 0; j < person.length; j++) {
                sc.nextLine();
                System.out.println("[" + person[j].name + "]: ");
                if(person[j].getPlay()){
                    System.out.println("승리입니다!!");
                    break;
                }else { 
                    System.out.println("아쉽군요");
                }
            }
        }
    }
}
cs

 

 

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

· 참고

 

· 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Employee{
    private String name;
    private int age;
    private String address;
    private String team;
    private int pay;
    
    public Employee1(String name, int age, String address, String team){
        this.name = name;
        this.age = age;
        this.address = address;
        this.team = team;
    }
    public int getPay(){
        return pay;
    }
    public void setPay(int pay){
        this.pay = pay;
    }
    public void printInfo() {
        System.out.println("이름:" + name + "\n나이:" + age + "\n주소:" + address + "\n부서:" + team);
    }
}
 
cs

 

1
2
3
4
5
6
class Employeemain{
    public static void main(String[] args){
      Employee1 employee = new Employee1("수정"20"서울""인사");
      employee.printInfo();
    }
}
cs

 

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

· 참고

 

· 작성

1
2
3
4
5
6
7
8
9
10
11
12
 class Regular extends Employee1{    
    private int setter;
    
    public Regular(String name, int age, String address, String team, int setter) {
      super(name, age, address, team);
      this.setter = setter;
    }
    public void printInfo(){
      super.printInfo();
      System.out.println("정규직" + setter);
    }
 }
cs

 

1
2
3
4
5
6
 class Employeemain{
    public static void main(String[] args){
       Regular regular = new Regular("수정"20"서울""인사"500);
       regular.printInfo();
   }
 } 
cs