추상 클래스란?
자바에서는 하나 이상의 메서드를 포함하는 클래스를 가리켜 추상 클래스(abstract class)라고 한다.
추상 클래스는 OOP에서 중요한 특징인 다형성을 가지는 메서드의 집합을 정의할 수 있도록 해준다.
즉, 반드시 사용되어야 하는 메서드를 추상 클래스에 추상 메서드로 선언해 놓는 것이다.
그러면 이 클래스를 상속받는 모든 클래스에서는 이 추상 메서드를 반드시 재정의해야 한다.
추상 메소드란 ?
추상 클래스(abstarct class)란 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메서드를 의미한다.
자바에서 추상 메서드를 선언하여 사용하는 목적은 추상 메서드가 포함된 클래스를 상속받는
자식클래스가 반드시 추상 메서드를 구현하도록 하기 위함이다.
추상 클래스 구현 연습
abstract class Calculator{
public abstract int add (int a, int b);
public abstract int subtract(int a, int b);
public abstract double average(int[] a);
}
public class GoodCalc extends Calculator {
@Override
public int add(int a, int b) { // 추상 메소드 구현
return a+b;
}
@Override
public int subtract(int a, int b) { // 추상 메소드 구현
return a-b;
}
@Override
public double average(int[] a) { // 추상 메소드 구현
double sum = 0;
for (int i = 0; i<a.length; i++)
sum += a[i];
return sum/a.length;
}
public static void main(String[] args) {
GoodCalc c = new GoodCalc();
System.out.println(c.add(2, 3));
System.out.println(c.subtract(5, 2));
System.out.println(c.average(new int[] {2,3,4,5,6,7}));
}
}
인퍼페이스란?
인터페이스의 대한 개념은 자바에서의 인터페이스 개념과 실생활에서 쓰이는 인터페이스 개념이 있다.
실생활에서는 주로 컴퓨터 주변 장치에서 많이 사용하는 언어이고,
여기서 인터페이스는 서로 다른 하드웨어 장치들이 상호 데이터를 주고받을 수 있는 규격을 의미한다.
그렇다면 이런 규격이 왜 필요할까?
규격이 있어야 각종 생산 업체들이 그 규격에 지켜서 생산할 수 있을 뿐만아니라, 문제 없이 결합될 수 있다.
ex) 자동차, 110v 220v등 전원 규격
자바 인터페이스 특징
• 인터페이스는 interface 키워드를 사용하여 클래스를 선언하듯이 선언한다.
• 인터페이스는 추상 메소드와 상수 만으로 구성된다.
• 모든 메소드는 abstract public이며 생략 가능하다.
• 상수는 public static final 타입이며 생략 가능하다.
• 인터페이스의 객체는 생성이 불가능하다.
• 다른 인터페이스를 상속 할 수 있다.
• 인터페이스의 다중 상속이 가능하다.
• 인터페이스 타입의 레퍼런스 변수 선언이 가능하다.
전화기 규격 묘사 PhoneInterface 인터페이스 선언
interface PhoneINterFace { // 인터페이스 선언
public static final int TIMEOUT = 10000; // 상수 필드, public static final 생략 가능
public abstract void sendCall(); // 추상 메소드, public abstract 생략 가능
public abstract void receiveCall(); // 추상 메소드, public abstract 생략 가능
public default void printLogo(); // //default, public 생략 가능
system.out.println("** Phone ** );
}; // 디폴트 메소드
}
추상 클래스와 인터페이스 차이점
-----------------------강사님 강의 메모-------------------------
정보의 은닉(Information Hiding)
:클래스의 멤버를 외부에서 접근 못하게 하는 것
private - 클래스 외부에서 접근 금지
private 멤버 변수에 접근을 허용하기 위해서 getter, setter를 만들어서 제공
=> MVC 패턴에서 많이 사용됨.
-------------------------------------------------------------------------------------------
부모없는 자식없다.
- 부모클래스를 상속받아 자식클래스를 만들어서,
자식클래스의 인스턴스를 생성할 때 부모클래스의 인스턴스도 자동으로 생성됨
=> 자식클래스의 생성자를 호출하면 부모클래스의 생성자가 자동으로 호출됨
-------------------------------------------------------------------------------------------
업캐스팅
:자식클래스에서 부모클래스로 변환이 자동으로 됨
upcasting을 활용하면 자식클래스 여러개를 같이 처리할 수 있어서 확장성이 높다.
앞으로 새로 추가되는 자식도 처리할 수 있기 때문에 유지보수 편리.
-------------------------------------------------------------------------------------------
---------------------------------8일차 연습 문제---------------------------------
Point 클래스를 추상클래스로 바꾸어서 코딩해보기
abstract class Point{
abstract public void set(int x, int y);
abstract public void showPoint();
}
public class Quiz08_1 extends Point {
private int x,y;
private String color;
@Override
public void set(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public void showPoint() {
System.out.println("(" + x + "," + y + ")");
}
public void setColor(String color) {
this.color = color;
}
public void showColorPoint() {
System.out.print(color);
showPoint();
}
public static void main(String[] args) {
Quiz08_1 a = new Quiz08_1();
a.set(1, 2);
a.showPoint();
a.setColor("blue");
a.showColorPoint();
}
}
Point 클래스를 인터페이스로 바꾸어서 코딩해보기
interface Point2{
public void set(int x, int y);
public void showPoint();
}
class ColorColor implements Point2{
private int x,y;
private String color;
@Override
public void set(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public void showPoint() {
System.out.println("(" + x + "," + y + ")");
}
public void color(String color) {
this.color = color;
}
public void showColor() {
System.out.print(color);
showPoint();
}
}
public class Quiz08_2{
public static void main(String[] args) {
ColorColor a = new ColorColor();
a.set(1, 2);
a.showPoint();
a.color("blue");
a.showColor();
}
}
실무에서는 인터페이스 위주로 쓰인다고 한다.
추상클래스는 실무에서 잘 사용하지 않는 추세 !!~
업캐스팅 다운캐스팅 복습 필수..
뭔소린지 몰겠다..
'Back-End > Java' 카테고리의 다른 글
[java] 자바 String, StringBuffer, StringTokenizer 클래스 (0) | 2022.02.15 |
---|---|
[java] 업캐스팅(UpCasting)과 다운캐스팅(DownCasting) (0) | 2022.02.15 |
[java] 접근지정자 (0) | 2022.02.07 |
[java] 예외처리, 객체지향, 클래스 (0) | 2022.02.04 |
[java] continue와 break 그리고 배열 (0) | 2022.02.03 |