본문 바로가기
국비 학원 가서 개발새발

예습) 디폴트 메서드와 스태틱 메서드(인터페이스) , 내부클래스...

by 휴일이 2022. 10. 8.

 

<디폴트(default) 메서드와 스태틱 메서드> - 인터페이스에 수정이 필요하다면???

원래는 인터페이스에 "추상메소드"만 선언 가능했음

 

그러나, 만약 인터페이스A가 수정되어 새 메소드를 만들어야하면????

ㄴ인터페이스A를 구현한 모든 클래스가 새 추상메소드를 구현시켜야함->넘복잡해짐

그래서 디폴트메서드라는 기능이 JDK뭐시기 버전부터 새로 추가됨

 

 

- deault 메소드는? 추상메소드의 기본적인 구현을 하는 메소드

: 추상 클래스와 달리 { 몸통 구현 } 해야하고, 앞에 default를 붙임(public은 기본으로 붙음, 생략 가능)

ㄴ 추상메소드가 아니어서, 인터페이스를 구현한 클래스들을 <<변경 안 해도 사용 가능>>

->상속 관계에서 조상 클래스에 새 메소드 추가한 거랑 다를 바 없음!!

 

단, 새로 추가 된 메소드가 기존 메소드와 이름이 중복되어 충돌할 수 있음(인터페이스를 후에 변경했으니까)

1. 여러 인터페이스의 디폴트 메소드간의 충돌(다중상속이 가능하니 발생하는 문제인듯)

ㄴ 구현 클래스에서 오버라이딩 하자!!

2. 디폴트 메소드(인터페이스)와 조상 클래스(상속) 메소드간의 충돌

ㄴ 조상 메소드가 상속되고, 디폴트 메소드는 무시됨

------------->걍 오류뜨면 오버라이딩 하세여^^

 

static은 어차피 인스턴스 없어도 호출 가능함!! 외웠죠?

인터페이스는 객체 생성 불가--->근데 static은 호출가능!!

그래서 인터페이스의 static 메소드는 외부로 호출이 가능하다

인터페이스이름.static메소드이름 으로 호출 //static호출과 같음, class이름.메소드이름

 

 

 

<내부 클래스> - 클래스 내에 선언 된 클래스

클래스 안에 다른 클래스를 선언하는 이유???

ㄴ 두 클래스가 서로 긴밀한 관계라서

 

장점

- 내부 클래스에서 외부 클래스 멤버 쉽게 접근 가능 (객체 생성 불필요)

- 코드 복잡성을 줄일 수 있음(캡슐화)   -> 외부에 불필요한 클래스를 감춘다

 

class A {	//B의 외부 클래스
	class B {	//A의 내부 클래스
    }
}

 

 

<내부 클래스의 종류와 특징> 

변수의 선언 위치, 종류와 같음!!!!

인스턴스 변수 / static 변수 / 지역 변수

 

- 인스턴스 클래스 : 외부 클래스의 전역변수 선언 위치에 선언 (외부 클래스의 인스턴스 멤버처럼 씀)

ㄴ 외부 클래스의 인스턴스 멤버들과 관련 된 작업에 사용 (인스턴스 변수, 인스턴스 메소드와 쓰겠죠?)

- 스태틱 클래스 : 인스턴스와 동일하게 전역변수 선언 위치에 선언(외부가 static 멤버처럼 씀)

ㄴ 외부의 static멤버(특히 static 메소드!!)에서 사용함

- 지역 클래스 : 외부 클래스의 메소드나 / 초기화 블럭 안에 선언

ㄴ 선언 된 영역 내부에서만 사용 가능(지역변수와 같음)

- 익명 클래스 : 클래스의 선언과 객체 생성을 동시에 ! 이름 없는 클래스(일회용)

 

 

<내부 클래스의 선언>

변수 선언 위치와 동일하다고 했죠?

->동일한 유효범위, 접근성을 지님

 

class Outer {	//외부 클래스
	class InstanceInner { }		//인스턴스 클래스(외부의 인스턴스 멤버와 쓰임)
    static class StaticInner { }	//스태틱 클래스(외부의 스태틱 멤버와<특히 static Method>사용)
    void MyMethod() {	//외부 클래스의 메소드
    	class LocalInner {}	//메소드 안에 생성 된 지역 클래스(메소드 내에서만 사용)
        }
}

 

 

 

<내부 클래스의 제어자와 접근성>

- 내부 클래스는 외부 클래스의 멤버이다

- 내부가 외부의 멤버변수를 꺼내와서 사용한다 likemethod

 

인스턴스 클래스, 스태틱 클래스는

인스턴스 변수, 스태틱 변수와 같은 위치에 선언됨

멤버 변수와 같은 성질을 지님

 

내부클래스는 외부 클래스의 멤버

ㄴ 그래서 인스턴스, 스태틱 멤버의 규칙이 내부에도 똑같이 적용됨

 

내부 클래스도 결국 클래스임( abstract / final 같은 제어자 사용 가능)

하지만 외부가 내부를 멤버처럼 사용하잖아요?

그래서 private , protected 같은 접근 제어자 사용 가능

(복습하기 public>protected>default>private)

 

class Outer {
	private class InstanceInner {} <-Outer 내에서만 사용 가능
    protected static class StaticInner {} <-같은 패키지 혹은 자손 클래스만 사용
    void MyMethod() { <-외부클래스의 메소드
    class LocalInner {} <-지역클래스, 메소드 내에서만 사용 가능 default
    }
}

 

 

스태틱 클래스만 스태틱 멤버 가짐 (내부에 static 변수 쓰려면, static 클래스가 돼야함)

final static 변수(상수)는 모든 내부 클래스에서 사용 가능 ->왜? 값이 정해져있고 안변함,메모리에 따로 저장됨

 

인스턴스 클래스

ㄴ 외부 클래스의 인스턴스 멤버 객체 생성 없이 이용 가능(왜? 외부클래스의 객체가 생성되어야지 얘도 같이 생김)

스태틱 클래스

ㄴ 외부 클래스의 인스턴스 멤버 객체 생성 없이 사용 불가(굳이 외부클래스 객체 생성하면 이용은 가능)

 

인스턴스 멤버 -> 인스턴스멤버,스태틱 멤버 전부 호출 가능 / 스태틱은 인스턴스 멤버 직접 호출 불가

ㄴ 인스턴스 클래스도 마찬가지임 ㅇㅇ

 

 

인스턴스 클래스->외부 클래스의 인스턴스 멤버:인스턴스 변수, 스태틱변수 사용 가능 private도 OK(같은클래스니까)

스태틱 클래스->외부 클래스의 static 멤버: 인스턴스 멤버 사용 불가, 스태틱만 사용 가능

지역 클래스->외부 클래스의 인스턴스, 스태틱멤버 사용 가능:해당 메소드 내의 final 상수 OK

ㄴ 메소드가 수행을 마쳐서 지역변수가 소멸됐는데, 클래스는 계속 돌아갈 수도 있어서 안됨

ㄴ 상수는 메모리에 따로 저장돼서 가능

-JDK 1.8부터 메소드의 지역변수 값이 안변하면 상수 처리되어 final생략도 가능은 함

근데 난 그냥 붙일래...헷갈려

 

 

외부, 내부, 메소드 안의 변수 이름이 모두 같다면?

외부 - Outer.this.value (앞에 외부 클래스 이름임)

내부 - this.value

메소드 - value

 

 

<익명 클래스> - 이름 없는 클래스, 일회용

클래스 선언+객체 생성을 동시에 함 -> 단 한 번만 사용 가능

ㄴ 하나의 객체만을 생성하는 일회용 클래스

 

- new 조상 클래스 이름() { 내용 }   /  new 구현인터페이스 이름() { 내용 }

이름이 없으니 생성자도 없음

조상이나 인터페이스 이름을 쓰니 상속, 인터페이스 다중 구현 불가

 

"오직 하나의 클래스" 또는 " 오직 하나의 인터페이스 "만 구현함

 

class holiday extends Today {
	Today iv= new Today() { 내용 }; //조상이름 참조변수 = new 조상이름() { }
    static Today cv = new Today() { 내용 };
    void Method() {
    Today lv = new Today() { 내용 };
    }
}
728x90