43일차 (1) - java (추상 클래스, 추상 메서드, 인터페이스)

Yohan·2024년 4월 22일
0

코딩기록

목록 보기
60/156
post-custom-banner

추상 클래스, 추상 메서드 (Abstract)

추상이란?

구체성(具體性)이 없어서 그 뜻이 분명하지 않은 것
자바에서의 추상도 그 의미와 유사하다. 아직 완성되지 않은 불완전한 클래스와 메서드, 그것을 추상 메서드 그리고 추상 클래스라고 부른다.

추상 메서드란

메서드 선언만 되어 있고 메서드의 바디 (중괄호 부분) 이 없는 메서드

  • 틀만 구축해 놓고 알맹이는 없는 껍데기 메서드
  • 추상 메서드는 추상 클래스 에서만 선언할 수 있음

추상 클래스란

추상 메서드가 하나 이상 포함되어 있는 클래스

추상 클래스 특징

  • 추상 클래스를 상속받아 자식 클래스에서 오버라이딩하여 구현해서 사용
  • 미완성 메서드 (추상 메서드)가 포함되어 있기 때문에 객체 생성 불가능
  • 추상 클래스에서 추상 메서드로 정의된 것은 무조건적으로 구현해주어야 자식과 부모의 객체가 모두 생성될 수 있음
  • 추상 클래스는 추상 메서드와 더불어 모든 메서드 선언 가능 (일반적인 필드, 생성자, 인스턴스 메서드, static 메서드 등)
public abstract class Animal {
    public abstract void speak();

		public void walk() {
			System.out.println("동물이 걷습니다.");
		}
}
  • speak() 는 추상 메서드이므로 자식 클래스에서 추상 클래스를 상속받아서 무조건 구현해야한다.
  • walk() 처럼 일반 메서드는 선택적으로 구현해도된다.
public class Cat extends Animal {
    @Override
    public void speak() {
        System.out.println("냐옹");
    }
}

public class Dog extends Animal {
    @Override
    public void speak() {
        System.out.println("왈왈");
    }
}
  • 보다시피 자식 클래스에서는 speak()를 강제적으로 오버라이딩해서 구현했다.
    하지만 walk()는 구현하든 말든 크게 상관이 없는 것을 볼 수 있다. 또한 그냥 부모의 것을 바로 사용해도 괜찮다.

추상개념을 사용하는 이유

1. 다형성 구현 목적이 뚜렷해진다.

  • 추상 메서드는 자식 클래스에서 반드시 구현되어야 하기 때문에, 다형성을 구축해야
    하는 객체들의 경우 부모 클래스의 선언이 좀 더 단순화 될 수 있다.
    자식 클래스 쪽에서 구체적인 구현을 담당하게 함으로써 유지보수성을 더 높일 수 있다.

2. 코드 디자인 패턴 적용

  • 강제화를 시킬 수 있는 성격 때문에 틀에 잡힌 코드 패턴을 강제하기가 쉽다.

3. 코드 재사용성을 통한 객체지향적 프로그래밍

  • 상속을 통해 자식 클래스에서 구현을 강제하기 때문에 여러 자식들 쪽에서 코드가 재사용 되기 쉽고, 이는 결국 위에서 작성한 1번과도 맞물리는 이유이다. 객체를 통한 코드 작성이 좀 더 구체화 되기를 기대할 수 있다.

인터페이스 (Interface)

인터페이스란?

구현하고자 하는 클래스에 동일한 목적하에 동일한 기능을 수행하게끔 강제하는 클래스의 틀

인터페이스 특징

  • 구현 키워드는 implements
  • 추상 메서드와 상수, static 메서드만 가질 수 있다. (상수 : public static final 로 선언)
  • 처음 설계부터 객체를 만들지 않을 것을 가정했으므로 생성자 및 필드를 선언할 수 없다.
  • 기본적으로 추상화 상태이기 때문에 추상화 키워드(abstract)를 사용하지 않아도된다.
public interface SmartPhone {

	// 상수 선언가능!
    public static final int AGE = 10;

    // abstract 생략가능!
    // 추상 메서드
     void information();

}
  • 인터페이스들끼리 상속이 가능하다. 다중 상속도 가능하다. (상속은 단일 상속만 가능하다는 점과 다름)
// 인터페이스끼리 상속이 가능

public interface Aggressive extends Huntable, Wild {

}


// #####################################################################

// Huntable, Wild 인터페이스에서 정의한 추상메서드 모두를 Aggressive에서 사용 가능하게됨

package day10.inter.animal;
// 인터페이스는 클래스에서 다중 상속이 가능
public class Bulldog implements Pet, Aggressive {

	// Pet 인터페이스의 추상메서드
    @Override
    public void handle() {

    }

	// Pet 인터페이스의 추상메서드
    @Override
    public boolean inject() {
        return false;
    }

	// Aggressive 인터페이스의 추상메서드 (Huntable의 추상메서드)
    @Override
    public void hunt(Pet pet) {

    }

	// Aggressive 인터페이스의 추상메서드 (Wild의 추상메서드)
    @Override
    public void violent() {

    }
}
  • 필드를 자식 클래스에 내려주고 싶으면 추상 클래스로 내려준다. (인터페이스에서는 추상 메서드와 상수, static 메서드만 가질 수 있기 때문에)

public abstract class Animal {

    protected int age;
}

// #####################################################################

package day10.inter.animal;

// Animal 추상클래스를 상속받아서 Cat 클래스에서 age 필드 사용 가능
public class Cat extends Animal implements Pet, Aggressive {
    @Override
    public void hunt(Pet pet) {

    }

    @Override
    public void handle() {

    }

    @Override
    public boolean inject() {
        return false;
    }

    @Override
    public void violent() {

    }
}

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

1. 인터페이스는 추상 클래스보다 더 추상화된 개념

  • 추상 클래스는 추상 메서드와 일반 메서드 모두를 가질 수 있다.
    하지만 인터페이스는 모든 메서드가 추상 메서드이다. 추가적으로 상수 필드도 가질 수 있다.
    -추상 클래스는 단일 상속만을 지원하지만, 인터페이스는 다중 상속이 가능하다. 즉, 클래스는 하나의 추상 클래스만 확장할 수 있지만 여러 개의 인터페이스를 구현할 수 있다.
  • 추상 클래스는 생성자를 가질 수 있지만, 인터페이스는 생성자를 가질 수 없다.

2. 인터페이스는 동일한 구현 및 동일한 동작을 강제하는데 초점이 맞춰져 있다.

  • 인터페이스는 해당 인터페이스를 구현하는 클래스에서 반드시 추상 메서드를 구현하도록 요구한다. 이를 통해 다형성과 유연성 제공

추가)
추상 클래스는 상속이 기본 베이스.
즉, 개념 확장이 주 목적이므로 코드의 재사용성과 확장성을 고려할 때 사용한다.
인터페이스는 구현하고자 하는 객체들에게 동일한 메서드 이름을 강제한다. 나중에 객체 생성 후에 사용 방식을 강제하는 역할로 많이 사용한다.

profile
백엔드 개발자
post-custom-banner

0개의 댓글