자바 11일차

김재현·2022년 8월 11일
0

Java

목록 보기
12/15

디폴트 메서드와 static메서드

  • 인터페이스에는 디폴트메서드와 static메서드를 추가할 수 있다.
  • 부모 클래스에 새로운 메서드를 추가하는 것은 별 일이 아니지만, 인터페이스의 경우에는 큰일이다. 인터페이스에 메서드를 추가한다는 것은, 추상 메서드를 추가한다는 것이며, 이 인터페이스를 구현한 모든 클래스들이 새로 추가된 메서드를 구현해야하기 때문.
    인터페이스의 변경은 결국 막을 수 없고, 그래서 도입된 것이 디폴트 메서드(default method)라는 것.
  • 디폴트메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드로, 추상 메서드가 아니기 때문에 디폴트 메서드가 새로 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 된다.
    디폴트 메서드는 default키워드를 붙이며, 추상 메서드와 달리 일반 메서드처럼 몸통 {} 이 있어야한다. 접근제어자는 public이며 생략 가능하다.

  • 디폴트메서드를 추가하면, 기존에 MyInterface를 구현한 클래스를 변경하지 않아도 된다. 부모 클래스에 새로운 메서드를 추가한 것과 동일해지는 것.
  • 새로 추가된 디폴트 메서드가 기존의 메서드와 이름이 중복되어 충돌하는 경우가 발생할 수 있다. 해결규칙은 다음과 같다.

    1) 여러 인터페이스의 디폴트 메서드 간의 충돌
    인터페이를 구현한 클래스에서 디폴트 메서드를 오버라이딩 해야 한다.
    2) 디폴트 메서드와 부모 클래스의 메서드간의 충돌
    부모 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

  • 필요한 쪽의 메서드와 같은 내용으로 오버라이딩 해버리면 그만이긴 함.

내부 클래스 (inner class)

  • 클래스 안에 선언된 클래스. 두 클래스가 서로 긴밀한 관계에 있을 때 사용한다.
  • 한 클래스를 다른 클래스의 내부 클래스로 선언하면, 두 클래스의 멤버들이 서로 쉽게 접근할 수 있다. 또한 외부에는 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.

    내부 클래스의 장점.
    · 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
    · 코드의 복잡성을 줄일 수 있다.(캡슐화)

  • 클래스 안에 클래스를 넣어주면 완성!
    단, 내부 클래스인 B는 외부 클래스인 A를 제외하고는 다른 클래스에서는 잘 사용되지 않아야한다.

종류와 특징

  • 변수의 선언위치에 따른 종류와 같음. 내부 클래스는 마치 변수를 선언하는 것과 같은 위치에 선언할 수 있으며, 변수의 선언위치에 따라 인스턴스 변수, 클래스 변수(static변수), 지역변수로 구분되는 것과 같이 내부 클래스도 선언위치에 따라 다음과 같이 구분된다.
    내부 클래스의 유효범위와 성질이 변수와 유사하므로, 서로 비교해보면 도움이 된다.

내부 클래스의 선언

  • 변수가 선언된 위치에 따라 나뉘듯이, 내부 클래스도 선언된 위치에 따라 나뉘며, 각 내부 클래스의 선언위치에 따라 같은 선언위치의 변수와 동일한 유효범위(scope)와 접근성(accessibility)을 갖는다.

  • 비교해서 보도록 하자.
    내부 클래스의 선언위치가 변수의 선언위치와 동일하다.

제어자와 접근성

  • 내부 클래스는 외부 클래스의 멤버와 같이 간주되고, 인스턴스 멤버와 static멤버 간의 규칙이 내부 클래스에도 똑같이 적용된다.
  • 내부 클래스도 클래스이기 때문에 abstractfinal과 같은 제어자를 사용할 수 있을뿐 아니라, 멤버변수처럼 private, protected과 접근 제어자도 사용 가능하다.

  • 인스턴스 멤버는 같은 클래스에 있는 인스턴스 멤버와 static멤버 모두 직접 호출 가능, static 멤버는 인스턴스멤버를 직접 호출할 수 없음.
    마찬가지로 인스턴스클래스는 외부 클래스의 인스턴스 멤버를 객체생성 없이 바로 사용할 수 있지만, 스태틱 클래스는 외부 클래스의 인스턴스 멤버를 객체생성 없이 사용할 수 없다.
  • 인스턴스 클래스는 스태틱 클래스의 멤버들을 객체생성 없이 사용할 수 있지만, 스태틱 클래스에서는 인스턴스 클래스의 멤버들을 객체생성 없이 사용할 수 없다.
  • 내부 클래스에서는 외부 클래스의 private 멤버도 접근 가능하다. private가 클래스에서는 접근 가능하기 때문이다.
  • 스태틱 클래스는 외부 클래스의 인스턴스멤버에 접근할 수 없다.

0개의 댓글