1. is a 관계와 has a 관계에 대하여 설명하시오.
is a (-는 -이다.) : 상속관계
- 노트북은 컴퓨터이다. (o)
- 전기 자동차는 자동차이다. (o)
- ColorTV 는 TV이다. (o)
// 조금이라도 의심스러우면 그것은 is a 관계가 아니다!! → has a 관계이다.
has a (-는 -를 가지고있다.) : 포함관계 (상속불가)
class Computer{
Cpu cpu;
Mainboard mainboard;
Memory memory;
...
}
2. 다형성(polymorphism)이란 무엇인가?
-
형이 많다. (many formas) 상속 관계에서 서로 관련된 많은 클래스들이 있을 때 '다형성'이라고 말한다.
-
객체 지향 프로그래밍OOP(Object-Oriented Programming)의 핵심 개념 중 하나
-
is-a 의 상속 관계라면 그 객체는 다형성이다.
-
객체에 접근하는 유일한 방법이 참조 변수를 통한 것이기 때문에 가능함
-
polymorphism(다형성)의 활용 방법: 가상 메소드 호출(virtual method invocation)
부모 = 자식 (wihtout 형변환)
부모 클래스 타입(참조형)으로 자식 클래스의 객체를 생성할 수 있다.
기본적으로 반대의 경우는 안됨(나중에 되는 케이스를 배우긴 한다...)
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();
- ph2는 데이터 타입이 SmartPhone이다. → 부모 클래스와, 자신의 클래스의 데이터, 함수 모두 참조가 가능하다.
- 그런데 new MobilePhone();으로 MobilePhone클래스를 데이터에 올리면 부모 클래스인 MobilePhone의 변수와 함수만 메모리에 올라간다. (자식 클래스는 메모리에 올라가지 않음)
- 부모만 메모리에 올라가 있고 참조 해야할 자신은 메모리에 올라가 있지 않기 때문에 당연히 참조가 되지 않아 불가능하게 된다.
4. 메소드 오버라이딩(Overriding) 이란?
Polymorphism(다형성)의 핵심 중 하나. 메소드 오버라이딩은 상속 관계에서 부모와 자식의 함수의 리턴타입, 함수이름, 파라미터가 모두 똑같고 구현 내용만 달리하는 것을 말한다.
Polymorphism, 오버라이딩이 된 함수를 호출하면 부모 함수의 주소를 자식 함수의 주소로 바꿔서 자식의 함수가 호출된다.
(= 자식꺼!) 실제로는 주소가 바뀌는 거지만 일단 지금은 덮어쓴다고 생각해도 된다. (부모꺼를 호출해도 자식꺼)
변수는 오버라이딩 대상이 아니다.
오버라이딩 조건: 함수 선언부 일치
상속 관계에서 부모와 자식의 함수의 리턴타입, 함수이름, 파라미터가 모두 똑같고 구현 내용만 달리 함
오버라이딩 메소드 호출:
오버라이딩된 함수를 호출하면 부모함수의 주소를 자식함수의 주소로 바꿔서 자식의 함수가 호출 됨(= 자식꺼!)
오버로딩 vs 오버라이딩
오버로딩(overloading): 이름만 같은 다른 함수(파라미터 타입, 개수 다름)를 새롭게 생성 오버라이딩(Overriding): 상속 관계에서 부모 함수와 똑같은 함수의 구현 내용만 다르게 수정 (덮어씀)
5. 갬블링 게임을 만들어 보자.
두 사람이 게임을 진행한다. 이들의 이름을 키보드로 입력 받으며 각 사람은 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 수희님이 이겼습니다!
class Person {
final int CHANCE = 4;
private int[] numArr;
public String name;
public Person(String name) {
this.name = name;
numArr = new int[CHANCE];
}
public boolean game() {
boolean isDuplicate = true;
for (int i = 0; i < numArr.length; i++) {
numArr[i] = (int) ((Math.random() * 3) + 1);
}
for (int i = 0; i <numArr.length ; i++) {
if (numArr[0] != numArr[i] ) {
isDuplicate= false;
break;
}
}
for(int i = 0; i < numArr.length; i++) {
System.out.print("\t" + numArr[i] + " ");
}
return isDuplicate;
}
}
public class GameMain {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("1번째 선수 이름>>");
String name = sc.next();
Person person1 = new Person(name);
System.out.print("2번째 선수 이름>>");
name = sc.next();
Person person2 = new Person(name);
String buffer = sc.nextLine();
while (true) {
System.out.print("[" + person1.name + "]:<Enter>");
buffer = sc.nextLine();
if (person1.game()) {
System.out.println(person1.name + "님이 이겼습니다!");
break;
}
System.out.println("아쉽군요!");
System.out.print("[" + person2.name + "]:<Enter>");
buffer = sc.nextLine();
if (person2.game()) {
System.out.println(person2.name + "님이 이겼습니다!");
break;
}
System.out.println("아쉽군요!");
}
sc.close();
}
}
7.다음을 만족하는 클래스 Employee를 작성하시오
(8번문제부터는 이것과 관련된 문제입니다).
- 클래스 Employee(직원)은 클래스 Regular(정규직)와 Temporary(비정규직)의 상위 클래스
- 필드: 이름, 나이, 주소, 부서, 월급 정보를 필드로 선언
- 생성자 : 이름, 나이, 주소, 부서를 지정하는 생성자 정의
- 메소드 printInfo() : 인자는 없고 자신의 필드 이름, 나이, 주소, 부서를 출력
class Employee {
private String name;
private int age;
private String address;
private String department;
private int salary;
public Employee(String name, int age, String address, String department) {
this.name = name;
this.age = age;
this.address = address;
this.department = department;
}
public void printInfo() {
System.out.println("이름: "+this.name);
System.out.println("나이: "+this.age);
System.out.println("주소: "+this.address);
System.out.println("부서: "+this.department);
}
}
8. 다음을 만족하는 클래스 Regular를 작성하시오. Series_02 (필수)
- 클래스 Regular는 위에서 구현된 클래스 Employee의 하위 클래스
- 생성자 : 이름, 나이, 주소, 부서를 지정하는 상위 생성자 호출
- Setter : 월급 정보 필드를 지정
- 메소드 printInfo() : 인자는 없고 "정규직"이라는 정보와 월급을 출력
class Employee {
private String name;
private int age;
private String address;
private String department;
protected int salary;
public Employee(String name, int age, String address, String department) {
this.name = name;
this.age = age;
this.address = address;
this.department = department;
}
public void printInfo() {
System.out.println("이름: "+this.name);
System.out.println("나이: "+this.age);
System.out.println("주소: "+this.address);
System.out.println("부서: "+this.department);
}
public void setSalary(int salary) {
this.salary = salary;
}
}
class Regular extends Employee {
Regular (String name, int age, String address, String department, int salary) {
super(name, age, address, department);
setSalary(salary);
}
public void setSalary(int salary) {
super.salary = salary; //super
}
public void printInfo() { //함수 오버라이딩
super.printInfo();
System.out.println("정규직 월급: "+ super.salary);
}
}
public class EmployeeMain {
public static void main(String[] args) {
Employee employee = new Employee("홍길동", 27, "서울시", "디자인");
employee.printInfo();
System.out.println();
Employee employee2 = new Regular("김철수", 26, "서울시", "마케팅", 2_500_000);
employee2.printInfo(); //함수 오버라이딩, 폴리머피즘 적용
}
}
'IT 면접족보 > 자바 면접족보' 카테고리의 다른 글
자바 수업 정리 - Exception class, finally, try-with-resources, Object class(methods) (17일 차 ) (0) | 2020.12.17 |
---|---|
자바 수업 정리 - instanceof, Object class, final, @Override, interface (16일 차 ) (0) | 2020.12.16 |
자바 면접 족보 정리(14일 차 ) (0) | 2020.12.11 |
자바 면접 족보 정리(13일 차 ) (0) | 2020.12.11 |
자바 면접 족보 정리(12일 차 ) (0) | 2020.12.10 |