코딩하렴

상속과 추상함수, 인터페이스의 활용

by 으렴

1. 단순히 생성자를 만들고 함수를 만듦

class Apple{
int num;
public Apple() {}
public void func() {
System.out.println("함수 call");
}
}

 

2. 계층상속

class Fruit{
int num;
public Apple() {}
public void func1() {
System.out.println("괴일");
}
}
class Banana extends Fruit{
int num2;
public Banana() {}
public void func2() {
System.out.println("배내내");
}
}
class Orange extends Banana{
int num3;
public Orange() {}
public void func3() {
System.out.println("과일의 자식인 바나나의 자식인 외랜지 함수3이 호출됨");
}
}

 

3. 추상함수

abstract class Apple {
int num;
public Apple() { }
public void func1() {
System.out.println("fun1");
}
public abstract void func2();
}
class Banana extends Apple{
int num2;
public Banana() {}
@Override
public void func2() {
System.out.println("123123");
}
}

 

4. 인터페이스

interface Apple {
public void fun1();
public void fun2();
}
class Fruit implements Apple {
@Override
public void fun1() {
// TODO Auto-generated method stub
System.out.println("인터페이스 1번");
}
@Override
public void fun2() {
// TODO Auto-generated method stub
System.out.println("인터페이스 2번");
}
}

인터페이스에도 abstract를 쓸 수 있지만 안쓰는 것이 일반적이다.

① 직접 객체생성 불가

② 미구현함수는 모두 구현해 주어야 함

③ 구현함수는 앞에 반드시 퍼블릭 붙인다

 

5. 다중 인터페이스

interface Apple {
public void fun1();
}
interface Fruit {
public void func02();
}
class Orange implements Apple, Fruit {
@Override
public void func02() {
}
@Override
public void fun1() {
}
}

5개, 6개, 7개까지도 받아서 쓰는 경우가 있다.

자바는 다중상속은 안되지만 다중 구현은 가능하다.

 

6. 상속과 다중 인터페이스

class Apple {
}
interface Fruit {
public void func01();
}
interface Orange {
public void func02();
}
class Kiwi extends Apple implements Fruit, Orange {
@Override
public void func02() {
}
@Override
public void func01() {
}
}

상속과 구현을 같이

 

7. 인터페이스의 상속

interface Fruit {
public void func01();
}
interface Apple extends Fruit {// 구현은 불가하니까 상속으로 하셈
public void func02();
}

인터페이스도 상속이 가능하다

 

8. 내부 인터페이스

interface Apple {
public void func01();
interface Fruit { // 인터페이스안에 인터페이스를만들수있다.
public void func02();
}
interface melon {
public void func03();
}
}
class Orange implements Apple {
// 내부 인터페이스(Fruit)는 없다고 사용하면 된다
@Override
public void func01() {
}
class Kiwi implements Apple.Fruit { // 두개의interface가 상호 밀접한 관계가 있을때
@Override
public void func02() {
} // 내부 인터페이스 사용방법
}
}

음식 interface - 한식, 중식, 양식 뭐이런 관계?

내부 인터페이스는 interface가 한개 이상들어가는 경우 사용한다.

 

9. 인터페이스 안에 클래스는

interface Apple {
public void func01();
class Fruit { // interface안에 class
public void func02() {
System.out.println("롸?");
}
}// 안에 있는 클래스없다고 생각하고
}
class Orange implements Apple {
@Override
public void func01() {
}
}
class Kiwi extends Apple.Fruit { // 둘이 밀접한 관계
}

 

10. 이너클래스의 메소드 사용하기

class Apple {
public void func01() {
}
class Fruit {
public void func02() {
}
}
}
public class Test {
public static void main(String[] args) {
Apple a = new Apple();
Apple.Fruit b = a.new Fruit();
a.func01();
b.func02();
}
}

 

11. 인터페이스 구현하기

interface Apple {
public void func01();
}
class Fruit implements Apple {
@Override
public void func01() {
}
}
public class Test {
public static void main(String[] args) {
Apple a = new Apple() { // 익명 class 잘 안써
@Override
public void func01() {
}
};
new Apple() { // 익명 객체 많이써 :
public void func01() {
}
};
new Apple() { // 익명 한번쓰고 버릴꺼양
public void func01() {
}
}.func01();
}
}

인터페이스로 익명class, 익명객체 생성시키기.

public class Test {
public static void main(String[] args) {
Fruit ba = new Fruit();
new Apple() { // 객체가 없어서 메모리가 만들어졌다가 바로 사라진다.
public void func01() {
}
}.func01();// 이렇게하면 함수를 콜할수이따. : 익명객체 (동적으로 생성했다가 필요없어지면 바로버려버림
}
}

 

12. 함수의 매개인수로 인터페이스를 전달하고 그 인수로 코드(익명 클래스)를 전달하였다

interface Apple {
public void func01();
}
class Fruit {
public void Func02(Apple apple) {
System.out.println(1);
apple.func01(); // 받은 apple을 사용한다
}
}
public class Test {
public static void main(String[] args) {
Fruit b = new Fruit();
b.Func02(new Apple() { // 함수의 인수로 '코드'를 전달해주었다.
public void func01() {
System.out.println(2);
}
});
Fruit bb = new Fruit();
bb.Func02(new Apple() {
public void func01() {
System.out.println("와웅");
}
});
}
}

 

13. class안에 인터페이스와 내부인터페이스의 구현과 사용

class Apple { // class안에 interface
// public void Func01(); //이렇게 잘 안쓴다.
interface Banana {
public void func02();
}
}
class Orange implements Apple.Banana {
@Override
public void func02() {
}
}
public class Test {
public static void main(String[] args) {
Orange o = new Orange();
o.func02();// 요렇게는 잘안쓰
Apple.Banana ab = new Apple.Banana() {// interface안에 interface를 이런식으로 구현할수있다.
@Override
public void func02() {
System.out.println(1);
}
};
new Apple.Banana() {
@Override
public void func02() {
System.out.println(2);
}
};
new Apple.Banana() {
@Override
public void func02() {
System.out.println(3);
}
}.func02();
}
}

 

15.  인터페이스 활용

interface Apple {
public void func01();
}
class Banana implements Apple {
public void func01() {
System.out.println("func1");
}
}
public class Test {
public static void main(String[] args) {
Banana b = new Banana();
b.func01();
Apple apple = new Apple() { // 바로 위의 객체생성과별개로 따로 생성해서 사용할수도있다.
public void func01() {
}
};
new Apple() {
public void func01() {
}
};
// --------
Banana bb = new Banana() {
public void func01() {
}
}; // 이렇게하면 기존코드를 무시하고 자기 코드로 바꿔버림
}
}

 

16. 추상 클래스와 인터페이스의 활용

interface Apple {
public void func01();
}
abstract class Banana implements Apple { // 이거는 interface안에 interface있는거랑 똑같당
public void func01() {
}
abstract void func02();
}
public class Test {
public static void main(String[] args) {
Banana b = new Banana() {
public void func01() {
}
void func02() {
}
};
new Banana() {
public void func01() {
}
void func02() {
}
};
}
}

 

17. 내부 인터페이스와 사용

class A {
interface B {
public void funcB();
A a = new A();
}
A.C ac = new C() {
void funcC() {
};
}
}
interface C {
public void funcC();
A a=new A(){
};
A.B ab=new B(){void funcB();};
}

 

18. 실제 예

class View {
interface OnClickListner {
public void OnClick();
}
interface OnBoubleClickListner{
}
}
class Button {
void SetOnClickLinstner(View.OnClickListner ab) {
ab.OnClick();
}
}
public class Test{
public static void main(String[] args) {
Button c = new Button ();
c.SetOnClickLinstner(new View.OnClickListner () {
public void OnClick(){
System.out.println(1);
}
});
}
}

이게 안드로이드에서 셋온클릭리스너를 사용하는 문법이다

이런식으로 버튼을 클릭했을때 이벤트를 걸어서 처리하는 것에 사용한다.

클릭이벤트 -> 제일중요한거 익명객체 만드는 것

익명클래스와 익명객체를 만드는것이 제일 중요하다 봐둬라!

사이트의 프로필 사진

사이트의 정보

코딩하렴

으렴

활동하기