IT 면접족보/자바 면접족보

자바 면접 족보 정리(15일 차 )

낙산암 2020. 12. 14. 22:21

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();  //함수 오버라이딩, 폴리머피즘 적용
	}
}