## Practice 1 : 클래스 상속 예제 1
<details>
<summary>문제 설명</summary>
### **[문제]** 조상 클래스 뽑아내기
### **[설명]**
다음과 같은 클래스들이 있다. <br>
```java
class Marine {
int x, y;
void move(int x, int y) { /* 지정된 위치로 이동 */ }
void stop() { /* 현재 위치에 정지 */ }
void stimPack() { /* 스팀팩을 사용한다. */ }
}
class Tank {
int x, y;
void move(int x, int y) { /* 지정된 위치로 이동 */ }
void stop() { /* 현재 위치에 정지 */ }
void changeMode() { /* 공격모드를 변환한다. */ }
}
class Dropship {
int x, y;
void move(int x, int y) { /* 지정된 위치로 이동 */ }
void stop() { /* 현재 위치에 정지 */ }
void load() { /* 선택된 대상을 태운다. */ }
void unload() { /* 선택된 대상을 내린다. */ }
}
3개의 클래스에서 공통된 부분을 뽑아내어 조상 클래스 Unit를 만들어보자. <br>
그리고 조상 클래스를 상속받아 각 클래스를 만들어보자. <br>
Test seems Correct가 출력되는 경우 정답이다. <br>
<span style="color:red"> HINT : 공통된 부분만 빼내면 된다. </span>
</details>
<br></br>
<details> <summary>문제 설명</summary>
상속을 두 번 이용하는 예제이다. <br> 상속이 되는 구조는 다음과 같다.
(조상) Vehicle -> Car -> SportsCar (자손)
Vehicle의 멤버변수는 speed이다. <br>
Car의 멤버변수는 brand, speed이다. <br>
여기서 speed는 Vehicle 클래스에서 상속받고, brand는 Car 클래스에서 선언한다. <br>
SportsCar의 멤버변수는 brand, speed, cost이다. <br>
여기서 brand와 speed는 Car 클래스에서 상속받고, cost는 SportsCar 클래스에서 선언한다. <br>
SportsCar의 멤버변수와 생성자를 작성해보자.
<span style="color:red"> HINT : 생성자에서 상속받은 클래스의 생성자를 super()를 이용하여 호출할 수 있다.</span> <br>
SportsCar 멤버변수 조건
| 접근제어자 | 자료형 | 변수명 |
|---|---|---|
| public | int | cost |
SportsCar 생성자 조건
| 접근제어자 | 생성자명 | 매개변수 |
|---|---|---|
| public | SportsCar | String brand, int speed, int cost |
출력 결과
My car's cost is 99999999. Watch Out
Racing Lamborghini sports car at 100 km/h
Driving Lamborghini car at 100 km/h
Vehicle is accelerating to 110 km/h
Racing Lamborghini sports car at 110 km/h
Vehicle is braking to 80 km/h
Racing Lamborghini sports car at 80 km/h
</details>
<br></br>
<details> <summary>문제 설명</summary>
TO DO를 채워봅시다.
Animal 클래스
name : String 타입, public 접근 제어자age : int 타입, public 접근 제어자owner : Owner 타입, private 접근 제어자name, age, owner를 매개변수로 받는다.Cat 클래스
Dog 클래스
Owner 클래스
name : String 타입, private 접근 제한자phoneNumber : String 타입, private 접근 제한자name, phoneNumber를 매개변수로 받는다.출력결과
John owns a Whiskers
John's number is 555-1234
Whiskers is eating
Whiskers is meowing
Whiskers is sleeping
Jane owns a Fido
Jane's number is 555-5678
Fido is eating
Fido is barking
Fido is sleeping
</details>
<br></br>
<details> <summary>문제 설명</summary>
조상 클래스가 될 Beer 클래스를 만들어봅시다
멤버 변수
type : String 타입, public 접근 제어자, 맥주의 종류를 나타내기 위함model : String 타입, public 접근 제어자, 맥주의 상호명을 나타내기 위함ABV : int 타입, public 접근 제어자, 맥주의 알코올 도수를 나타내기 위함생성자
Beer 클래스는 오직 1가지의 생성자를 갖는다. 생성자는 type, model, ABV를 매개변수로 받는다
메서드
Beer 클래스는 3가지의 메서드를 갖는다
drink() : 반환타입 void, 출력 예시 - model을 마십니다getType() : 반환타입 void, 출력 예시 - model의 타입 : typegetABV() : 반환타입 void, 출력 예시 - model의 도수 : ABV</details>
<br></br>
<details> <summary>문제 설명</summary>
Beer 클래스를 상속받을 두 클래스를 만들어봅시다
Cass 클래스
Cass 클래스는 오직 1가지의 생성자를 갖는다. 생성자는 type, model, ABV를 매개변수로 받는다.
단, 이 생성자는 조상 클래스의 생성자(super())를 호출해야 한다.
Hoegaarden 클래스
flavor 멤버 변수를 갖는다.flavor : String 타입, public 접근 제어자, 맥주의 맛을 나타내기 위함Hoegaarden 클래스는 오직 1가지의 생성자를 갖는다. 생성자는 type, model, ABV, flavor을 매개변수로 받는다.
이 때, 조상 클래스와 중복된 매개변수는 super() 생성자를 통해 값을 할당한다.
drink() 메서드를 오버라이딩한다.drink() : 반환타입 void, 출력 예시 - flavor맛 model을 마십니다.getFlavor() : 반환타입 void, 출력 예시 - model의 맛 : flavor</details>
<br></br>
<details> <summary>문제 설명</summary>
매개변수의 다형성을 활용하여 하나의 메서드를 통해 서로 다른 맥주를 주문해보자
생성해야 할 인스터스의 정보는 다음과 같다.
| 인스턴스 타입 | 인스턴스 이름 | type | model | ABV | flavor |
|---|---|---|---|---|---|
| Hoegaarden | h1 | "밀맥주" | "호가든" | 6 | "레몬" |
| Hoegaarden | h2 | "밀맥주" | "호가든" | 6 | "일반" |
| Cass | c | "보리맥주" | "카스" | 6 |
작성해야 할 코드의 일부는 다음과 같다
public class BeerTest {
public static void main(String[] args) {
// TO DO
order(h1);
order(h2);
order(c);
}
static void order( ? ) {
if (b instanceof Hoegaarden) {
// TO DO
} else if (b instanceof Cass) {
// TO DO
}
}
}
출력 결과물은 다음과 같다
호가든의 타입 : 밀맥주
호가든의 도수 : 6
호가든의 맛 : 레몬
레몬맛 호가든을 마십니다
호가든의 타입 : 밀맥주
호가든의 도수 : 6
호가든의 맛 : 일반
일반맛 호가든을 마십니다
카스의 타입 : 보리맥주
카스의 도수 : 6
카스을 마십니다
</details>