Chap 05. 추상 클래스와 인터페이스 심화

    1. 추상화

    추상화의 개념

    • 불필요한 정보를 숨기고 중요한 정보만을 나타내는 것을 의미
    • 추상화를 이용하면 어떤 영역에서 필요한 공통의 속성이나 행동을 추출함으로써 효율적은 코드를 작성할 수 있음.

    주상화의 예시

     

     

     

    ⭐ 데이터 추상화 vs 제어 추상화

     

     

     

     ⭐ 데이터 추상화 vs 캡슐화 비교

     

     

     

     

     

     

     

     

     


    2. 추상 클래스

    ⭐ 추상 메서드

    • 추상 메서드는 자식 클래스에서 구현됨(즉, 자식 클래스로 객체화 할 수 있음.)
    • 이는 부모 클래스가 메서드명만 가지고 있고 자식 클래스가 해당 메서드명을 사용하여 필요에 따라 본문을 정의한다는 것을 의미
    • 클래스에 추상 메서드가 포함되어 있으면 반드시 추상 클래스로 선언해야 함.

    추상 클래스 선언

     

    public abstract class Animal {  
          public abstract void printSound();                                        // 추상 메서드
          public void displayInfo() { System.out.println(“나는 동물입니다“);  // 일반 메서드
        } 
    }

     

     

     

    추상 클래스 사용 시 주의 사항

    • 추상 클래스는 항상 abstract 키워드를 사용하여 선언해야 함
    • 추상 클래스의 모든 메서드를 추상으로 사용할 필요는 없음
      • 추상 클래스에 일반적인 메서드가 포함될 수도 있음.
    • 클래스 메서드 중 하나가 추상 메서드이면 해당 클래스는 추상 클래스여야 함
    • 추상 클래스의 추상 메서드는 선언(시그니처)만 하고, 자식 클래스에서 해당 메서드를 재정의해야 함ㅁ
      • 추상 클래스(추상 메서드 포함)를 상속하는 경우 추상 메서드는 재정의는 필수
    • 추상 클래스는 자신의 인스턴스를 가질 수 없음
      • 추상적인 클래스의 객체를 가질 수 있으나, 추상 클래스를 참조하는 객체(즉, 자식 클래스를 통해 참조)는 가질 수 있음.
    • 프로그램이 자식 클래스의 객체를 만들 때 컴파일러가 추상 클래스의 생성자를 호출함
    • 상속만 가능하고 객체를 생성할 수 없는 클래스를 생성하려면 추상 클래스로 선언, 이 추상 클래스 내부에 일반 메서드와 추상 메서드 모두 가질 수 있으며, 추상 메서드는 반드시 구현되어야 함
    • 단일 클래스가 여러 추상 클래스를 상속받을 수 없음. 다중 상속을 구현하려면 인터페이스를 사용해야 함
    • 추상 클래스에 final() 메서드를 포함할 수도 있음

     

     

    ⭐ 추상 클래스의 상속

    • 추상 클래스는 그 자체의 인스턴스를 만들 수 없기 때문에 상속해서 사용하며, 보통의 클래스처럼 extends 키워드를 이용하여 상속함
    • 자식 클래스는 이러한 추상 클래스를 상속받고 추상 메서드를 재정의하여 사용함

    추상 클래스의 상속

     

     

     

     

     

     

     

     

     


    3. 인터페이스

    ⭐ 인터페이스의 개념

    • 추상 클래스와 마찬가지로 인터페이스는 그 자체의 객체를 만들 수 없음
    • 추상 클래스는 추상 메서드와 일반 메서드를 포함할 수 있지만, 인터페이스는 추상 메서드만 포함할 수 있음

     

    인터페이스 사용 이유

    • 완전한 추상화를 구현할 수 있음
    • 다중 상속을 구현할 수 있음
    • 느슨한 결합 관계를 형성할 수 있음

     

    인터페이스의 선언: interface

    인터페이스의 선언

     

     

     

    인터페이스 메서드

    • 매개변수만을 포함하고, 인터페이스를 구현하는(상속받는) 클래스에서 모든 메서드를 구현해야 함
    • 인터페이스 메서드는 기본적으로 public과 abstract이므로 명시적으로 선언하지 않아도 되며, 인터페이스 내에서 public 또는 abstract가 아닌 메서드를 정의하면 오류가 발생

     

     

     

    ⭐ 인터페이스의 상속

    • 다중 상속
    • 단일 클래스가 둘 이상의 클래스를 상속할 수 없어 다중 상속이 불가능하기 때문에 인터페이스를 사용하여 다중 상속 구현

    인터페이스의 다중 상속

     

     

     

    ⭐ 추상 클래스 vs 인터페이스

    구 분 추상 클래스 인터페이스
    목 적 상속 받아서 기능을 확장 구현 객체의 동일한 실행 기능을 보장
    클래스 클래스(abstract class) 클래스가 아님(interface)
    일반 메서드 일반 메서드 정의가 가능 일반 메서드 정의 불가능 (Java8 이후 static, default 메서드 정의 가능)
    멤버 변수 클래스와 동일하게 변수 선언 사용 가능 상수(final)만 사용 가능
    (interface 선언된 변수는 상수로 취급되어 final 생략 가능)
    상속 키워드 Extends Implements, extends
    다중 상속 불가능 가능
    추상 메서드 0개 이상 전부
    필드 일반 변수 및 상수 모두 가능 상수만 가능
    접근 제어자 제한 없음 public, default

     

     

     

     

     

     

     

     


    4. 객체지향 프로그래밍

    추상화를 하는 방법

    • 인터페이스(interface)를 이용하는 방법 : 다중 상속 지원(클래스 다중상속 안됨)
    • interface 키워드를 사용하여 선언하는 인터페이스 ⇒ implements
    • üinterface 키워드는 클래스가 구현해야 하는 동작을 지정하는 데 사용되는 추상 자료형
    • 인터페이스를 사용하려면 다른 클래스에서 인터페이스를 구현해야 함
    • 인터페이스 특징
      • 다중 상속 가능
      • 추상 메서드와 상수만 가능
      • 생성자 사용 불가
      • 메서드 오버라이딩 필수

     

     

     

    ⭐ 추상화를 하는 방법: interface vs 추상클래스

    //interface 추상화
    
    public interface Animal { 
       public abstract void sound();    
       // 추상 메서드만 사용                                          
    }
     
    public class Dog implements Animal {                       
       @Override                                                      
       public void sound() {                                             
           System.out.println(“interface : 멍멍“);                         
        }                                               
    }       
    
    public class HelloAnimal{  
       public static void main(String[] args) { 
          Dog dog = new Dog();
          dog.sound();
       } 
    }

     

    //추상 클래스 추상화
    
    abstract class Animal {
    	abstract void sound();
    	void sleep();    // 일반 메서드 가능
    }
    
    public class Dog extends Animal {
    @Override
    	public void sound() {
     		System.out.println(“추상:멍멍”); 
        }
        
    	void sleep() { System.out.println(“쿨~”); }
    }
    
    
    public class HelloAnimal {
    	public static void main(String[] args){
    		Dog dog = new Dog();
          	dog.sound();
    	}
    }

     

     

    'Java' 카테고리의 다른 글

    Chap 04. 상속과 다형성  (0) 2024.04.22
    Chap 03. 클래스/객체  (0) 2024.04.22
    Chap 02. 배열과 문자열  (1) 2024.04.20
    Chap 01. 객체지향 프로그래밍  (0) 2024.04.20
    JAVA 배열의 기초와 다차원 배열  (0) 2024.01.14

    댓글