ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 추상화(Abstract)
    TIL(Today I Learned) 2022. 9. 28. 18:23

    추상화란?
    추상화(Abstract)란 클래스들의 중요하고 공통된 성질들을 추출하여 슈퍼클래스로 만든 것입니다.

     

    추상화의 원칙
    추상화 방식으로 메서드를 만들 땐 메서드의 기능을 쉽고 분명하게 이해할 수 있는 메서드명을 짓습니다.
    하나의 메서드는 완전한 하나의 기능만을 갖습니다.
    메서드의 코드 길이를 최대한 짧고 간결하게 작성합니다.

     

    추상화 사용 이유
    추상화를 사용했을 시 다음과 같은 장점이 있습니다.
    - 코드의 가독성, 간결성, 유지보수성(코드를 짧고 간결하게 작성하고, 추상화 클래스로 메서드를 관리하기 때문)
    - 코드의 재사용성(같은 기능을 하는 메소드를 여러 클래스에서 사용할 수 있기 때문)
    - 중복코드 감소(여러 클래스에서 공통으로 사용되는 메서드를 슈퍼클래스에 작성하고 하위 클래스에선 가져와 사용만 하면 되기 때문)

     

    추상화 예제 코드

    package abstractEx;
    
    public class Main {
    	public static void main(String[] args) {
    		Animal animal = new Animal(new Cat());
    
    		animal.input("콩순이다",26);
    	}
    }
    
    package abstractEx;
    
    public class Animal {
    	AnimalType animalType;
    	
    	public Animal(AnimalType animalType) {
    		this.animalType = animalType;
    	}
    	
    	public void input(String name, int age) {
    		animalType.input(name, age);
    	}
    }
    
    package abstractEx;
    
    public abstract class AnimalType {
    	
    	//추상 필드
    	String name;
    	int age;
    
    	public AnimalType() {} 	// 기본 생성자
    	
    	public void input(String name, int age) {
    		this.age = age;
    		this.name = name;
    		
    		this.howl();
    	}
    
    	public void howl() {
    		System.out.println( "내 이름은 " + name + "내 나이는 " + age);
    	}
    	
    	// 추상메서드 
    	// 하위클래스에서 무조건 구현을 해야함
    	abstract void force();
    	
    }
    
    package abstractEx;
    
    public class Cat extends AnimalType{
    	
    	String name;
    	int age;
    	
    	public void input(String name, int age) {
    		
    		this.age = age;
    		this.name = name;
    		
    		this.howl();
    	}
    	
    	public void howl() {
    		System.out.print("\""+ "니아옹~" + "\"" + " 내 이름은 " + name + " 내 나이는 " + age + "이다 냐옹~");
    	}
    	
    	
    	public void force() {
    		System.out.println("강제로 구현해야하는 메소드");
    	}
        
        
        package abstractEx;
    
    public class Dog extends AnimalType{
    	String name;
    	int age;
    	
    	
    	public void input(String name, int age) {
    		this.age = age;
    		this.name = name;
    	
    		this.howl();
    	}
    	
    	public void howl() {
    		System.out.print("\""+ "왈왈!" + "\"" + " 내 이름은 " + name + " 내 나이는 " + age + "이다 멍!");
    	}
    	
    	public void force() {
    		System.out.println("강제로 구현해야하는 메소드");
    	}

     

    추상화와 다형성의 차이
    추상화는 abstract 다형성은 interface입니다.
    추상화는 필드, 생성자, 상수, 메서드 등을 포함할 수 있습니다.
    다형성은 메서드와, default method만을 포함할 수 있습니다.

     

    추상화과 다형성의 공통점
    하위클래스의 메서드 구현을 강제합니다.

    다형성을 사용하는 이유
    추상화가 확실히 다형성보다 많은 기능을 제공하는 것처럼 보입니다. 그렇다면 다형성을 사용해야할 이유가 있을까요?
    다형성은 추상화보다 더 추상화된 개념입니다. 클래스로 치지도 않습니다. 이러한 특성이 다중 상속을 가능하게 만듭니다.
    (다중 상속이란 하위 클래스들은 하나의 부모 클래스만 가질 수 있는 원칙에 반하는 상속입니다. 즉, 여러 부모 클래스를 가질 수 있게 된다는 의미입니다.)

     

    default method란
    인터페이스 내에서 메서드를 구현할 수 있습니다.(원래는 추상 메서드만 존재해야합니다.)
    만약 default method가 있는 인터페이스를 다중 상속하려 할 때 오버라이딩을 해주지 않는다면 에러가 발생합니다. 오버라이딩을 사용해야 합니다.

    default method의 사용 이유
    인터페이스의 하위 클래스에 구현을 강제하는 특성이 가져오는 불편함 때문입니다. 예를 들어 인터페이스를 수정해야 하는 상황이 왔을 때 새로운 추상 메서드를 추가한다면
    하위 클래스 모두가 수정해야 하는 불상사가 발생합니다. 하지만 default method를 추가해주면 불상사를 방지할 수 있습니다.

     

    예제 코드

    interface MyInterface{
    	//default 메서드 생성
    	default void printHello(){
    		System.out.println("Hello World!");
    	}
    }
    
    public class MyClass implements MyInterface {}
    
    public class Main{
    	public static void main(String[] args){
    		MyClass myClass = new MyClass();
    
    		myClass.printHello();
    	}
    }

    output

    Hello World!

     

     

    'TIL(Today I Learned)' 카테고리의 다른 글

    try/catch/finally  (0) 2022.10.02
    HTTP Method  (0) 2022.09.30
    모듈/모듈화  (0) 2022.09.27
    자바 컴파일 흐름  (0) 2022.09.26
    오버로딩/오버라이딩  (0) 2022.09.26
Designed by Tistory.