loop-study
개발 공부할래?
loop-study
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 목표 및 회고 (25)
    • 세미나 & 워크샵 (1)
    • 교육 및 인강 (67)
      • TDD, Clean Code with Java (5)
      • ATDD, 클린 코드 with Spring (6)
      • DDD 세레나데 (3)
      • 인프라 공방 (6)
      • 이규원의 현실 세상의 TDD (19)
      • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (18)
      • 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한 (8)
      • 코딩으로 학습하는 GoF의 디자인 패턴 (1)
      • 스프링 시큐리티 완전정복 6.x (1)
    • 서적 (62)
      • 객체지향의 사실과 오해 (1)
      • 객체지향과 디자인패턴 (7)
      • 만들면서 배우는 클린 아키텍처 (3)
      • 테스트 주도 개발로 배우는 객체 지향 설계와 실천 (1)
      • 오브젝트: 코드로 이해하는 객체지향 설계 (17)
      • 리팩토링 : 코드 구조를 체계적으로 개선하여 효율적인 리팩터링 구현하기 (0)
      • 토비의 스프링 (3)
      • 엔터프라이즈 애플리케이션 아키텍처 패턴 (9)
      • 개발자의 글쓰기 (1)
      • 소프트웨어 장인 (17)
      • Real MySQL 8.0 (2)
      • JVM 밑바닥까지 파헤치기 (0)
    • 개발 & 방법론 (29)
      • Java (13)
      • TDD (5)
      • ATDD (3)
      • DDD (6)
      • 인프라 (2)
      • SQL (0)
    • 개인이야기 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 백엔드 로드맵

인기 글

태그

  • 마틴 파울러
  • fastcampus
  • 이규원
  • Patterns of Enterprise Application Architecture
  • 자바
  • 오브젝트
  • study
  • java
  • 모든 개발자를 위한 HTTP 웹 기본 지식
  • nextstep
  • Test Driven Development
  • ATDD
  • 조영호
  • 넥스트스탭
  • 스프링
  • 인프런
  • 엔터프라이즈 애플리케이션 아키텍처 패턴
  • 스터디
  • 객체지향
  • 장인정신
  • 현실세상의 TDD
  • 김영한
  • JUnit
  • 테스트 주도 개발
  • 소프트웨어 장인
  • 인프라공방
  • 백기선
  • TDD
  • 추상화
  • DDD 세레나데

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
loop-study

개발 공부할래?

자바 8주차 : 인터페이스
개발 & 방법론/Java

자바 8주차 : 인터페이스

2021. 2. 13. 15:47
 

8주자 과제: 인터페이스 · Issue #8 · whiteship/live-study

목표 자바의 인터페이스에 대해 학습하세요. 학습할 것 (필수) 인터페이스 정의하는 방법 인터페이스 구현하는 방법 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법 인터페이스 상속 인터

github.com

목표

자바의 인터페이스에 대해 학습하세요.

학습할 것 (필수)

  • 인터페이스 정의하는 방법
  • 인터페이스 구현하는 방법
  • 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
  • 인터페이스 상속
  • 인터페이스의 기본 메소드 (Default Method), 자바 8
  • 인터페이스의 static 메소드, 자바 8
  • 인터페이스의 private 메소드, 자바 9

 


인터페이스 정의하는 방법

인터페이스는 추상클래스를 더 추상화한 것으로 공통적인 기능을 규격화하는 역할을 한다

 

인터페이스는 class 대신에 interface 키워드를 사용한다

public interface Item {

}

기존 인터페이스는 상수와 추상메소드만 가지는데 자바8부터 디폴트 메소드, 정적 메소드도 추가되었다

public interface Item {

    // 상수
    int MAX_QUALITY = 100;
    int MIX_QUALITY = 0;

    // 추상 메소드
    void updateQuality(int sellIn);
    int getQuality();

    // default 메소드
    default void saleOut() {
        System.out.println("sale out");
    }

    // static 메소드
    static void clearItem() {
        System.out.println("clear item");
    }
}

 

 

인터페이스를 구현하는 방법

상속과 비슷하지만 implements 키워드를 이용한다

인터페이스에 정의된 추상 메소드를 강제적으로 구현해야한다

public class Book implements Item{

    private int sellIn = 0;
    private int quality = 0;

    @Override
    public void updateQuality(int sellIn) {
        this.sellIn = sellIn;
    }

    @Override
    public int getQuality() {
        return this.quality;
    }
}

디폴트 메소드는 재구현이 선택적이다.

 

 

 

인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

인터페이스는 레퍼런스 타입이기에 구현체를 대입할 경우 구현 객체의 레퍼런스를 저장한다

이를 활용해 다형성을 이용할 수 있다

간단한 인터페이스와 이를 구현하는 클래스를 2개 선언해보자

public interface Animal {

    void cry();

    void age();
}

class Dog implements Animal {

    @Override
    public void cry() {
        System.out.println("멍멍멍멍멍 왈오랑롸와와오아롸롸와왕왈");
    }

    @Override
    public void age() {
        System.out.println("1살");
    }
}

class Cat implements Animal {

    @Override
    public void cry() {
        System.out.println("야옹야오야오야오야");
    }

    @Override
    public void age() {
        System.out.println("5살");
    }
}

 이제 다음과 같이 사용해보자

public class StudyMain {

    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();

        action(dog);
        action(cat);
    }

    // 인터페이스 Animal 구현 객체가 실행된다.
    public static void action(Animal animal) {
        animal.cry();
        animal.age();
    }
}

 

 

인터페이스 상속

일반적인 상속과 다르게 인터페이스는 다중상속을 받을 수 있다.

public interface Father {
    void print();
}

interface Mom {
    void play();
}

// , 로 다중 상속이 가능하다
interface child extends Father, Mom {
    void study();
}

하위 인터페이스를 구현을 한다면 해당 클래스는 상위 인터페이스 메소드까지 모두 구현해야한다

class Java implements Child{
	
    // 상위 인터페이스 Father 메소드
    @Override
    public void print() {

    }

    // 상위 인터페이스 Mom 메소드
    @Override
    public void play() {

    }

    @Override
    public void study() {

    }
}

 

 

 

 

인터페이스의 기본 메소드 (Default Method), 자바 8

자바8 도입되면서 인터페이스에 변화가 찾아왔다

바로 인터페이스에 구현부를 가진 디폴트 메소드가 생긴 것이다

디폴트 메소드는 하위호환성을 보존하기 위해 추가된 것으로 기존 인터페이스에 메소드가 추가되면

해당 인터페이스를 구현하는 모든 하위 클래스에 해당 메소드를 구현해야하는 불편함이 있었지만

디폴트 메소드를 추가되면서 하위 클래스는 그대로 인터페이스의 디폴트 메소드를 사용해도 되는 장점이 생겼고

필요에 따라 재구현도 가능하다

public interface Animal {

    void cry();

    void age();

    default void move() {
        System.out.println("움직인다");
    }
}

class Dog implements Animal {

    @Override
    public void cry() {
        System.out.println("멍멍멍멍멍 왈오랑롸와와오아롸롸와왕왈");
    }

    @Override
    public void age() {
        System.out.println("1살");
    }
}

class Cat implements Animal {

    @Override
    public void cry() {
        System.out.println("야옹야오야오야오야");
    }

    @Override
    public void age() {
        System.out.println("5살");
    }
}

(생략)....

    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();

        action(dog);
        action(cat);
    }

    // 인터페이스 Animal 구현 객체가 실행된다.
    public static void action(Animal animal) {
        animal.move();
    }

 

하위 클래스에서 구현없이 곧바로 사용이 가능하다

 

 

 

인터페이스의 static 메소드, 자바 8

디폴트 메소드와 마찬가지로 추가된 static 메소드다

구현 객체 없이 인터페이스.메서드명 으로 호출이 가능해졌다

 

public interface Animal {

    .....
    
    static void call() {
        System.out.println("구현 객체가 필요없다");
    }
}
public static void main(String[] args) {
        
    // 인터페이스.메소드명으로 호출 가능.
    Animal.call();
}

 

 

인터페이스의 private 메소드, 자바 9

자바9 부터 인터페이스에서 캡슐화를 사용할 수 있게 private 메소드 선언이 가능해졌다

만약에 static 메소드에서 사용하려면 private 도 static 로 선언되어야 한다

public interface Animal {
    ....
    default void move() {
        nomalCap();
        System.out.println("움직인다");
    }

    static void call() {
        staticCap();
        System.out.println("구현 객체가 필요없다");
    }

    private void nomalCap() {
        System.out.println("private method");
    }

    // static 메소드에서 사용하려면 static을 붙여야한다.
    private static void staticCap() {
        System.out.println("private static method");
    }
}
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();

        action(dog);
        action(cat);

        Animal.call();
    }

    // 인터페이스 Animal 구현 객체가 실행된다.
    public static void action(Animal animal) {
        animal.move();
    }

 

 

이것이자바다, 신용권 [한빛미디어] 

'개발 & 방법론 > Java' 카테고리의 다른 글

10주차 과제 : 멀티쓰레드 프로그래밍  (0) 2021.02.18
9주차 : 예외처리  (0) 2021.02.14
7주차 : 패키지  (0) 2021.01.01
6주차 : 상속  (0) 2020.12.30
5주차 : 클래스(Class)  (0) 2020.12.21
    '개발 & 방법론/Java' 카테고리의 다른 글
    • 10주차 과제 : 멀티쓰레드 프로그래밍
    • 9주차 : 예외처리
    • 7주차 : 패키지
    • 6주차 : 상속
    loop-study
    loop-study
    오늘도 공부하자

    티스토리툴바