[F-lab 모각코 챌린지 17일차] TIL

JeongheeKim·2023년 6월 17일

TIL

목록 보기
17/66

학습계획


  • 추상클래스
  • 인터페이스의 default method
  • 인터페이스의 static method
  • 인터페이스의 private method

Today I Learned


인터페이스는 아래 구성요소로만 이루어진다.

  • 상수
  • 메소드 시그니처
  • 디폴트 메서드
  • static 메소드

인터페이스의 기본 메서드 ( Default Method ) - Java 8


  • default method

    Default methods enable you to add new functionality to the interfaces of your libraries and ensure binary compatibility with code written for older versions of those interfaces.

    디폴트 메소드를 통해 기존 오픈소스등의 구현된 인터페이스에 새기능을 추가하고 기존 인터페이스와의 호환을 위해 생겨났다.
    interface TestInterface {
    	default void print() {
    		System.out.println("hello");
    	}
    }
    • 메소드 선언 시 메서드 리턴 앞에 default 예약어를 붙인다.
      • 접근 제어자는 아무것도 명시하지 않았을 경우 default라고 하지만 인터페이스의 default 메소드는 default 키워드를 명시해야한다.

인터페이스의 static 메서드  - Java 8

  • static메소드는 구현부 없이도 선언이 가능하다.
  • 인터페이스에 선언된 static 메소드는 구현 객체 업시 인터페이스명으로 접근해서 호출 할 수 있다.
public interface Foo {

    static void buzz() {
        System.out.print("Hello");
        staticBaz();
    }

    private static void staticBaz() {
        System.out.println(" static world!");
    }
}

public class CustomFoo implements Foo {

    public static void main(String... args) {
        Foo.buzz();
    }
}

인터페이스의 private 메서드 - Java 9

  • 인터페이스 내에서 사용하기 위해 구현한 메서드
  • 구현부가 존재해야함
  • 구현하는 클래스에서 재정의 할 수 없음
    • 중복코드가 줄어들었다.
  • 인터페이스의 private 메서드를 통해 메소드 캡슐화가 가능해졌다.
public interface Foo {

    default void bar() {
        System.out.print("Hello");
        baz();
    }

    private void baz() {
        System.out.println(" world!");
    }
}

public class CustomFoo implements Foo {

    public static void main(String... args) {
        Foo customFoo = new CustomFoo();
        customFoo.bar();
    }
}

추상클래스

  1. 추상클래스는 abstract 예약어를 사용하며 클래스명 앞과 몸통이 없는 메소드 앞에 붙인다.
public abstract class Member {
	public abtract boolean addMember(MemberDTO member);
}
  1. abstract 예약어는 클래스는 abstract로 선언한 메소드가 하나라도 있을 때 선언한다.
Class 'MemberManager' must either be declared abstract or implement abstract method 'addMember(MemberDTO)' in 'MemberManager'
  1. interface처럼 extends로 선언한 추상클래스는 반드시 구현해야한다.
  • 상속하고 싶지 않을때 final키워드를 사용하여 상속을 막는다. 대표적인 예시로 자바의 String클래스 및 그 이외의 클래스들이 상속하여 수정되는것을 방지하기위해 final로 클래스를 선언하였다. 또한 메소드에 final키워드를 선언하면, Overriding이 되지 않는다.
  • 인스턴스 변수에서의 final
    • 인수턴스 변수에 final선언 시 초기화 해주시 않으면 컴파일 에러가 발생한다.
  • 매개변수에서의 final
    • 매개변수로 넘길때는 무조건 초기화 하지 않아도 된다.
  • 참조변수에서의 final
    • 기본 자료형과 마찬가지로 참조 자료형도 두 번 이상 값을 할당하거나 새로 생성자를 사용하여 초기화 할 수 없다.

    • 객체의 안에있는 객체들은 final로 선언된 것이 아니므로 값의 변경이 불가한것은 아니다.

      /**
    • @author jhkim

    • @since 2023/06/17

    • */
      public class FinalReferenceType {
      final MemberDTO dto = new MemberDTO();

      public static void main(String[] args) {
      	FinalReferenceType type = new FinalReferenceType();
      	type.checkDTO();
      }
      public void checkDTO() {
      	System.out.println(dto);//MemberDTO{name='null'}
      	dto.setName("test");
      	System.out.println(dto);//MemberDTO{name='test'}
      }

      }


참고

https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html

Default Methods (The Java™ Tutorials >
Learning the Java Language > Interfaces and Inheritance)

자바의 Default Method (디펄트 메소드)

Private Methods in Java Interfaces | Baeldung

0개의 댓글