Java - 추상클래스, 인터페이스

갓김치·2020년 8월 31일
0

자바 객체지향

목록 보기
12/13

참고

  • p.162~
  • 추상클래스: AbsTest.java

추상클래스

추상메서드

  • 미완성된 메서드
  • 선언부 only
    • 메서드 = 선언부 + 구현부
  • 조상클래스: 선언부만 작성 / 자손클래스: 구현부 작성

추상클래스

  • 미완성된 클래스
    • 미완성된 메서드(추상메서드)를 포함하고 있다.
  • 인스턴스 생성 불가
    • 아예 못 만드는건 아닌데 객체를 생성하려면 구현안된 메서드까지 만들어야함
    • abstract으로 만들려면 구현안된 메서드를 동시에 다 구현을 해야만 객체가 완성이 됨.
    • 그럼 메인에 생성자안에 내부클래스가 생성되서 구현부분이 생김
  • abstract class : 이 클래스에는 추상메서드가 있으니 상속을 통해서 구현해 주세욜
  • 클래스이긴 하기때문에 생성자, 멤버변수, 메서드 를 가질 수 있다.
  • 어떤 기능을 수행할 목적으로 만든것인지?
public class AbsTest{
    public static void main(String[] args){
    
    }
}

abstract class Unit{
    int x; //2D게임의 좌표
    int y;
    
    abstract void move(int x, int y); //이동하는 '기능'은 같으나, '방식'이 다름
    
    void stop(){
    
    }
}

class Marine extends Unit{//1. 추상클래스 자손 -> 추상클래스
              // or 2. 추상메서드 오버라이드 하여 구현 -> 일반메서드 -> 일반클래스
    void stimPack(){
    
    }
    
    @Override
    void move(int x, int y){
    
    }
}

class Tank extends Unit{
    void changeMode(){
    
    }
    
    @Override
    void move(int x, int y){
        //오버라이드해서 추상메서드 수정 
        //-> 일반메서드로 사용하기때문에 추상클래스 될 필요 X
    }
}

인터페이스 (Interface)

  • 일종의 추상클래스이지만 멤버변수로 상수와 추상메서드만 가진다.
interface 인터페이스명{
    (public static final) 변수타입 변수명 =;
    (public abstract) 반환타입 메서드명(매개변수);
}
  • 모든 변수public static final 이어야한다. -> 생략가능
  • 모든 메서드public abstract 이어야한다. -> 생략가능
  • 접근제어자로 public, default만 가능

인터페이스의 상속

  • 인터페이스는 클래스를 상속할 수 없고, 인터페이스만 상속가능
    • 클래스는 일반변수도 가지고 있기때문에 상속받게되면 추상메서드, 상수 외에 다른 것도 가지게 되기 때문에
  • 다중상속가능
    • 선언부밖에 없기때문에
    • 구현부는 나중에 만들면 되니까

인터페이스의 구현

  • p.167, InterTest.java
  • 자체로는 객체를 생성할 수 없다.
    • 모든 메서드: 추상메서드 -> 생성자 또한 메서드 -> 생성자 구현부가 없어 객체생성불가
  • 자신이 정의된 추상메서드의 몸통을 만들어주는 클래스가 존재해야 한다.
  • 상속 => extends, 구현 => implements
  • 인터페이스의 일부분만 구현하였다면 해당 클래스는 추상클래스가 된다.
  • 인터페이스 타입의 참조변수로 이 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다
public class InterTest{
    public static void main(String[] args){
    
    }
}

class Unit{
    int x;
    int y;
    int currentHP; //current : 현재와 관련된 일을 하는 변수들
}

class Fight extends Unit implements Fightable{ //인터페이스 구현체(=클래스)
    //Fightable의 메서드를 다 구현해주지 않으면 추상클래스가 된다.
    
    @Override
    public void move(int x, int y){
    //Movable의 메서드 접근제어자 public abstract가 생략되어있음
    //오버라이딩시 조상의 메서드보다 넓은 범위로 해야함
    //반드시 public 으로 해주어야함
    }
    
    @Override
    public void attack(Unit u){
    
    }

}

interface Fightable extends Movable, Attackable{ //인터페이스 다중상속

}
interface Movable{ //인터페이스 생성
    void move(int x, int y); //구현부 없어야함
}

interface Attackable{
    void attack(Unit u);
}

명칭

  • 과거: ~able(~을 할 수 있는)
  • 현재: IMember 인터페이스 => IMemberImpl 구현체 (인터페이스를 구현한 클래스)

인터페이스의 장점

  • p.170
  • 개발시간 단축
  • 표준화 가능
  • 서로 관계가 없는 클래스들에게 관계를 설정해줄 수 있다.
  • 독립적인 프로그래밍

인터페이스의 이해

  • 클래스를 사용하는 쪽 (user), 제공하는 쪽(provider)
  • 메서드를 사용하는 쪽에서는 선언부만 알면 된다.
  • A-B (직접관계) --변경--> (간접관계) A - I - B
profile
갈 길이 멀다

0개의 댓글