문제에서 제공되는 AdvanceArithmetic 인터페이스를 구현하는
MyCalculator 클래스를 만들어야 한다.
divisor_sum 함수는 정수를 입력받아서 그 제수들을 다 더한 값을 프린트해주어야 한다.
상수, 변수, 식, 객체, 메소드 등이 다양한 자료형(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);
}
}
}