BlueHarmel
BlueHarmel Devlog
BlueHarmel
전체 방문자
오늘
어제

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 분류 전체보기 (330)
    • Book (11)
    • Dev (29)
      • ArtCon (0)
      • ESTsoft 오르미 (29)
    • Study (290)
      • Web (18)
      • AWS (2)
      • 알고리즘 (1)
      • GameDev (1)
      • 정보처리기사 (201)
      • English (1)
      • Mathematics (24)
      • 머신러닝 (7)
      • 딥러닝 (10)
      • 네트워크 보안 (5)
      • R (4)
      • 컴퓨터 네트워크 (6)
      • 데이터베이스 (8)
      • 데이터 통신 (0)
      • 운영체제 (2)
      • TIL (0)
    • Project (0)
      • 개인 (0)
      • 단체 (0)

인기 글

hELLO · Designed By 정상우.
BlueHarmel

BlueHarmel Devlog

Dev/ESTsoft 오르미

인터페이스

2024. 2. 23. 10:58

1. 인터페이스의 선언

  • 인터페이스 : 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할을 하는 일종의 추상 클래스
  • 어떤 객체가 특정 인터페이스를 사용한다면 그 객체는 반드시 인터페이스의 메소드들을 구현해야 한다.
다음은 어떤 동물원의 사육사가 하는 일이다.

난 동물원(zoo)의 사육사(zookeeper)이다.
육식동물(predator)이 들어오면 난 먹이를 던져준다(feed).
 - 호랑이(tiger)가 오면 고기(meat)를 던져준다.
 - 사자(lion)가 오면 생선(fish)를 던져준다.
package chapter08;

import java.util.ArrayList;
import java.util.List;

public class Sample {
    public static void main(String[] args) {
        Zookeeper zookeeper = new Zookeeper();

        Lion lion = new Lion();
        zookeeper.feed(lion);

        Tiger tiger = new Tiger();
        zookeeper.feed(tiger);

        Crocodile crocodile = new Crocodile();
        zookeeper.feed(crocodile);

//        Predator[] predators = {lion, tiger, crocodile};
        Predator predator = new Lion();
    }
}
class Animal {
    String name;
    void setName(String name) {
        this.name = name;
    }
}
class Tiger extends Animal implements Predator {
    @Override
    public String getFood() {
        return "meat";
    }
}
class Lion extends Animal implements Predator {
    @Override
    public String getFood() {
        return "fish";
    }
}
class Crocodile extends Animal implements Predator {
    @Override
    public String getFood() {
        return "strawberry";
    }
}

class Zookeeper {
    void feed(Predator predator) {
        System.out.println("feed " + predator.getFood());
    }
}
package chapter08;

public interface Predator {     // 육식동물 인터페이스
    String getFood();
}
  • 추상클래스는 하나밖에 상속받지 못하지만 인터페이스는 다중 구현이 가능하다
  • 추상클래스는 상속을 통해 기능을 확장해나가는 목적으로 자주 사용
    • 하나의 상위 클래스로 묶는것이 가능한 경우, 상속을 한다.
    • 완전 구현한 메소드와 바디부분이 없는 메소드 둘다 구현 가능
  • 인터페이스는 기능 확장이라기보다는 뼈대를 클래스로 가져와서 살을 붙이는 느낌으로 사용한다.
    • 클래스들이 가지는 공통된 특징을 정의해둔 것이라고 생각하면 편할 듯? (여기 해당되면 너도 우리 인터페이스야)
    • 장점 :
      1. 메소드의 선언과 구현을 분리시킬 수 있게 한다(다형성)
        • 선언 : interface
        • 구현 : implement한 클래스
      1. 추상 클래스보다 관계도가 낮아 사용하기 편하다
        • 상속관계를 신경쓰지 않아도 된다
        • 다중상속도 가능하다
  • 여러 인터페이스를 상속받은 클래스의 디폴트 메서드가 두 조상 클래스의 동일한 이름의 메서드에 접근할 때, 앞에 어떤 인터페이스로 접근할지 명시해야한다
  • 인터페이스에서도 필드는 선언이 가능하지만 static final인 상수로만 선언할 수 있다.

2. 인터페이스 구현과 사용

  • 설명 보기
    • 인터페이스의 메소드는 메소드의 이름과 입출력에대한 정의만 있고 내용이 없다
    • 인터페이스 == implements한 클래스들이 강제적으로 구현해야하는 규칙이기 때문
    interface 인터페이스명 {
    	타입 메소드명();
    }
    • Predator tiger = new Tiger(); 이 가능한 이유?
      • Predator tiger = (Predator) new Tiger(); 과 동일
      • 개발 코드에서 인터페이스는 클래스의 필드, 생성자 또는 메소드의 매개변수, 생성자 또는 메소드의 로컬변수로 선언될 수 있다 (타입처럼 사용이 가능하다)

3. 인터페이스 상속

  • 설명 보기
    public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2, ... { 
    		...
    }
    • 다중 상속을 허용한다
    • 상속받은 인터페이스를 implements 받으면, abc인터페이스의 메소드를 모두 구현해야한다.

4. 인터페이스의 다형성

  • 설명 보기
    • 다형성 : 하나의 타입에 대입되는 객체에 따라 실행결과가 다양한 형태로 나오는 성질
    public interface ProfileRepository {
        void save();
    }
    public class ProfileService {
        ProfileRepository repository;
    
        public void saveProfile() {
            repository = new ProfileDBRepository();   // 이 부분만 바꿔 끼우면 됨
            repository.save();
        }
    }
    public class ProfileDBRepository implements ProfileRepository {
    
        @Override
        public void save() {
            System.out.println("DB에 프로필 저장하는 기능");
        }
    }
    public class ProfileMemoryRepository implements ProfileRepository {
        @Override
        public void save() {
            System.out.println("메모리에 프로필 저장하는 기능");
        }
    }
    • 자동타입변환
      • 구현 객체가 인터페이스 타입으로 변환
      • 장점 : 여러가지 구현 클래스들이 들어올 수 있다.
    일반클래스 변수명 = new 일반클래스();
    인터페이스명 변수명 = new 구현클래스;
    //구현클래스가 인터페이스로 자동 타입변환이 일어난다.
    //인터페이스명 타입으로 구현객체를 품을 수 있다.
     public class Driver {
        public void drive(Vehicle vehicle) {  // 구현 객체 vehicle 
            vehicle.run();    // 구현 객체의 run() 메소드가 실행됨
        }
    }
    
    public class DriverExample {
        public static void main(String[] args) {
            Driver driver = new Driver();
            Vehicle taxi = new Taxi();
            driver.drive(taxi);     // 전달한 구현 객체로 자동 타입 변환 : Vehicle vehicle = taxi; 
            
            Vehicle bus = new Bus();
            driver.drive(bus);      // 전달한 구현 객체로 자동 타입 변환 : Vehicle vehicle = bus;
        }
    }
    • 객체 타입 확인(instanceof)
      • 결과는 true / false로 반환
      if (vehicle instanceof Bus) {
      	 ...
      }

5. 디폴트 메소드

  • 설명 보기
    • 자바 8버전 이후부터 default 메소드를 사용할 수 있다
    • 구현체를 가질 순 없지만 실제 구현된 형태의 메소드를 가질 수 있다.
    interface Predator {
    	String getFood();
    
    	// 디폴트 메소드
    	default void printFood() {   
    		System.out.printf("my food is %s\n", getFood());
    	}
    }
    • 디폴트 메소드가 구현되어있다면, Predator을 implements한 클래스들은 printFood메소드를 구현하지 않아도 공통으로 사용할 수 있다.

6. 기타

  • 리스트 보기
    • SOLID 5원칙 : https://ko.wikipedia.org/wiki/SOLID_(객체_지향_설계)
      • 확장에 대해 열려 있다 : 요구사항이 변경될 때, 새로운 동작을 추가, 기능을 확장할 수 있다.
      • 수정에 대해 닫혀 있다 : 기존 코드를 수정치 않고, 동작을 추가, 변경할 수 있다.
    • extends implements 의 차이 : https://velog.io/@hkoo9329/자바-extends-implements-차이
    • 프로젝트 다이어그램 그리는 방법
      • .puml 파일 : 프로젝트 구조를 그림으로 표현할 때 사용하기 좋다.
        • 클래스 구조 코드를 그림으로 바꿔준다. extends, implement 사용
      • IntelliJ의 자동 다이어그램 생성기능
        • 필드랑 클래스 메소드 추가여부까지 선택할 수 있어 아주 편리하다!

7. Daily Quiz

Daily Quiz 02/05

'Dev > ESTsoft 오르미' 카테고리의 다른 글

예외처리  (0) 2024.02.23
JVM 조사 : ClassLoader  (1) 2024.02.23
상속  (0) 2024.02.23
클래스  (0) 2024.02.23
참조자료형  (0) 2024.02.22
    BlueHarmel
    BlueHarmel
    Interested in Mathematics, Foreign Language, and "Programming"

    티스토리툴바