순수 추상 클래스
= 모든 메소드가 추상 메소드라서 코드를 실행할 바디가 없다
다형성을 위한 부모타입으로써 껍데기 역할만 제공
a. 인스턴스를 생성할 수 없다
b. 상속시 자식은 모든 메소드를 오버라이딩 해야한다
c. 주로 다형성을 위해 사용된다
인터페이스
순수 추상클래스와 동일하지만 + @
- public abstract 생략이 가능(생략이 권장됨!)
- 다중 상속을 지원한다
인터페이스를 사용하는 이유
- 제약 - 인터페이스를 구현하는 곳에서 인터페이스를 "반드시" 구현하라는 제약(규약) / 추상메소드가 아니기 때문
- 다중 구현 - 클래스 상속은 부모를 하나만 지정이 가능하지만 인터페이스는 부모를 다중 상속이 가능하다
interface Addin{
public int add(int a, int b); // abstract가 생략됨
public int add(int a);
/// 메소드 오버로딩
default void pr(){ // deafault를 붙였으므로 추상메소드가 아님!
System.out.println("희희");
}
}
class Add implements Addin{
public int add(int a, int b) {
return a+b;
}
public int add(int a) {
int sum=0;
for(int i=1;i<=a;i++) {
sum+=i;
}
return sum;
}
}
public class mmdd0229 {
public static void main(String[] args) {
Add a=new Add();
System.out.println(a.add(1,4));
System.out.println(a.add(10));
//Addin a=new Addin();
}
}
인터페이스 다중 구현
예시1)
package poly.diamond;
public interface InterfaceA {
void methodA();
void methodCommon();
}
package poly.diamond;
public interface InterfaceB {
void methodB();
void methodCommon();
}
package poly.diamond;
public class Child implements InterfaceA, InterfaceB {
@Override
public void methodA() {
System.out.println("Child.methodA");
}
@Override
public void methodB() {
System.out.println("Child.methodB");
}
@Override
public void methodCommon() {
System.out.println("Child.methodCommon");
}
}
package poly.diamond;
public class DiamondMain {
public static void main(String[] args) {
InterfaceA a = new Child();
a.methodA();
a.methodCommon();
InterfaceB b = new Child();
b.methodB();
b.methodCommon();
}
}
예시2)
interface Animal{
public void bear();
}
interface Fish{
public void swim();
}
class A implements Animal, Fish{ //다중상속
@Override
public void bear(){
System.out.println("낳는다");
}
@Override
public void swim() {
System.out.println("수영한다");
}
}
public class mmdd0229 {
public static void main(String[] args) {
A a = new A();
a.bear();
a.swim();
}
}
예시2)
interface A{
public void funcA();//추상 메소드
}
interface B{
public void funcB();//추상 메소드
}
interface C extends A,B{ //다중상속
public void funcC();//추상 메소드
}
class D implements C{
@Override
public void funcA() {
System.out.println("funcA");
}
@Override
public void funcB() {
System.out.println("funcB");
}
@Override
public void funcC() {
System.out.println("funcC");
}
}
public class test {
public static void main(String[] args) {
D d1=new D();
A a1=d1; //업캐스팅
a1.funcA();
B b1=d1; //업캐스팅
b1.funcB();
C c1=d1; //업캐스팅
c1.funcA();
c1.funcB();
c1.funcC();
}
}
클래스 상속과 인터페이스 구현
다중상속일때 (인터페이스 2개 이상일때!)
- public class Classname implements interfaceA, interfaceB
- public interface 자식interface extends 부모interface1, 부모interface2
예시1)
package poly.ex6;
public interface Fly {
void fly(); // 추상메소드
}
package poly.ex6;
public abstract class AbstractAnimal {
public abstract void sound();
public void move(){
System.out.println("동물이 이동합니다.");
}
}
package poly.ex6;
public class Dog extends AbstractAnimal{
@Override
public void sound() {
System.out.println("머엉");
}
}
package poly.ex6;
public class Bird extends AbstractAnimal implements Fly{
@Override
public void sound() {
System.out.println("까악");
}
@Override
public void fly() {
System.out.println("푸덕");
}
}
package poly.ex6;
public class Chicken extends AbstractAnimal implements Fly{
@Override
public void sound() {
System.out.println("꼬끼오");
}
@Override
public void fly() {
System.out.println("푸드덕푸드덕");
}
}
package poly.ex6;
public class SoundFlyMain {
public static void main(String[] args) {
Dog dog = new Dog();
Bird bird = new Bird();
Chicken chicken = new Chicken();
soundAnimal(dog);
soundAnimal(bird);
soundAnimal(chicken);
flyAnimal(bird);
flyAnimal(chicken);
}
private static void soundAnimal(AbstractAnimal animal) {
System.out.println("동물 소리 테스트 시작");
animal.sound();
System.out.println("동물 소리 테스트 종료");
}
//Fly 인터페이스가 있으면 사용 가능
private static void flyAnimal(Fly fly){
System.out.println("날개 테스트 시작");
fly.fly();
System.out.println("날개 테스트 종료");
}
}
예시2)
interface Po{
public void pr(int a, String b);
public void pr(String b);
}
class Point implements Po{
@Override
public void pr(int a, String b){
System.out.println(b+"는 "+a+"원 입니다.");
}
@Override
public void pr(String b){
System.out.println(b);
}
}
public class mmdd0229 {
public static void main(String[] args) {
Po p=new Point();
p.pr(30000,"java");
p.pr("python"); }
//실행 결과) java책은30000원
// python
}
예시3)
class Tv{
public void on() {
System.out.println("티비 켬");
}
}
interface Computer{
public void m();
}
class Com{
public void m() {
System.out.println("컴");
}
}
class Ipad extends Tv implements Computer{
Com c=new Com();
@Override
public void m() {
c.m(); //System.out.println("컴");
}
public void ip() {
m(); //컴
on(); //티비 켬
}
}
public class test {
public static void main(String[] args) {
Ipad i=new Ipad();
Tv t=i; //up
Computer c=i;//up
i.ip();
}
}
'Language > JAVA' 카테고리의 다른 글
[JAVA] 종합예시 (0) | 2024.03.08 |
---|---|
[JAVA] 객체배열 (1) | 2024.03.08 |
[JAVA] 추상클래스 ★ (0) | 2024.03.07 |
[JAVA] 다형성2 ★ (0) | 2024.03.07 |
[JAVA] 다형성1 ★ (0) | 2024.03.07 |