오늘은 자바 추상클래스에 대해서 알아보자.
좋은 내용의 글을 발견해서 참고 했다.
추상 클래스란 클래스들간의 공통적으로 사용하는 변수와 메소드를 추출해 만든 클래스이다.
키보드로 예를 들면 각각의 키보드 제조사는 여러가지 디자인의 키보드를 제작 한다. 여러 제조사들의 공통점을 찾아보면 키보드를 누른다 라는 공통적인 메소드가 있다. 이 메소드를 추출해서 추상클래스안에 두면 된다. 또 다양한 디자인이 있지만 ㅁ이라는 키는 공통적인 변수이기 때문에 공통적인 변수도 추상클래스다
실체 클래스는 실체가 드러나는 클래스 이기 때문에 객체를 생성할 정도의 구체성을 가지지만 추상클래스는 메서드와 내용이 추상적이기 때문에 객체를 생성할 수 없다.
실체 클래스에서 공통적인 변수나 메소드를 추출해서 추상클래스에 추가 했기 때문에 상속적인 관계를 갖는다.
변화를 유연하게 하기위해 추상클래스를 사용하고 해당 규격에 대한 구현부만 수정하면 손쉽게 바꿀수 있는 장점이 있다
하나의 키보드 제조 클래스를 만들고 그 키보드 제조사와의 계약이 끝나고 새로 키보드 클래스를 만든다면 변수와 메소드를 전부 바꾸는 상황이 만들어진다. 그렇지만 추상클래스에서 미리 정의한 변수와 메소드가 있다면 쉽게 바꿀 수 있을것 이다. 따라서, 유지보수성과 통일성을 유지할 수 있다
추상클래스에서 선언한 메소드는 상속을 받는 실체 클래스에서 재정의를 해줘야 한다
추상클래스안에 있는 메소드는 추상메소드라고 하고 상속시 재정의를 해줘야 하난 메소드 인것이다
//Computer class
public abstract class Computer{
public abstract void display();
public abstract void typing();
}
class Tablet extends Computer {
@Override
public void display() {
System.out.println("태블릿 화면");
}
@Override
public void typing() {
System.out.println("태블릿 화면 타이핑");
}
}
class Phone extends Computer {
@Override
public void display() {
System.out.println("스마트폰 화면");
}
@Override
public void typing() {
System.out.println("스마트폰 화면 타이핑");
}
}
컴퓨터라는 추상 클래스를 선언하고 태블릿,폰이 상속받는다 각각의 클래스가 메소드를 클래스의 맞게 재정의 한다.
public class Main {
public static void main(String[] args) {
Tablet t = new Tablet();
t.display();
t.typing();
Phone p = new Phone();
p.display();
p.typing();
Computer c = t;
c.display();
c.typing();
Computer c1 = p;
c1.display();
c1.typing();
}
}
//출력화면
//태블릿 화면
//태블릿 화면 타이핑
//스마트폰 화면
//스마트폰 화면 타이핑
//태블릿 화면
//태블릿 화면 타이핑
//스마트폰 화면
//스마트폰 화면 타이핑
추상클래스는 객 생성이 안되기 때문에 묵시적 형변환을 통해 사용해야한다.
추상클래스를 상속받아 만든 실체클래스 인스턴스를 추상클래스에 넣으면 자동 타입변환을 발생시켜 실체 클래스 인스턴스 처럼 사용할수 있다 이를 타입의 다형성이라한다.
Tablet t = new Tablet();
t.display();
t.typing();
Phone p = new Phone();
p.display();
p.typing();
Computer c = t;
c.display();
c.typing();
Computer c1 = p;
c1.display();
c1.typing();
여기서 c라고 선언한 변수에 태블릿 객체와 폰 객체를 대입하면 자동으로 타입 변환이 되어서 해당 객체에 메소드를 실행한다.
동일한 기능을 수행하게끔 강제하는 것이 인터페이스의 역할이다. 자바의 다형성을 극대화 하여 개발코드 수정을 줄이고 유지보수성을 높이기 위해 인터페이스를 사용한다
키보드를 제조했는데 어떤 컴퓨터에는 쓸 수있고 어떤 컴퓨터에는 쓸 수 없는 상황이 있을수 있는 상황이 있다면 키보드 제조에 공통적인 모듈로 개발했다면 유지보수성의 불편함이 없을것이며 호환성도 높아질 것이다 제조사가 다른 키보드라도 모든 컴퓨터에 지원하는 것이 인터페이스다
//calculator class
public interface Calc {
double PI = 3.14; //상수를 선언
int ERR = -99999999;
int add(int num1, int num2); // 추상메소드를 선언
int min(int num1, int num2);
int mul(int num1, int num2);
int div(int num1, int num2);
}
class Calcu implements Calc {
@Override
public int add(int num1, int num2) { //메소들을 오버라이딩
// TODO Auto-generated method stub
return num1 + num2;
}
@Override
public int min(int num1, int num2) {
// TODO Auto-generated method stub
return num1 - num2;
}
@Override
public int mul(int num1, int num2) {
// TODO Auto-generated method stub
return num1 * num2;
}
@Override
public int div(int num1, int num2) {
// TODO Auto-generated method stub
return num1 / num2;
}
}
// main class
public class Main {
public static void main(String[] args) {
Calcu calculator = new Calcu();
System.out.println(calculator.add(1, 1));
}
}
// 2가 출력된다