JAVA

[JAVA] 추상클래스 / 추상메서드 / 인터페이스 Interface

sian han 2022. 3. 5. 00:40

 

 

※ 추상 Abstract

 

▶ 추상메서드 ( Abstract Method )

- 몸체 없는 메서드, 미완성 메서드

- 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에   
    부모 클래스에서는 선언부만 작성하고 실제 내용은 상속받는 자식 클래스에서 구현하도록 하는 것

 - 메서드의 구현부가 없다는 것 - 메서드 {} 블럭을 포함하고 있지않고, 선언부만(프로토타입) 존재

 - 추상클래스를 상속받는 자식 클래스는 오버라이딩을 통해 부모의 추상 메서드를 상황에 맞게 적절히 구현해주어야 함

 

 

▽ 추상메서드 형태

public abstract int funcA(매개변수);

 

▶ 추상클래스 ( Abstract Class ) 

 - 미완성 클래스, 부분적으로만 완성된 클래스

 - 미완성 메서드를 포함하고 있다는 의미

 - >>객체 생성 불가<< , 다형성 가능 ( = 자식 객체생성해서 자식의 오버라이딩 메서드 호출가능 ) 

 - 부모 클래스는 필요한 메서드를 추상적으로 정의할 뿐, 

   구체적으로 어떻게 구현할 것인가는 자식클래스에게 결정권을 줌

 - 상속을 통해서 자식 클래스에 의해서만 완성될 수 있음

 - 추상클래스도 생성자는 필요함

 

▽ 추상클래스 형태

	abstract class 클래스명{
   
   	}

= > 추상클래스를 상속한 후 모든 추상메서드들을 구현했을 때 객체를 생성할 수 있다

 

 

 

추상 클래스가 되는 방법

    1) 추상 메서드를 하나라도 포함하고 있는 클래스 

        - 자식클래스에서 추상메서드를 모두 구현해 주지 않으면

          자식클래스도 추상메서드를 포함하게 되므로 추상클래스가 됨
          하나라도 메서드 구현안하면 추상클래스가 됨

           모든 메서드를 구현해야 추상클래스를 벗어날 수 있음
    2) 추상메서드를 포함하고 있지 않더라도 클래스 선언할 때 abstract 키워드를 붙인 경우

 

 

이럴때 추상클래스를 만들어요 ! 

 - 추상 클래스는 (상속)의 관계를 형성하기 위한 상위 클래스로 
   인스턴스화시키기 위해서 정의한 클래스가 아닌 경우 추상 클래스로 만든다

 

이럴때 추상메서드를 만들어요 ! 

 - 추상 메서드는 (오버라이딩)의 관계를 형성하기 위해 정의된 메서드, 비어있는 메서드는 추상 메서드로 만든다

 

 

 

※ 인터페이스 (interface)

  - 일종의 추상 클래스

  - >>추상메서드와 상수만을 멤버로 가질 수 있다<<

    메서드 목록만을 가지는 타입 - 인터페이스는 계약, 일종의 약속으로 최소한의 계약사항을 명시할 뿐이다

  - 밑그림만 그려져 있는 기본 설계도 - 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는데 사용됨

  - 상속과 구현 동시가능 ( ex . class IPTv extends Tv implements  Computer ) 

  - 인터페이스끼리 상속할 때는 extends 키워드를 사용한다.

 

  ★ 모든 상수는 public static final 이어야 하며, 생략 가능 ★ 
  ★ 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다 

 

  - 따라서 자식클래스에서 메서드는는 public 이외의 접근제한자를 사용할 수 없다 // error남

    - 부모메서드를 오버라이딩할 때 접근 제한자는 부모보다 같거나 넓어야하므로

 

 

▽ 자식 클래스는 implements 키워드를 이용하여 구현   

interface IAnimal{
	public abstract void sound();
}

class Cat implements IAnimal{
	public void sound() {
		System.out.println("야옹~");
	}
 }

 

▽ 다형성 이용가능

     - 추상클래스처럼 interface로 객체생성은 불가하고, 다형성은 이용가능하다

IAnimal an = new Cat();
		an.sound();

 

다중상속가능 ( interface 2개의 메서드를 한개의 클래스에 묶어서 사용가능 )

interface Tv2{
	public void onTv();
}
interface Computer2{
	public void dataReceive();
}
class IPTv2 implements Tv2, Computer2{
	public void dataReceive() {
		System.out.println("영상 데이터 수신 중");
	}
	public void onTv() {
		System.out.println("TV영상 출력 중");
	}
    public void powerOn() {
		dataReceive();
		onTv();
	}
 }

 

 

 

 

 

▶ 이럴때 인터페이스를 만들어요 ! 

 

A - B 직접연결

class A{
		public void methodA(B b) {
		System.out.println("B 클래스의 메서드 !");
		
        	public void methodA(C b) {
		System.out.println("B 클래스의 메서드 !"); // 새로운 호출메서드 생성해서 호출
	}
  }
 class B{
	public void methodA() {
		System.out.println("B 클래스의 메서드 !");
	} 
}
.
.
  
 public static void main(String[] args) {
		A a = new A();
		a.methodA(new B());
		a.methodA(new C());
	}

methodA에 새롭게 만들어진 C 클래스를 넣고싶으면 

새로운 호출메서드를 작성해야한다. 

메서드를 새로 만들지않고 호출하는 방법은 없을까? 

                      ▽

 

A - I - B 간접연결

interface I{
	void method();
}
class AA {
	public void methodA(I i) { 
		i.method(); 
	} 
} 
class BB implements I{ 
	public void method() { 
		System.out.println("BB클래스에서 구현한 메서드"); 
	} 
} 
.
.
public static void main(String[] args) {
		AA a = new AA();
		a.methodA(new BB());
		a.methodA(new CC());
	}

main ()

1. AA 클래스 객체생성

2. 참조변수. 메서드명 으로 BB 클래스 객체생성해서 매개변수에 넣음

    참조변수 a 를 따라 AA 클래스로 감 -> methodA 메서드 찾음 -> 매개변수에 인터페이스 들어갔으니 인터페이스로      올라감 - > 클래스 BB를 매개변수로 넣었으니 -> BB 클래스로 가서 -> method 찾아서 구현함

 

= > 새로운 클래스를 만들어서 호출하고 싶으면 

      직접연결했을때처럼 새로운 호출메서드를 작성할 필요 없이

       main 에서 매개변수를 다른 클래스로 넣어주면 된다. 따라서 관리가 용이하고 

      클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.

 

 


 

추상클래스 (Abstract class) 와 인터페이스 (Interface) 의 공통점과 차이점

 

▶ 공통점 (대표적인것들만. 위에 다 쎠져있는데 한번 더 쓰는거임) 

 

추상클래스와 인터페이스는 선언만 있고 구현 내용이 없는 클래스다.

따라서 인터페이스와 추상클래스를 가지고 새로운 인스턴스(객체)를 생성할 수 없다.

 => 추상클래스를 extends로 상속받아 구현한 자식클래스나 인터페이스를 implements 하고 구현한 자식클래스만이 객체를 생성할 수 있다. => 결국 자식클래스가 무언가 반드시 구현하도록 위임해야할 때 사용해야 한다.


차이점

 

  ▷ 추상클래스 

추상 클래스는 일반적인 추상화 및 상속에 더 초점을 맞춘다면, 인터페이스는 인터페이스 메서드를 구현하게 하는 것에 초점을 맞춘다고 보면 된다


Q . 언제사용하나 ?

 - 쉽게 말하면 만들어야할 여러 클래스들의 공통점을 찾아 추상화시켜서 사용하는 것이 개발에서 이득일 때!

 

ex ) 

사자클래스 , 원숭이클래스 , 고래클래스  = > 포유류 추상크래스로 묶는다면

' 젖을먹인다 ' 라는 공통적인 기능 (=메서드) 을 중복으로 구현할 필요가없다.

 


▷ 인터페이스 

인터페이스는 구현하는 모든 클래스에 대해 특정한 메서드가 반드시 존재하도록 강제하는 역할이다.

구현 객체가 같은 동작을 한다는 것을 보장하기 위한 목적

 


출처: https://jeong-pro.tistory.com/82 [기본기를 쌓는 정아마추어 코딩블로그]

 

 

 

 

추상 클래스 이용한 코드 작성 후 다형성을 이용하여 구현 : 이클립스 > com.day20 > TestEmployee

인터페이스 이용한 코드 작성 후 다형성을 이용하여 구현 : 이클립스 > com.day20 > TestShape