사이먼's 코딩노트
[Java] 문제풀이(1) 본문
- 심화된 Java 문제를 풀어봅시다.
- Main 메서드에 작성된 코드를 보고 나머지 클래스와 메서드를 작성해봅시다.
[문제 1]
- 주어진 코드에서 전사가 무기를 여러개 다룰 수 있도록 코드를 완성해봅시다.
public class Main {
public static void main(String[] args) {
전사 a전사1 = new 전사();
a전사1.a왼손무기 = new 칼();
a전사1.공격();
// 출력 => 전사가 왼손으로 칼(을)를 사용합니다.
전사 a전사2 = new 전사();
a전사2.a왼손무기 = new 창();
a전사2.a오른손무기 = new 도끼();
a전사2.공격();
// 출력 => 전사가 왼손으로 창(을)를 사용합니다.
// 출력 => 전사가 오른손으로 도끼(을)를 사용합니다.
}
}
[문제 1 정답]
public class Main {
public static void main(String[] args) {
전사 a전사1 = new 전사();
a전사1.a왼손무기 = new 칼();
a전사1.공격();
전사 a전사2 = new 전사();
a전사2.a왼손무기 = new 창();
a전사2.a오른손무기 = new 도끼();
a전사2.공격();
}
}
class 전사 {
무기 a왼손무기;
무기 a오른손무기;
void 공격() {
if(a왼손무기 != null) {
a왼손무기.작동("전사", "왼손");
}
if(a오른손무기 != null) {
a오른손무기.작동("전사", "오른손");
}
}
}
class 무기 {
String 무기명;
void 작동(String 이름, String 손위치) {
System.out.printf("%s가 %s으로 %s(을)를 사용합니다.\n", 이름, 손위치, this.무기명);
}
}
class 칼 extends 무기 {
칼() {
this.무기명 = "칼";
}
}
class 창 extends 무기 {
창() {
this.무기명 = "창";
}
}
class 도끼 extends 무기 {
도끼() {
this.무기명 = "도끼";
}
}
- 먼저 필요한 클래스와 메서드를 파악해야한다.
- 필요한 클래스는 전사, 칼, 창, 도끼이고 필요한 메서드는 공격() 이다.
- a무기는 칼, 창, 도끼 중 어느 하나의 무기 객체와 연결되기 때문에 세 종류의 무기를 모두 포용하는 '무기' 클래스를 추가로 생성하고 a왼손무기와 a오른손무기의 타입은 무기로 지정한다.
- 칼, 창, 도끼는 모두 무기에 상속되기 때문에 extends를 이용해서 서로 상속의 관계로 재정의한다.
- 그리고 각 무기의 객체가 생성됨과 동시에 무기명을 저장하도록 String 무기명을 부모 클래스에서 선언하고 각 클래스에서 생성자를 이용해서 각 무기에 맞는 무기명을 저장한다.
- 전사 클래스에 생성된 공격() 메서드는 무기별로 공격이 가능하고 손의 위치의 따라 동작하도록 작동() 이라는 메서드를 무기 클래스에서 호출하도록 한다.
- 작동() 메서드는 매개변수로 이름과 손위치를 받는다.
- 마지막으로 각 전사는 왼손잡이이거나 오른손잡이 둘 중 하나기 때문에 공격() 메서드에서 조건문을 추가해줘야한다.
- 만약 a왼손잡이 인스턴스 변수가 null이 아닌 어떤 무기를 지니고 있다면 인자로 손위치에 "왼손"을 전달하고 a오른손잡이 인스턴스 변수가 null이 아닌 어떤 무기를 지니고 있다면 인자로 손위치에 "오른손"을 전달한다.
[문제 2]
- 주어진 코드에서 사람 객체가 생성될 때 자동으로 a왼팔 변수에 팔 객체가 연결되도록 해봅시다.
public class Main {
public static void main(String[] args) {
System.out.println(new 사람().a왼팔.길이 + "cm");
// 출력 : 100cm
}
}
[문제 2 정답]
public class Main {
public static void main(String[] args) {
System.out.println(new 사람().a왼팔.길이 + "cm");
}
}
class 사람 {
팔 a왼팔;
사람() {
a왼팔 = new 팔();
}
}
class 팔 {
int 길이;
팔() {
길이 = 100;
}
}
- Main 메서드를 살펴보면 래퍼런스 변수 생성 없이 바로 new 사람()을 통해 객체를 생성하고 a왼팔이라는 인스턴스 변수와 연결하고 있다.
- 먼저 인스턴스 변수 a왼팔의 타입을 결정해주기 위해 팔이라는 클래스를 하나 생성하여 [팔 a왼팔]를 작성해준다.
- 그리고 사람 객체가 생성될 때 동시에 a왼팔 변수에 팔 객체가 연결되도록 생성자를 추가해준다.
- 팔에는 정수 타입으로 길이라는 변수가 하나 있고 a왼팔이 팔 객체와 연결되었기 때문에 Main 메서드에서 한번에 길이 호출이 가능하다.
- 마찬가지로 팔 객체가 생성될 때 동시에 길이 변수에 100을 저장해주는 생성자를 추가해준다.
[문제 3]
- 주어진 코드에서 사람이 생성될 때 왼팔과 손과 엄지손가락이 한 번에 만들어지도록 코드를 완성해봅시다.
public class Main {
public static void main(String[] args) {
int 엄지손가락_길이 = new 사람().a왼팔.a손.a엄지손가락.길이;
System.out.println(엄지손가락_길이 + "cm");
// 출력 : 5cm
}
}
[문제 3 정답]
public class Main {
public static void main(String[] args) {
int 엄지손가락_길이 = new 사람().a왼팔.a손.a엄지손가락.길이;
System.out.println(엄지손가락_길이 + "cm");
}
}
class 사람 {
팔 a왼팔;
사람() {
a왼팔 = new 팔();
a왼팔.a손 = new 손();
a왼팔.a손.a엄지손가락 = new 손가락();
a왼팔.a손.a엄지손가락.길이 = 5;
}
}
class 팔 {
손 a손;
}
class 손 {
손가락 a엄지손가락;
}
class 손가락 {
int 길이;
}
- Main 메서드를 살펴보면 래퍼런스 변수 생성 없이 바로 new 사람()을 통해 객체를 생성하고 a왼팔이라는 인스턴스 변수와 연결하고 있다.
- a왼팔이라는 인스턴스 변수는 a손과 연결되고 a손은 a손가락, a손가락은 a엄지손가락과 연결되고 a엄지손가락에 연결된 길이를 호출하여 엄지손가락의 길이를 구한다.
- 문제 2와 동일한 방법으로 각각 꼬리를 물어 사람, 팔, 손, 손가락 클래스를 생성한 뒤 각 클래스의 생성자를 이용하여 하위 단계의 객체를 생성해주면 되지만 사람이 생성된 동시에 한번에 엄지손가락이 생성되게 하려면 사람 생성자에서 모든 객체를 생성해준다.
- 최하위인 손가락 클래스에서는 Main 메서드에서 엄지손가락_길이 변수가 정수값을 가지기 때문에 길이라는 변수를 int 타입으로 선언해준다.
반응형
'Java > Java' 카테고리의 다른 글
[Java] 생성자 문제풀이 (0) | 2024.03.12 |
---|---|
[Java] 문제풀이(2) (0) | 2024.03.11 |
[Java] ArrayList (0) | 2024.02.19 |
[Java] 종합 문제풀이 (0) | 2024.02.19 |
[Java] 추상 클래스 / 인터페이스 (0) | 2024.02.14 |