ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java abstract & interface
    쉽게 지나치는 개념/Java 2023. 1. 29. 23:59
    public class Common {
    
    	public static void main(String[] args) {
    		Unit [] group = {new Marine(), new Tank(), new Dropship()};
    		
    		
    		for(int i=0; i < 3; i++) {
    			group[i].move(100, 100);
    		}
    	}
    
    }
    
    abstract class Unit {
    	int x,y;
    	abstract void move (int x, int y);
    	void stop() {/*"현재위치에 정지"*/};
    	
    }
    
    class Tank extends Unit {
    	void move(int x, int y) {
    		System.out.println();
    	
    	}
    	void siezeMode(){/*시즈모드 사용한다.*/};
    }
    
    class Marine extends Unit{
    	void move(int x, int y) {
    		System.out.println();
    	}
    	
    	void steamPack(){/*스팀팩을 사용한다.*/};
    }
    
    class dropShip extends Unit{
    	void move(int x, int y) {
    		System.out.println();
    	}
    	
    	void air(){/*공중을 난다.*/};
    }

     

     

    abstract class Unit {    //미완성 클래스임.
       int x,y;
       abstract void move (int x, int y); // 자식 클래스들의 값들이 다르기 때문에 미완성 식으로 형성
       void stop() {/*"현재위치에 정지"*/}; // 모두 동일한 값이 형성 되어있으므로 완전한 식으로 작성  
    }

     

    *완전한 클래스 작성시에 추상클래스에 작성되어 있는 미완성 메서드들이 없으면 완전한 클래스가 될수없다.

     

    -완전한 클래스 작성을 위해서는 추상클래스에 있는 추상메서드 모두를 { }을 포함하여 완전한 메서드로 작성해주어야한다.

    -위 코드에서 stop 은 공통적인 것이므로 빠져도 상관이 없고 상속 받았으므로 적용이 되어있음.


    ※ 인터페이스와 추상클래스의 차이점

    -추상클래스는 일반 클래스인데 추상메서드를 가지고 있음 (일부 미완성)

    -인터페이스는 완전 아무것도 없고 추상메서드만 가지고 있음 (완전 만들어져 있지않음)


    인터페이스

     

    인터페이스 : 추상메서드의 집합 -> 프로그래밍 관점 

    -구현된것이 전혀없는 설계도

    -인터페이스는 다중상속이 가능하다.( 추상 메서드이므로, method의 몸체가 없기 때문이다.)

     

    인터페이스의 구현 : 인터페이스에 정의된 추상메서드를 완성하는 것

    class 클래스이름 implements 인터페이스 이름 {
            //인터페이스에 정의된 추상메서드를 모두 구현해야한다.
    }

    *만약 일부만 구현하는 경우에는 클래스 앞에 abstract를 붙여야 한다.

     

    ex) class Fighter extends Unit implements Fightable{

           //오버라이딩 규칙 : 조상 (public)보다 접근제어자가 범위가 좁으면 안된다.

            public void move(int x, int y) { 내용생략  } // 오버라이딩 하는것인데 오버라이딩 규칙을 지켜주어야한다.

                   

            public void attack(Fightable f) { 내용생략  }

    }

    => Unit클래스를 상속 받고  Fightable(부모는 아니지만 부모로 친다.) 인터페이스를 구현하고 있음

    *다중상속문제가 발생할수 있으나, 인터페이스는 몸통부분이 없기때문에 다중상속 문제가 발생하지 않는다.

     

     

    인터페이스의 장점 

    1. 개발시간을 단축할수 있다.
    2. 변경에 유리한 유연한 설계가 가능하다.
    3. 표준화가 가능하다. ex) 데이터베이스 변경을 jdbc를 통해 용이하게 변경가능하다.
    4. 서로 관계없는 클래스들을 관계를 맺어줄수 있다.

    default method

    ex) interface MyInterface {

          void method();

          void newMethod();

    }

              ↓

    interface MyInterface {

           void method();

           default void newMethod()  {  } // 몸통생성

    }

    ※ 디폴트메서드가 기존의 메서드와 충돌할 때의 해결책

    1. 여러 인터페이스의 디폴트메서드간의 충돌

       - 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 한다.

    2. 디폴트 메서드와 조상클래스의 메서드간의 충돌

        - 조상클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

     

     

     

     

Designed by Tistory.