'java interface'에 해당되는 글 2건

728x90

유투브 강좌를 보고 따라서 코드 적어가며 테스트하고 적어둔다.

유투브 동영상 : https://www.youtube.com/watch?v=OTNuxe_ihtM&t=774s

 

 

각각 서로 다른 파일로 생성하여 테스트 해야 하는데 하나의 파일로 작성하여 테스트했다.

- 인터페이스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.

- 인터페이스를 메소드의 매개변수 타입으로 지정할 수 있다.

interface OnFoundListener {
    // 1. Create a callback interface.
    void onFound(String result);
}
 
class ClassA {
    // 2. Create a class as a worker.
    public void findAGirl(OnFoundListener onFoundListener ) {
        for(int i=0; i < 5; i++) {
            try {
                Thread.sleep(100);
                System.out.println("A is trying find a girl for you " + i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        onFoundListener.onFound("A found a girl for you.");
        // A found nothing, so that assign this job for B.
        //ClassB classB = new ClassB();
        //classB.findACuteGirl(onFoundListener);
    }
 
}
 
public class InerfaceWorld {
    public static void main(String[] args) {
        ClassA classA = new ClassA();
        classA.findAGirl(new OnFoundListener() {
            @Override
            public void onFound(String result) {
                System.out.println(result);
            }
        });
    }
}
 

메소드를 호출하는 쪽에서는 메소드의 내용에 관계없이 선언부만 알면 되기 때문에 이를 이용하여 프로그램을 작성할 수 있다. 동시에 다른 한 쪽에서는 인터페이스를 구현하는 클래스를 작성하도록 하여, 인터페이스를 구현하는 클래스가 작성될 때까지 기다리지 않고도 양쪽에서 동시에 개발을 진행할 수 있다.

 

 

 

 

 

interface OnFoundListener {
    // 1. Create a callback interface.
    void onFound(String result);
}
 
class ClassA {
    // 2. Create a class as a worker.
    public void findAGirl(OnFoundListener onFoundListener ) {
        for(int i=0; i < 5; i++) {
            try {
                Thread.sleep(100);
                System.out.println("A is trying find a girl for you " + i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //onFoundListener.onFound("A found a girl for you.");
        // A found nothing, so that assign this job for B.
        ClassB classB = new ClassB();
        classB.findACuteGirl(onFoundListener);
    }
}
 
class ClassB {
    public void findACuteGirl(OnFoundListener onFoundListener ) {
        for(int i=0; i < 5; i++) {
            try {
                Thread.sleep(100);
                //System.out.println("A is trying find a girl for you " + i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        onFoundListener.onFound("A found a cute girl for you.");
    }
}
 
public class InterfaceWorld2 {
    public static void main(String[] args) {
        ClassA classA = new ClassA();
        classA.findAGirl(new OnFoundListener() {
            @Override
            public void onFound(String result) {
                System.out.println(result);
            }
        });
    }
}
 
 

 

 

'안드로이드 > Interface' 카테고리의 다른 글

Java Interface 예제  (0) 2019.11.18
Android Interface AsyncTask 예제  (0) 2019.11.05
Java 인터페이스(interface) 개요  (0) 2019.08.20
Android Interface 예제 ★★★  (0) 2018.08.22
Android Interface 예제 1  (0) 2018.08.20
블로그 이미지

Link2Me

,
728x90

Java는 다중상속을 지원하지 않는다. (C++은 다중 상속을 지원한다.)

두 조상으로부터 상속받는 멤버 중에서 멤버변수의 이름이 같거나 메서드의 선언부가 일치하고 구현 내용이 다르다면 이 두 조상으로부터 상속받는 자손클래스는 어느 조상의 것을 상속받게 되는 것인지 알 수 없다. 어느 한 쪽으로부터의 상속을 포기하던가, 이름이 충돌하지 않도록 조상클래스를 변경하는 수 밖에는 없다.
자바에서는 이러한 충돌문제를 해결하기 위해서 단일 상속만을 허용하고, 인터페이스를 이용해서 단일 상속의 단점을 보완하도록 하였다.

 

Java 인터페이스
- 인터페이스는 추상메서드, 상수 만을 가질 수 있으며, 이를 직접 구현하지 않는다.
- 인터페이스는 필드(변수)를 포함할 수 없다.
- 정의부분만 표현하고, 구현 부분은 상속받은 클래스에서 구현한다. (구현이라 함은 {}가 포함된 거)
- 클래스가 인터페이스를 가지는 경우 해당 인터페이스의 모든 멤버에 대한 구현(implementation)을 제공해야 한다.
- 여러개의 인터페이스를 부모로 둘 수 있다. (다중 상속 가능)
- 인터페이스로 객체를 생성할 수는 없다.
- 접근 제어자로 public 또는 default를 사용한다. (private 접근제한자는 사용할 수 없다.)
- 모든 멤버 변수는 public static final 이어야 하며, 이를 생략할 수 있다.
- 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.

- 인터페이스의 구현은 extends가 아닌 implements를 사용한다.

- 인터페이스는 둘 이상을 동시에 구현 가능하다.(다중 상속 효과)

- 인터페이스간 상속이 가능한데 이때는 extends를 사용한다.

 

Android에서는 한 프로세스가 다른 프로세스의 메모리에 정상적으로 액세스할 수 없다.

 

interface 인터페이스이름 {
      public static final 타입 상수이름 = 값;
      public abstract 메서드이름(매개변수목록);
}



- interface 내에 선언된 변수는 public static final 로 선언되고 이를 생략할 수 있다.
- interface 내에 선언된 메소드는 public abstract 로 선언되고 이를 생략할 수 있다.
- interface 도 참조변수 선언 가능하고, 메소드 오버라이딩 원칙도 그대로 적용된다.

 

인터페이스에 정의된 모든 멤버 변수는 예외없이 적용되는 사항이기 때문에 제어자를 생략할 수 있는 것이며, 편의상 생략하는 경우가 많다. 생략된 제어자는 컴파일 시에 컴파일러가 자동으로 추가해준다.
 
 

예제

 

import java.util.Scanner;
 
interface IEmployee {
    // 멤버 앞에 접근제한자 생략 가능
    // 컴파일러에 의해 public abstract 가 붙음
    String getName();
    void setName(String n);
    int getCounter();
}
 
class Staff implements IEmployee {
 
    private String name;
    private int counter;
    public static int NOofEmployees;
 
    public Staff() { // 생성자
        counter = ++counter + NOofEmployees;
    }
 
    @Override
    public String getName() {
        return name;
    }
 
    @Override
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    public int getCounter() {
        return counter;
    }
}
 
public class IEmployeeEx {
    private static Scanner kb;
 
    public static void main(String[] args) {
        String name;
        kb = new Scanner(System.in);
        System.out.print("직원 수 입력: ");
        Staff.NOofEmployees = Integer.parseInt(kb.next());
 
        Staff my = new Staff();
        System.out.print("신입 직원의 이름을 입력하세요: ");
        name = kb.next();
        my.setName(name);
 
        System.out.println("▷ 직원 정보 ◁");
        System.out.println(String.format("직원 번호 : %d, 직원이름 : %s", my.getCounter(),my.getName()));
 
    }
}
 
 

 

본 예제는 C# 강의를 들으면서 정리한 예제를 Java 로 구현한 것이다.

인터페이스에 대한 개념 이해가 부족해서 Android 에서 인터페이스 구현을 쉽게 못했는데 이제는 할 수 있을 거 같다.

C# 인터페이스 예제와 비교해서 보면 좀 더 이해가 빠를 수도 있다.

좀 더 심도있는 것은 구현해보면서 예제를 추가해볼 생각이다.

 

참고하면 좋은 자료

https://blog.naver.com/sensate1024/221232506713

 

블로그 이미지

Link2Me

,