본문 바로가기
Back-End/Java

[java] 추상클래스와 인터페이스

by LeeGangEun 2022. 2. 8.

추상 클래스란? 

자바에서는 하나 이상의 메서드를 포함하는 클래스를 가리켜 추상 클래스(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();
	}		
}

실무에서는 인터페이스 위주로 쓰인다고 한다.

추상클래스는 실무에서 잘 사용하지 않는 추세 !!~

 

업캐스팅 다운캐스팅 복습 필수..

뭔소린지 몰겠다..