추상클래스
공통된 것을 묶어놓은 것을 추상화라고 한다. 추상 클래스는 하나의 추상 메소드만 가져도 추상클래스로 인식 한다.
추상클래스는 생성자는 있지만 생성이 불가능하고 설계도 역할만 한다. 그 외에는 일반클래스와 동일한 기능을 가진다.
추상클래스를 상속 받으면 자식 클래스에서 부모의 추상 메소드를 전부 재정의를 하여야한다.
추상클래스는 다중상속이 불가능하다.
추상클래스는 중복되는 클래스들 멤버변수를 통합 및 확장을 할 수 있다.
package j14_추상;
//추상클래스
//공통된 것들을 모아두는 것을 추상화라고 한다.
//추상 메소드가 하나라도 있으면 추상클래스라고 정의함.
//생성이 불가능하다.
//설계도 역할
//그 외에는 일반클래스와 동일한 기능을 가진다.
public abstract class Transportation {
// 추상 메소드
public abstract void go();
public abstract void stop();
}
인터페이스
interface도 class와 동일한 기능을 가지고 있다. 하지만 메소드는 전부 abstract로 추상메소드이고, 일반 메소드를 쓸려면, default를 써줘야한다.
또한 interface는 멤버변수들은 가질 수 없지만, 상수는 가질 수 있다.
인터페이스는 추상클래스와 다르게 다중상속이 가능하다.
package j15_인터페이스;
//interface == class
//메소드 전부 abstract 메소드이다.
//일반메소드를 쓸러면 default를 써줘야한다.
//멤버 변수들은 가질수 없지만, 상수는 가질 수 있다.
//추상클래스와 차이점 관계성과 멤버변수를 가질수 있고 없고의 차이점
public interface Calculator {
public int ERROR = -9999999;
public double plus(double x, double y);
public double minus(double x, double y);
public default double multiplication(double x, double y) {
return x * y;
}
public double division(double x, double y);
}
추상클래스와 인터페이스의 사용처
인터페이스나 추상클래스는 똑같이 추상메소드를 통해 메소드를 강제구현을 시키는 추상화 클래스이다. 이 둘의 차이점은 다중상속이 가능하냐 불가능하냐로 볼 수도 있지만 각각 다른 사용처로 포인트를 나누어야한다
인터페이스 : implements라는 키워드처럼 인터페이스를 상속받는 클래스는 각 클래스의 목적에 맞게 기능을 구현하는 느낌과 하나의 물건에 도구를 끼우는 느낌으로 사용하는 것
추상클래스 : extends 키워드로 상속을 받기 때문에 인터페이스와는 달리 추상클래스의 기능을 하위클래스로 확장시키는 느낌
인터페이스 활용법과 형변환
package j15_인터페이스;
public class Main {
public static void main(String[] args) {
Equipment[] equipments = new Equipment[2];
equipments[0] = new GeneralCalculator(); //eq랑 gen 같이 생성
equipments[1] = new SmartPhone(); //
Calculator[] calculators = new Calculator[2];
calculators[0] = new GeneralCalculator();
calculators[1] = new SmartPhone();
System.out.println("모든 장비 전원 켜기");
for (Calculator c : calculators) {
Equipment eq = (Equipment) c;
eq.powerOn();
}//반대로 가능
System.out.println();
System.out.println("모든 장비 전원 켜기");
for (Equipment eq : equipments) {
eq.powerOn();
}
System.out.println();
System.out.println("모든 장비에서 10과 20을 더하기");
for (Equipment eq : equipments) {
Calculator c = (Calculator) eq;//다운캐스팅을 한후 업캐스팅을 한다.
double result = c.plus(10, 20);
System.out.println("결과 : " + result);
}
System.out.println("모든 장비에서 10과 0을 나누기");
for (Equipment eq : equipments) {
Calculator c = (Calculator) eq;
double result = c.division(10, 2);
System.out.println("결과 : " + result);
}
System.out.println("모든 장비 전원 끄기");
for (Equipment eq : equipments) {
eq.powerOff();
}
System.out.println();
}
}
'Language > Java' 카테고리의 다른 글
[Java] 익명 클래스 (0) | 2023.09.15 |
---|---|
[Java] Class 형변환 (0) | 2023.09.14 |
[Java] Class의 생성자(Constructor) 및 접근 지정자 (0) | 2023.09.13 |
[Java] Class와 객체지향언어(OOP) (0) | 2023.09.13 |
[Java] Method(함수) (0) | 2023.09.12 |