인터페이스

인터페이스의 메소드는 메소드의 이름과 입출력에 대한 정의만 있고 그 내용은 없다. 그 이유는 인터페이스는 규칙이기 때문이다.

예를들면, USB포트의 규격만 알면 어떤 기기도 만들 수 있다. 또 컴퓨터는 USB 포트만 제공하고 어떤 기기가 만들어지는 지 신경쓸 필요가 없다. 바로 이 점이 인터페이스와 매우 비슷하다.

 

인터페이스 상수와 스태틱 메서드를 활용하여 클래스에서 사용하던 스태틱 메서드와 유사한 목적으로 사용 가능하다.

 

※ 인터페이스의 메소드는 항상 public으로 구현해야 한다.

인터페이스는 인터페이스의 메소드를 반드시 구현해야 하는 "강제성"을 갖는다는 점을 반드시 기억하자.

interface Predator {
		// = public static final
		int sampleCnt = 4;
		void bark();
		// static method in interface
		static int get() {
			return sampleCnt;
		}
}

상속

기존 클래스(base or super)와 새로 만드는 클래스(sub, child)의 관계를 설정하여 코드를 재사용할 수 있다. 베이스 클래스로부터 상속받아서 서브 클래스를 생성하면, 생성된 서브 클래스에서는 베이스 클래스의 모든 멤버를 갖게되고 동일한 인터페이스를 갖는다. 모든 서브 클래스는 베이스 클래스와 같은 타입이 된다.

class Animal {
		protected String name;
		private int age;
	}
	
class Cat extends Animal {
    void sleep() {
        System.out.println(this.name + " zzz");
    }
}
	
class HouseCat extends Cat {
    // method overriding.
    void sleep() {
        System.out.println(this.name + " zzz in house");
    }
}
Cat cat = new Cat();
cat.setName("cat");
cat.setAge(20);
cat.sleep();
System.out.println(cat.getName());

Animal animal = cat;
System.out.println(animal.getName());
// 불가 -> System.out.println(animal.sleep());
HouseCat hCat = new HouseCat();
hCat.setName("hcat");
hCat.sleep();

단, 자바는 다중상속을 지원하지 않는 점에 유의하자!

 

다형성

void barkAnimal(Animal animal) {
      if (animal instanceof Tiger) {
            System.out.println("어흥");
        } else if (animal instanceof Lion) {
            System.out.println("으르렁");
        } else if (animal instanceof Crocodile) {
          System.out.println("쩝쩝");
        } else if (animal instanceof Leopard) {
          System.out.println("캬옹");
        }
    }

위와 같은 메소드는 Animal 클래스를 상속받는 클래스가 증가함에 따라 분기처리가 늘어날 것이다. 이런 경우에 아래처럼 다형성을 활용하면 분기처리를 없앨 수 있고, 보다 명확하게 의미를 전달 할 수 있다.

class Animal {
    protected String name;
    private int age;

    void barkAnimal(Predator pre) {
        pre.bark();
    }
} 

class Cat extends Animal implements Predator{
    void sleep() {
        System.out.println(this.name + " zzz");
    }

    @Override
    public void bark() {
        System.out.println("==== Cat bark");
    }
}

class Dog extends Animal implements Predator {
    @Override
    public void bark() {
        System.out.println("==== Dog bark");
    }
}

참고로 인터페이스는 다중상속을 지원한다.

 

 

추상클래스

추상클래스(Abstract Class)는 인터페이스의 역할도 하면서 클래스의 기능도 가지고 있는 자바의 돌연변이 같은 클래스이다. 추상 클래스에는 abstract 메소드 외에 실제 메소드도 사용할수 있다. 추상클래스는 인터페이스로 대체하는것이 좋은 디자인이라고도 얘기한다.

 

추상 클래스는 인터페이스와는 달리 일반 클래스처럼 객체변수, 생성자, private 메서드 등을 가질 수 있다.

 

※ 추상 클래스는 일반 클래스와는 달리 단독으로 객체를 생성할 수 없다. 반드시 추상 클래스를 상속한 실제 클래스를 통해서만 객체를 생성할 수 있다.

abstract class Animal {
		private int age;
		protected String name;
		
		abstract void printName();
		void print() {
			System.out.println("print " + name);
		}
}
class Cat extends Animal {

    @Override
    void printName() {
        System.out.println("Cat!");
    }
    void print() {
        System.out.println("print child " + name);
    }

}
//불가 -> 구현체가 있어야한다.
//Animal animal = new Animal();

// 추상클래스로도 다형성을 구현가능.
Animal animal = new Cat();

animal.setName("jds");
animal.printName();
// 오버라이딩된다.
animal.print();

Cat cat = new Cat();
cat.setName("jds2");
cat.print();

출처

- https://wikidocs.net/280

 

'프로그래밍 > Java' 카테고리의 다른 글

Java Collection  (0) 2022.01.13

+ Recent posts