관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

[Spring반] 중간시험 14 - Java 실기 시험 및 문제 풀이 6 : 문제 9~10번 <클래스와 인터페이스> 본문

개발 포트폴리오/수료증 및 시험

[Spring반] 중간시험 14 - Java 실기 시험 및 문제 풀이 6 : 문제 9~10번 <클래스와 인터페이스>

huenuri 2024. 12. 9. 13:36

이제 자바 시험 두 문제만 남겨놓고 있다. 어제 오후부터 거의 하루 꼬박 걸려서 남은 20개나 넘는 문제를 푸는 중이다. 이 문제를 다 풀고 나면 파이썬 시험 문제도 풀어볼 생각이다.


 

 

 

 

Java 실기 시험 여섯 번째

 

문제 9번

다음은 각각 모바일폰 카메라폰 스마트폰의 기능을 나타내는 클래스이다. 카메라폰은 모바일폰의 기능을 모두 가지고 있고 스마트폰은 카메라폰의 기능을 모두 가지고 있다. 각각의 코드를 상속을 이용해 간결하게 만드시오. (class : MobilePhone, CameraPhone, SmartPhone ) 


 

 

MobilePhone 클래스

 

 

 

CameraPhone 클래스

 

 

 

SmartPhone 클래스

 

이제 클래스를 작성했으니 상속을 이용해 이 코드를 간결하게 만들어보겠다.


 

 

상속을 이용해 코드 작성하기

 

 

 

 

 

상속을 이용하니 코드가 무척 간결해졌다. 


 

 

클래스별 설명

1. MobilePhone 클래스

  • 역할 : 기본적인 모바일폰의 기능인 "전화 걸기"와 "문자 보내기"를 제공
  • 속성
    • phoneNumber : 전화번호를 저장
  • 메서드
    • call() : "전화 걸기" 기능 출력
    • message() : "문자 보내기" 기능 출력

2. CameraPhone 클래스

  • 상속 : extends MobilePhone를 통해 MobilePhone 클래스의 모든 기능을 상속받음
  • 추가 기능
    • picture() : "사진 찍기" 기능 출력
    • music() : "노래 듣기" 기능 출력

3. SmartPhone 클래스

  • 상속 : extends CameraPhone를 통해 CameraPhone 클래스의 모든 기능(즉, MobilePhone 포함)을 상속받음
  • 추가 속성
    • usimID : USIM ID를 저장
  • 추가 기능
    • kakaoTalk() : "카톡 보내기" 기능 출력
    • wifi() : "무료 인터넷 접속하기" 기능 출력

 

이제 출력 코드를 작성하여 각 클래스의 기능이 올바르게 동작하는지 확인해 볼 것이다.


 

 

 

Main 클래스

 


 

 

 

 

문제 10번

다음은 사용자의 이름을 입력받아 다양한 언어로 인사하는 프로그램을 작성하시오. (class명 : Test, Air, Bus, Car)


 

 

 

 

아직은 작성된 클래스가 없어서 이렇게 오류가 뜨고 있다. 이제 문제를 풀어보기로 하자.

 

 

 

Transport 인터페이스

Air, Bus, Car 클래스의 공통 동작(여기선 travel 메서드)을 정의하기 위해 인터페이스를 사용.

 

 

Air 클래스

 

 

Bus 클래스

 

 

Car 클래스

 

 

 

Test 클래스

Transport 타입으로 객체를 받아 공통적으로 travel 메서드를 호출한다.

 

 

 

코드 설명

  1. Transport 인터페이스
    • 공통적으로 구현해야 하는 travel 메서드를 선언
  2. Air, Bus, Car 클래스
    • 각각 Transport 인터페이스를 구현
    • 각 클래스에서 travel 메서드의 동작을 구체적으로 정의
      • Air : "비행기를 타고 여행합니다"
      • Bus : "버스를 타고 여행합니다"
      • Car : "자동차를 타고 여행합니다"
  3. Test 클래스
    • Transport 타입으로 Air, Bus, Car 객체를 받아 다형성을 통해 메서드를 호출
    • travel 메서드는 각 클래스의 구현에 따라 다르게 동작
  4. 다형성의 장점
    • 새로운 클래스 추가(예: Train, Boat 등) 시 Transport 인터페이스만 구현하면 Test 코드를 수정할 필요가 없음

 

 

 

왜 Transport라고 선언했는가?

Transport a = new Air();
Transport b = new Bus();
Transport c = new Car();

 

 

이처럼 부모 타입(인터페이스)으로 선언한 이유는 다형성(Polymorphism)을 활용하기 위해서이다. 다형성은 객체 지향 프로그래밍(OOP)의 주요 개념 중 하나로, 다음과 같은 장점이 있다.

 

1. 코드의 재사용성 증가

  • Transport라는 공통 타입으로 선언했기 때문에, Air, Bus, Car 등 새로운 클래스가 추가되어도 하나의 메서드에서 처리 가능
  • 예를 들어, travel 메서드는 Transport 타입을 매개변수로 받기 때문에 클래스가 추가되어도 수정이 필요 없다.

 

2. 유연성

  • Transport 타입으로 선언하면, 해당 타입을 구현한 모든 객체(Air, Bus, Car)를 동일하게 처리 가능
  • 특정 클래스에 종속되지 않아 유지보수가 쉬워짐

 

3. 다형성 구현

  • Transport 타입으로 선언했기 때문에 메서드 호출 시, 실제 객체(Air, Bus, Car)의 travel 메서드가 호출됨(런타임 다형성)
private static void travel(Transport transport) {
    transport.travel(); // Air, Bus, Car 모두 처리 가능
}

 

 

인터페이스는 왜 필요한가?

Transport 인터페이스를 사용하는 이유는 다음과 같다.

 

 

1. 공통된 동작 정의

  • 인터페이스는 공통적으로 제공되어야 할 기능(메서드)를 선언하는 역할
  • 예를 들어, 모든 교통수단은 "여행" 기능(travel)을 가져야 하므로 Transport 인터페이스에서 이를 선언
interface Transport {
    void travel(); // 모든 교통수단이 구현해야 함
}

 

 

2. 다형성을 구현

  • 인터페이스를 사용하면 부모 타입으로 다양한 객체를 받을 수 있음
  • 예를 들어, Transport 인터페이스를 구현한 객체(Air, Bus, Car)를 같은 타입으로 처리 가능

 

3. 확장성

  • 새로운 교통수단(예: Train, Boat)을 추가할 때, Transport 인터페이스만 구현하면 코드 수정 없이 동작 가능
class Train implements Transport {
    @Override
    public void travel() {
        System.out.println("기차를 타고 여행합니다");
    }
}

 

 

4. 코드의 일관성 유지

  • Transport 인터페이스를 통해 교통수단의 기본 동작(여행 기능)을 강제
  • 모든 교통수단이 동일한 메서드(travel)를 가지므로, 코드의 일관성을 유지

 

 

 

만약 Transport를 사용하지 않고 Air, Bus, Car를 각각 선언하면?

만약 Transport 없이 각각의 타입으로 선언하면 다음과 같은 문제가 생긴다.

 

 

1. 코드 중복

  • travel 메서드를 각 타입별로 작성해야 함
  • 새로운 클래스가 추가될 때마다 travel 메서드도 수정해야 함
private static void travel(Air air) {
    air.travel();
}

private static void travel(Bus bus) {
    bus.travel();
}

private static void travel(Car car) {
    car.travel();
}

 

 

 

2. 확장성 부족

  • 새로운 교통수단(예: Train, Boat)이 추가되면, 해당 타입에 맞는 새로운 travel 메서드를 작성해야 함

 

3. 유지보수 어려움

  • 특정 기능을 수정하거나 추가하려면 여러 곳을 수정해야 하므로 유지보수가 어렵고 실수 가능성이 증가

 

정리

  • Transport 타입으로 선언한 이유
    • 다형성을 활용하여 코드를 단순화하고, 확장 가능하게 만들기 위해
  • 인터페이스를 사용하는 이유
    • 공통 기능을 정의하고, 코드의 일관성과 확장성을 보장하기 위해

 

추가로 알아야 할 내용

  1. 인터페이스 vs 추상 클래스
    • 인터페이스는 다중 구현 가능, 추상 클래스는 단일 상속
    • 인터페이스는 행위(기능)를 정의, 추상 클래스는 공통 속성과 기능을 정의
  2. 실제 사용 사례
    • Java의 List, Set, Map 같은 컬렉션 프레임워크는 인터페이스 기반 설계로 확장성과 유연성을 제공

 

어쨌거나 인터페이스로 선언을 해야 코드를 관리하기에 좋다는 뜻이다.


 

 

 

학습을 마치고

이렇게 해서 실습문제 10문제를 모두 풀어보았다. 근데 10문제가 아니라 20문제 이상을 푼 느낌이 든다. 지금은 잘 이해가 가지 않는 부분도 있지만 한번 더 복습을 하면 분명 충분히 이해할 수 있을 것 같다.

정말 길고 길었던 자바 시험 문제 풀이 학습이 끝났다. 문제를 풀며 정말 많은 것들을 알게 되었다.