JAVA_Abstract

승주😊·2021년 3월 23일
0

JAVA

목록 보기
3/7
post-thumbnail

다형성

  • 다형성은 여러 객체에게 동일한 명령을 내렸을 때 서로 다르게 반응하는 현상을 의미!
  • 즉, 여러 가지 형태를 가질 수 있는 능력을 의미
  • 다형성을 구현할 수 있는 방법은 추상클래스,인터페이스,메서드 오버라이딩,메서드오버로딩이 있다

추상화 (Abstract)✨

  • 추상화는 여러 객체에 공통적으로 사용되는, 사용되어야하는 내용을 뽑아내는 것을 의미
    -컴퓨터 관점에서 보면, 데이터나 프로세스 등을 의미가 비슷한 개념이나 표현으로 정의해나가는 과정
  • 추상화를 하게 되면 상세한 구현 보다 공통적 개념/관계에 집중할 수 있게 된다.

JAVA에서 추상화 🤷‍♀️

  • 자바에서는 클래스를 이용해서 객체를 표현하고 Abstract 키워드를 사용하여 생성 가능

추상클래스 (Abstract Class)

  • 추상클래스 : abstract method를 포함하고 있는 클래스를 의미
    • 추상메서드가 없어도 추상클래스가 될 수 있지만 추상메서드를 가졌으면 무조건 추상클래스가 되어야 한다!
    • abstract method : 선언부는 있지만 구현부가 없는 메소드
  • 추상클리스는 인스턴스 생성 불가!!
  • 추상클래스를 상속받는 자식클래스는 반드시 abstract method를 완성해주어야 함!!
  • 추상클래스는 코드의 공통적 부분을 보여주고 표준화하기 위한 용도로 사용

추상클래스 예시

  • Unit이라는 추상클래스가 있고, Army(육군) 클래스와 Navy(해군) 클래스가 이를 상속받아 추상메서드의 구현부를 완성해주었다!
  1. unit 추상화클래스
package JAVA_abstract;

public abstract  class Unit { //추상클래스 -> 추상 메서드를 하나라도 가지고 있으면 추상 클래스!
	
	 private String name;
	 
	//생성자
	 public Unit(String name){
		 super();
		 this.name= name; 
		
	 }

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
    
	//추상메서드 -> 상속을 통해 재정의 해야 비로소 인스턴스 생성 가능
	public abstract void attack(); //Override 필요

	public abstract void move(); //Override 필요
	
}
  1. Army 클래스 (Unit을 상속받음)
package JAVA_abstract;

public class Army extends Unit{ //abstract 추상화

	 public Army(String name) {
		 super(name); 
	 }
	 
	 @Override //오버라이딩
	 public void attack() {
		 
		System.out.println(this.getName()+" >> 육상공격!!");
	 }
	 
	 @Override
	 public void move() {
		 System.out.println(this.getName()+">> 육상이동!");
	 }
}
  1. Navy 클래스 (Unit을 상속받음)
package JAVA_abstract;

public class Navy extends Unit{
 
	public Navy(String name) {
		super(name);
	}

	@Override
	public void attack() { //추상클래스 override
		System.out.println(this.getName()+" >> 해군 공격!");
	}

	@Override
	public void move() { //추상클래스 override
		 System.out.println(this.getName()+" >> 해상 이동"); 
	}	
}
  1. Main & 실행 결과
package JAVA_abstract;

public class Main01 { //abstract 추상화

	public static void main(String[] args) {

	    Army army = new Army("육군");
        Navy navy = new Navy("해군");
       
        //추상클래스 오버라이딩 메소드 호출 
        army.move(); //오버라이딩 된 결과값이 출력된다. 즉 army의 move함수가 실행
        army.attack();
        
        navy.move(); // navy의 move 함수가 실행
        navy.attack();        
       
        /* 오버라이딩과 오버로딩의 차이
	* 오버로딩은 이름은 같지만 시그니처(파라미터수, 타입)는 다른 메소드를 중복 선언하는것
	* 오버라이딩은 이름,시그니처 모두 같은 메소드를 재정의하는 것이다. 
	*/
	}
}

[실행결과]
육군 >> 육군 이동
육군 >> 육군 공격
해군 >> 해군 이동
해군 >> 해군 공격

인터페이스(Interface) ✨

  • 인터페이스란 상수와 추상메서드의 집합이다!! (설계도 느낌)
  • 생성자를 가질수 없고 객체화가 불가능!!]
  • 인터페이스는 다중상속을 지원, 구현체에 여러개의 인터페이스를 구현 가능!
  • 인터페이스에 선언된 상수는 public static final이며 이는 생략 가능(컴파일 시 자동생성)
  • 인터페이스에 선언된 추상메서드는 public abstract이며 이는 생략 가능
                    사진 출처:https://joochang.tistory.com/76

인터페이스 사용 이유 🤷‍♀️

  • 함수의 구현을 강제하기 위해 사용
  • 확장가능성, decoupling, 다형성을 위해 사용
  • 유연한 개발이 가능해진다 (약한 결합,협업 유리, 다중 상속, 교체 용이)

인터페이스 사용 방법 🤷‍♀️

  • 인터페이스는 보통 xxxxable형식으로 네이밍한다!
  • 구현체는 인터페이스를 구현한 클래스를 의미하며 implemnets 키워드로 인터페이스 사용 가능!
  • 자바8 부터는 인테페이스에 디폴드 메서드도 지원

인터페이스 사용 예시

  • action, fight, move라는 인터페이스를 선언하고 character라는 클래스에서 이 3개의 인터페이스를 사용한다.
  1. action 인터페이스
package JAVA_interface;

public interface action {//interface 선언 방식
 
	 //추상 메서드 -> Character이라는 클래스에서 구현할 
	 public void pickup(); 
	 
}
  1. fight 인터페이스
package JAVA_interface;

public interface fight {//interface 선언 방식

	public void attack(); // 추상메서드
	
	public void shield(); //추상 메서드	
	
}
  1. move 인터페이스

package JAVA_interface;

public interface move {//interface 선언 방식

	public void walk(); // 추상메서드	
	public void run(); // 추상메서드
	public void jump(); //추상메서드
} 
  1. Character클래스 (3개의 인터페이스 사용)
package JAVA_interface;

public class Character implements  action,move,fight {
	private String name;
	
	public Character(String name) {
		this.name=name;
	}
    
    @Override
	public void pickup() { // action인터페이스의 추상메스드 구현
		System.out.println(this.name + "아이템을 줍다");
	}

	@Override
	public void attack() { //fight인터페이스의 추상메스드 구현
		System.out.println(this.name + "공격");
	}
	@Override
	public void shield() { //fight인터페이스의 추상메스드 구현
		System.out.println(this.name + "방어");
	} 
	@Override
	public void walk() { //move 인터페이스의 추상메서드 구현
		System.out.println(this.name + "걷다");
    }
	@Override
	public void run() { //move 인터페이스의 추상메서드 구현
		System.out.println(this.name + "뛰다");		
	}

	@Override
	public void jump() { //move 인터페이스의 추상메서드 구현
		System.out.println(this.name + "점프"); 
	}
	
}
  • class 클래스이름 implements 인터페이스 형식
  • 클래스는 다중 상속이 안되지만 인터페이스는 다중 구현 가능!
  • 반드시 사용하는 인터페이스의 추상메서드들을 재정의해주어야한다!!

인터페이스에서 디폴드메서드 사용예시

  • 디폴드 메서드의 목적은 기존 인터페이스 기능을 확장하며, 구현체에 공통적으로 들어갈 기능을 담음으로써 반복되는 코드의 작성을 줄여준다.
  • 반드시 default 키워드를 붙여줘야하며 구현부도 작성해준다.
interface Printable{ 
     public abstract void paper();
     
     public default void setPrint(boolean color){ //디폴트 메서드
     
         if (color){
            System.out.println("컬러 출력"); 
         }
         else (color){
            System.out.println("흑백 출력");
         }          
     }
}

요약 정리📚 (추상클래스 vs 인터페이스)

  • 공통점
  1. 추상클래스와 인터페이스는 선언만 있고 구현내용은 없는 클래스!
  2. 객체를 생성할 수 없다.
  3. 추상클래스를 상속받으 클래스와 인터페이스를 implements하고 구현한 클래스들만 객체 생성가능
  • 차이점
  1. 추상클래스는 단일상속만되고 인터페이스는 다중구현이 가능하다.
  2. 추상클래스는 상속을 강제해서 기능을 확장시크는 것을 목적으로 하고 인터페이스는 구현하는 모든 클래스에 대해 특정 메소드가 반드시 존재하도록 강제하는 것을 목적으로 한다.
profile
All the Best❤

0개의 댓글