22.5.08 [HackerRank]Java Interface

서태욱·2022년 5월 6일
0

Algorithm

목록 보기
35/45
post-thumbnail

✅ 문제 분석

문제에서 제공되는 AdvanceArithmetic 인터페이스를 구현하는
MyCalculator 클래스를 만들어야 한다.

divisor_sum 함수는 정수를 입력받아서 그 제수들을 다 더한 값을 프린트해주어야 한다.

🌱 배경지식

다형성(polymorphism)

상수, 변수, 식, 객체, 메소드 등이 다양한 자료형(type)에 속하는 것이 허가되는 성질이다.
바꿔말하면, 같은 자료형에 여러가지 객체를 대입해 다양한 결과를 얻을 수 있다.
다형성을 활용하면 기능을 확장하거나, 객체를 변경해야할 때 타입 변경 없이 객체 주입만으로 수정이 일어나게 할 수 있다. 상속과 함께 사용시 중복되는 코드도 제거할 수 있으므로 OOP와 더욱 가까워진다.

자바는 수퍼 클래스 타입의 참조 변수로 서브 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현한다.

import java.util.Scanner;

interface Animal1 { // 인터페이스
    void name(); //추상메소드
    void color(); //추상메소드
    void cry(); //추상메소드
}

class Dog implements Animal1{ // 인터페이스 구현 클래스
    public void name(){ // 오버라이딩
        System.out.println("이름 : 똘이");
    }
    public void color(){ // 오버라이딩
        System.out.println("색깔 : 점박이");
    }
    public void cry(){ // 오버라이딩
        System.out.println("울음소리: 멍멍");
    }
}

class Cat implements Animal1{
    public void name(){
        System.out.println("이름 : 모모");
    }
    public void color(){
        System.out.println("색깔 : 검은색");
    }
    public void cry(){
        System.out.println("울음소리: 야옹");
    }
}

class Lamb implements Animal1{
    public void name(){
        System.out.println("이름 : 양순이");
    }
    public void color(){
        System.out.println("색깔 : 흰색");
    }
    public void cry(){
        System.out.println("울음소리: 메에에");
    }
}

public class polytest {
    public static void main(String[] args){
        Animal1 animal; //인터페이스 객체 선언
        System.out.println("원하는 동물 번호 선택 (1. 강이지 2. 고양이 3. 양) ");
        Scanner sc = new Scanner(System.in); // 스캐너 객체
        int n = sc.nextInt();
        if(n==1){
            animal = new Dog(); //업캐스팅
        } else if (n==2){
            animal = new Cat(); //업캐스팅
        } else{
            animal = new Lamb(); //업캐스팅
        }
        //선택한 조건에 따라서 부모 객체로 자식 메소드 사용 (하나의 타입으로 다양한 결과를 얻음 / 다형성)
        animal.name();
        animal.color();
        animal.cry();
    }

}

2번을 선택한 예시

인터페이스

인터페이스는 내부의 모든 필드가 public static final로 정의되고, static과 default 메서드 이외의 모든 메서드는 public abstact로 정의된 객체지향 프로그래밍 요소다. 다형성을 위해 사용할 수 있다.
즉, 메소드 서명과 필드만 포함할 수 있다.

예컨대 마이크로소프트의 윈도우 운영체제는 삼성과 LG의 프린터를 대상으로 출력을 진행할 수 있다.

이때, MS가 기본적인 인터페이스를 만들어서 각 회사에 제공하면,

인터페이스를 회사별로 구현하고 MS는 print 메서드를 호출하면서 출력할 문서의 정보를 파라미터로 전달하게 된다.

삼성과 LG가 Printable 인터페이스를 전달받아 클래스를 정의해서 제공하면, MS는 그 클래스 이름만으로도 (내부 구현이 어떻게 되는지와는 관계 없이) 여러 회사의 프린터를 대상으로 출력을 진행할 수 있게 된다.

interface Printable{ //Microsoft가 정의하고 제공한 인터페이스
    public void print(String doc);
}

class SPrinterDriver implements Printable { //Samsung이 정의한 클래스
    @Override
    public void print(String doc) {
        System.out.println("From Samsung Printer");
        System.out.println(doc);
    }
}

class LPrinterDriver implements Printable { // LG가 정의한 클래스
    @Override
    public void print(String doc) {
        System.out.println("From LG Printer");
        System.out.println(doc);
    }
}

class PrinterDriver {
    public static void main(String[] args){
        String myDoc = "This is a report about..";

        //삼성 프린터로 출력
        Printable prn = new SPrinterDriver();
        prn.print(myDoc);
        System.out.println();

        //LG 프린터로 출력
        prn = new LPrinterDriver();
        prn.print(myDoc);
    }
}

✏️ 해설


import java.util.*;
interface AdvancedArithmetic{
    int divisor_sum(int n);
}

//Write your code here
class MyCalculator implements AdvancedArithmetic{
    public int divisor_sum(int n){
        int sum = 0; //sum으로 초기화
        for (int i=1; i<=n; i++){ //n을 나눈 나머지가 0인 것들끼리 계속 더해가면 된다. 
            if (n%i == 0)
                sum += i;
        }
        return sum;
    }
}

class JavaInterface{
    public static void main(String []args){
        MyCalculator my_calculator = new MyCalculator();
        System.out.print("I implemented: ");
        ImplementedInterfaceNames(my_calculator);
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.print(my_calculator.divisor_sum(n) + "\n");
        sc.close();
    }
    /*
     *  ImplementedInterfaceNames method takes an object and prints the name of the interfaces it implemented
     */
    static void ImplementedInterfaceNames(Object o){
        Class[] theInterfaces = o.getClass().getInterfaces();
        for (int i = 0; i < theInterfaces.length; i++){
            String interfaceName = theInterfaces[i].getName();
            System.out.println(interfaceName);
        }
    }
}

👉 참고

profile
re:START

0개의 댓글