2021.08.08
간단하게 몰랐던 부분만 적을 예정.
Jump to Java 5장 참고
특징 :
클래스
Animal cat = new Animal();
메소드
public void setName(String name) {
this.name = name;
}
Call by value
상속(Inheritance)
public class Dog extends Animal {
}
Animal dog = new Dog();//가능
Dog dog = new Animal(); // 컴파일 오류: 부모 클래스로 만든 객체는 자식 클래스의 자료형으로 사용할 수 없다.
생성자(Constructor)
public HouseDog(String name) {
this.setName(name);
}
HouseDog dog = new HouseDog("happy"); // 생성자 호출 시 문자열을 전달해야 한다.
HouseDog dog = new HouseDog();//컴파일 에러
public Dog() {
}
인터페이스
일종의 추상클래스. 추상클래스보다 추상화 정도가 높다.
추상메소드와 상수만 멤버 가능.
인스턴스 생성 불가, 클래스 작성에 도움을 줄 목적으로 사용.
미리 정해진 규칙에 맞게 구현하도록 표준 제시하는 데 사용
//Predator.java
public interface Predator {
public String getFood();
}
//Tiger.java
public class Tiger extends Animal implements Predator {
public String getFood() {
return "apple";
}
}
//Lion.java
public class Lion extends Animal implements Predator {
public String getFood() {
return "banana";
}
}
//변경 전
public void feed(Tiger tiger) {
System.out.println("feed apple");
}
public void feed(Lion lion) {
System.out.println("feed banana");
}
//변경 후
public void feed(Predator predator) {
System.out.println("feed " + predator.getFood());
}
tiger, lion은 각각 Tiger, Lion의 객체이기도 하지만 Predator 인터페이스의 객체이기도 하기 때문에 위와같이 Predator를 자료형의 타입으로 사용할 수 있다.
객체가 한 개 이상의 자료형 타입을 갖게되는 특성을 다형성(폴리모피즘)
중요 클래스를 작성하는 입장이라면(여기서라면 ZooKeeper가 중요한 클래스가 될 것이다) 클래스의 구현체와 상관없이 인터페이스를 기준으로 중요 클래스를 작성해야만 한다. 구현체(Tiger, Lion, Crocodile,...)는 늘어가지만 인터페이스(Predator)는 하나이기 때문
중요한 점은 메소드의 갯수가 줄어들었다는 점이 아니라 ZooKeeper클래스가 동물들의 종류에 의존적인 클래스에서 동물들의 종류와 상관없는 독립적인 클래스가 되었다는 점이다. 바로 이 점이 인터페이스의 핵심
다형성(Polymorphism)
하나의 객체가 여러개의 자료형 타입을 가질 수 있는 것
//Tiger.java
public class Tiger extends Animal implements Predator, Barkable {
public String getFood() {
return "apple";
}
public void bark() {
System.out.println("어흥");
}
}
Tiger tiger = new Tiger();
Animal animal = new Tiger();
Predator predator = new Tiger();
Barkable barkable = new Tiger();
인터페이스는 일반 클래스와는 달리 extends 를 이용하여 여러개의 인터페이스(Predator, Barkable)를 동시에 상속할 수 있다. 즉, 다중 상속이 지원된다. (※ 일반 클래스는 단일상속만 가능하다.)
의문 : 같은 형식의 메소드 우선순위 문제는 인터페이스에서는 해결했나??
추상클래스
클래스가 설계도라면 추상클래스는 미완성 설계도
추상메소드를 포함하고 있는 클래스
생성자는 있어야 한다.
다른 클래스를 작성하는 데 도움을 줄 목적으로 작성
인스턴스 생성 불가.
일반메소드가 추상메소드 호출 가능.
//Predator.java
public abstract class Predator extends Animal {
public abstract String getFood();
}
//Tiger.java
public class Tiger extends Predator implements Barkable {
public String getFood() {
return "apple";
}
public void bark() {
System.out.println("어흥");
}
}
추상클래스를 만들기 위해서는 class 앞에 abstract 라고 표기
또한 인터페이스의 메소드와 같은 역할을 하는 메소드(여기서는 getFood 메소드)에도 역시 abstract 를 붙이도록 한다.
Tiger클래스는 이제 Predator 인터페이스를 implements 하던 것에서 Predator 추상클래스를 extends 하도록 변경되었다.
추상클래스에 abstract 로 선언된 메소드(getFood 메소드)는 인터페이스의 메소드와 마찬가지로 추상클래스를 상속하는 클래스에서 반드시 구현해야만 하는 메소드
추상 클래스에는 abstract 메소드 뿐만 아니라 실제 메소드도 추가가 가능