코딩하렴

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

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);
			}
		});
	}
}

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

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

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

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

사이트의 정보

코딩하렴

으렴

활동하기