사이먼's 코딩노트

[Java] 문제풀이(1) 본문

Java/Java

[Java] 문제풀이(1)

simonpark817 2024. 3. 11. 21:09
  • 심화된 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