<디폴트(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() { 내용 };
}
}
'국비 학원 가서 개발새발' 카테고리의 다른 글
Comparable 과 Comparator 차이(익명클래스 사용) (0) | 2022.10.10 |
---|---|
예습) 프로그램 오류(에러와 예외) (0) | 2022.10.09 |
국비학원 9일차) 상속, instanceof, 타입변환... 예습)인터페이스 (1) | 2022.10.08 |
국비학원 8일차) 상속, protected, super..(예습:추상클래스) (1) | 2022.10.06 |
국비학원 7일차) 예습:패키지,(접근)제어자,캡슐화,다형성,참조변수 형변환 (0) | 2022.10.05 |