31일차

김윤정·2024년 7월 30일

코딩

목록 보기
31/60
post-thumbnail

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

  • is a (-는 -이다.) : 상속관계를 말합니다.
    ex) 노트북은 컴퓨터이다.

  • has a: 포함관계로 상속관계는 아닙니다.

애매하거나 의심스러운 경우 일단 has a 관계를 사용합니다.

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

  1. 형이 많다. (many formas) 상속 관계에서 서로 관련된 많은 클래스들이 있을 때 '다형성'이라고 말합니다.

  2. 객체 지향 프로그래밍OOP(Object-Oriented Programming)의 핵심 개념 중 하나입니다.

  3. is-a 의 상속 관계라면 그 객체는 다형성입니다.

  4. 객체에 접근하는 유일한 방법이 참조 변수를 통한 것이기 때문에 가능합니다.

  5. polymorphism(다형성)의 활용 방법: 가상 메소드 호출(virtual method invocation)

부모 = 자식 (wihtout 형변환)

부모 클래스 타입(참조형)으로 자식 클래스의 객체를 생성할 수 있습니다.

기본적으로 반대의 경우는 안되지만 강제 형변환의 경우 가능합니다.

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

SmartPhone ph2 = new MobilePhone();


데이터 타입은 SmartPhone으로 부모 클래스와, 자신의 클래스의 데이터, 함수 모두 참조가 가능합니다.
그런데 new MobilePhone();으로 MobilePhone클래스를 데이터에 올리면 부모 클래스인 MobilePhone의 변수와 함수만 메모리에 올라가고 자식 클래스는 메모리에 올라가지 않습니다.
따라서 당연히 자식클래스는 참조가 되지 않아 불가능합니다.

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

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

class Employee {
	private String name;
	private int age;
	private String address;
	private String dept;

	protected int salary;

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

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

	}
}

public class EmployeeMain {

	public static void main(String[] args) {
		Employee employee = new Employee("홍길동", 27, "서울시", "디자인");
		employee.printInfo();

	}

}

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

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


class Employee {
	private String name;
	private int age;
	private String address;
	private String dept;

	protected int salary;

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

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

	}
}

class Regular extends Employee {
	
	public Regular(String name, int age, String address, String dept, int salary){
		super(name,age,address,dept);
		setSalary(salary);
	
	}
	
	public void setSalary(int salary) {
		super.salary=salary;
	}
	
	@Override
	public void printInfo() {
		System.out.println("정규직");
		super.printInfo();
		System.out.println("봉급 "+super.salary);
		
	}
}

public class EmployeeMain {
	
	public static void main(String[] args) {
		Employee employee = new Employee("홍길동", 27, "서울시", "디자인");
		employee.printInfo();

		employee = new Regular("김철수", 26, "서울시", "마케팅", 2_500_000);
	    employee.printInfo();
	}

}

6.메소드 오버라이딩(Overriding) 이란?

메소드 오버라이딩이란 다형성의 핵심중 하나로 상속 관계에서 부모와 자식의 함수의 리턴타입, 함수이름, 파라미터가 모두 똑같고 함수안에 내용만 달리하는 것을 말합니다.
메소드오버라이딩은 실제로는 주소가 바뀌는거지만 쉽게 말하면 덮어쓴다고 생각하면 쉽습니다. 따라서 부모를 호출해도 자식이 호출됩니다.
변수는 오버라이딩 대상이 아니므로 주의해야합니다.

7. 다음 중 오버라이딩의 조건으로 옳지 않은 것은? (모두 고르시오)

a. 조상의 메서드와 이름이 같아야 한다.
b. 매개변수의 수와 타입이 모두 같아야 한다.
c. 접근 제어자는 조상의 메서드보다 좁은 범위로만 변경할 수 있다.
d. 조상의 메서드보다 더 많은 수의 예외를 선언할 수 있다.

정답: c, d
c: 오버라이딩 시 접근 제어자는 부모 클래스의 메서드보다 넓은 범위로 변경할 수 있습니다.
예를 들어, 부모 클래스 메서드가 protected라면 자식 클래스에서는 public으로 변경할 수 있지만 private으로 변경할 수 없습니다.

d: 오버라이딩 시, 자식 클래스의 메서드는 부모 클래스의 메서드가 선언한 예외보다 적은 수의 예외 또는 동일한 예외를 선언할 수 있습니다. 부모 클래스 메서드가 특정 예외를 던지지 않으면 자식 클래스 메서드도 새로운 예외를 선언할 수 없습니다.

8. 다음의 코드는 컴파일하면 에러가 발생한다. 그 이유를 설명하고 에러를 수정하기 위해서는 코드를 어떻게 바꾸어야 하는가?

class Product {

	int price; // 제품의 가격

	int bonusPoint; // 제품구매 시 제공하는 보너스점수



	Product(int price) {

		this.price = price;

		bonusPoint = (int) (price / 10.0);

	}

}



class Tv extends Product {

	Tv() {}



	public String toString() {

		return "Tv";

	}

}



class Exercise7_5 {

	public static void main(String[] args) {

		Tv t = new Tv();

	}

}

생성자를 하나라도 만들면 디폴트생성자가 자동으로 컴파일안됩니다, 따라서 직접 만들어줘야합니다.

9. MyTv2클래스의 멤버변수 isPowerOn, channel, volume을 클래스 외부에서 접근할 수 없도록 제어자를 붙이고 대신 이 멤버변수들의 값을 어디서나 읽고 변경할 수 있도록 getter와 setter메서드를 추가하라.

class MyTv2 {
boolean isPowerOn;
int channel;
int volume;
final int MAX_VOLUME = 100;
final int MIN_VOLUME = 0;
final int MAX_CHANNEL = 100;
final int MIN_CHANNEL = 1;
}
class Exercise7_10 {
public static void main(String args[]) {
MyTv2 t = new MyTv2();
t.setChannel(10);
System.out.println("CH:" + t.getChannel());
t.setVolume(20);
System.out.println("VOL:" + t.getVolume());
}
}

실행결과

CH : 10

VOL : 20


package day_2024_07_30;

class MyTv2 {

	private boolean isPowerOn;

	private int channel;

	private int volume;

	final int MAX_VOLUME = 100;

	final int MIN_VOLUME = 0;

	final int MAX_CHANNEL = 100;

	final int MIN_CHANNEL = 1;

	public void setChannel(int channel) {
		this.channel = channel;
	}

	public int getChannel() {
		return channel;
	}

	public void setVolume(int volume) {
		this.volume = volume;
	}

	public int getVolume() {
		return volume;
	}
}

public class Exercise7_10 {
	public static void main(String args[]) {

		MyTv2 t = new MyTv2();

		t.setChannel(10);

		System.out.println("CH: " + t.getChannel());

		t.setVolume(20);

		System.out.println("VOL: " + t.getVolume());

	}
}

10. 다음 중 접근 제어자에 대한 설명으로 옳지 않은 것은? (모두 고르시오)

a. public은 접근제한이 전혀 없는 접근 제어자이다.

b. (default)가 붙으면, 같은 패키지 내에서만 접근이 가능하다.

c. 지역변수에도 접근 제어자를 사용할 수 있다.

d. protected가 붙으면, 같은 패키지 내에서도 접근이 가능하다.

e. protected가 붙으면, 다른 패키지의 자손 클래스에서 접근이 가능하다

정답:c
c: 지역 변수에는 접근 제어자를 사용할 수 없습니다. 접근 제어자는 클래스의 멤버(필드 및 메서드)에만 적용됩니다.

0개의 댓글