Kim-Baek 개발자 이야기

자바 기본 (17) - 추상, 인터페이스 본문

개발/java basic

자바 기본 (17) - 추상, 인터페이스

김백개발자 2020. 10. 8. 02:07
예전에 자바를 처음 공부하던 때, 네이버 블로그에 정리한 내용을 이제 티스토리로 옮기고자 한다

 

◎ abstract
- 메소드와 class 에 붙는 제한자 (modifier)
- 추상의 , 구현되지 않은 이라는 의미
ex) public abstract class A { }       <- 구현이 덜 된 애
      public abstract void go( ) { }

※ 왜 abstract 가 나오게 된 것일까?
다형성과 오버라이딩 때문이다.

Animal 에 있는 eat 메소드의 경우 상속받는 모든 클래스에 공통적으로 적용되는 내용이기 때문에 추상적일 수 밖에는 없다. Dog 타입의 d.eat()를 하게 되면 Animal eat()가 불리는 것이 그 예시로 볼 수 있다.
-> 이렇게 추상적인 클래스의 경우 하위클래스에서 재정의 (오버라이딩) 해야하는데 이는 강제가 아니다.
-> 다른메소드를 만들 수도 있고, 안만들 수도 있고 자기 마음대로 하게된다.
   => 이것을 강제하는 것이 abstract 메소드이다

※ Animal 의 경우 타입으로는 많이 쓰인다. 하지만 실제 new Animal 로 객체를 생성해서 쓸일은 많이 없다
ex) 동물원에서 개 , 고양이 객체를 생성하지 동물객체를 생성하지는 않는다.
=> 부모클래스는 상속받는 클래스가 어떤일을 할지만 선언해주자 : abstract 클래스

◎ abstract 메소드
- 선언만 하는 메소드 : 구현은 하지 않는다.
ex) public abstract void go();   <-- 만약 여기에 {  } 중괄호가 들어가면 내용을 구현한것이다!(아무일도 하지마라라는 의미)
-> 하위 class 에서 overriding 하도록 강제하는 메소드이다(반드시 해야함!) => 구문을 통일시킨다.

class Animal{
public abstract void eat();
}
class Dog extends Animal{
public void eat()         <---- 먹다라는 기능을 가져야 하는데 이름 : eat , 리턴 : void, 파라미터 : x 로 강제한다.
  {
    //내용 구현            
  }
}



◎ abstract class
- 객체 (instance ) 생성을 못하는 class 가 된다.
- 역할 : 상속용 class -> super class
ex) public abstract class A{
                                                    <-- new A 불가능
}
-> abstract 메소드를 가지는 class는 반드시 abstract class가 되야한다.
-> 상속후 추상메소드를 overriding 하지 않으면 상속받은 class 도 abstract class가 되야한다. (overriding을 강제하게 된다)
-> 일반 class 구성요소 + 추상 메소드 : 추상 class

◎ UML 에서의 표기

class 명과 메소드 명이 Italic 체로 표기된다

※                 abstract         vs            final
class      객체생성X->상속                상속 X
메소드    오버라이딩 해라                 오버라이딩 X
변수                   X                            상수 (변수의 경우 public static 으로 같이 많이 사용된다)


◎ Interface
- 하위 class 들이  type 역할을 하는 구조
-> 
[ public abstract ] 메소드
   
 [ public static final ] 상수   이 둘만 가질수 있다. (앞의 제한자는 무조건 붙어야하기때문에 생략이 가능하다)
- 구문 : public 
interface 이름 [ extends 상위 interface 명, ....] {
   [public static final] 상수 = 값;
   [public abstract] 메소드 ();
}    
-> 생략을 하게되면 컴파일러가 알아서 넣어준다.
- 이름 : 관례 - class 이름과 동일 -> 단어의 첫글자가 대문자
- extends : 다른 interface를 상속하는 경우 추가 -> 
다중상속지원

※ UML 에서의 표기

-> public interface Shape{
  
 public int calculateArea();
}

※ class 의 interface 상속
   [ 제한자 ] class 이름 
[ extends SuperClass 이름 ] [ implements 상위 interface 이름, ... ]
                                   
->class 가 class 상속 (단일상속)   -> class 가 interface 상속 -> 다중상속
ex) public class sub extends 
C implements I1, I2, I3, I4 {  }
                                          
단일상속                다중상속
->  Sub 객체의 type : Sub, C, Object, I1, I2, I3, I4

※ Interface 역할
1. (상위) Type 으로서의 역할 : implements 할 하위 class들이 구현해야 하는 메소드구문 통일
                                             : implements 할 하위 class들의 공통타입이 된다.
                           
                  => 추상클래스와 동일
2. 다중상속
   => 큰 연관성 없는 class 들을 동일 Type으로 묶을 수 있다.

※ 왜 인터페이스는 다중상속이 될까?
클래스 상속은 똑같은 이름으로 구현된 메소드를 상속받았을 때, 어떤것을 할줄 모르게된다.
interface는 그렇지 않다. 똑같은 이름을 받더라도 구문만 제공하는 것이고 하위클래스에서 재 정의를 할 것이기 때문에 상관없다(이 클래스의 것을 쓸것이다)


※ 이클립스의 기능
- source -> override/implement methods 기본적으로 abstract는 체크가된다

- 클래스 생성시 interface 창에 add 하면 implement 할 인터페이스 추가가능

반응형
Comments