일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 서로소
- 자바 조합 재귀
- 자바
- 자바입출력
- 순열 재귀
- parseInt()
- 자바스크립트 이벤트처리
- 자바 순열 코드
- 알고리즘
- Java
- inner class
- 재귀
- 상속
- java Collections.sort()
- 자바스크립트 이벤트중지
- jquery 필터선택자
- char to str
- 순열코드
- jquery 속성선택자
- 알고리즘 그래프
- Interface
- jquery dom 계층 선택자
- 자바 재귀 조합
- java lambda
- java 내부 클래스
- jquery 이벤트 처리
- str to char array
- 재귀함수
- 조합 재귀
- 후위표기
- Today
- Total
유블로그
[Java] Abstract, Interface 본문
추상 - abstract, 구현이 안된 것
abstract 키워드 : 클래스(O), 메서드(O), 변수(X. 변수에는 '구현이 되었다 / 안되었다' 라는 개념이 없음)
abstract class 클래스명 : 추상클래스
abstract method : 추상메서드
추상 클래스는 객체 생성(new)이 불가능, 상속(자식클래스)을 이용해서 활용
추상클래스 객체변수 = ?? (new 추상클래스 (X))
추상클래스 객체변수 = ?? (new 추상클래스를 상속한 자식클래스 (O))
추상클래스는 일반 메서드 + 추상메서드 로 구성될 수 있다. -> 인터페이스와 가장 큰 차이점. 인터페이스는 일반 메서드 선언 불가능
추상메서드는 메서드의 구현부를 정의하면 안된다(바디 : {})
ex > void print(); (X - { } 없음)
abstract void print(); (O - 추상메서드는 { } 없어야 한다.)
abstract void print(){} (X - 아예 괄호가 없어야 됨. 괄호유무로 구현여부 판단)
추상클래스를 상속하는 자식 클래스가 반드시 처리해야 하는 일
: 부모클래스의 추상(구현안된것)메서드를 "오버라이딩"!!
abstract class AbsSuper { // 구현 안 된 클래스(추상클래스)
String name = "AbsSuper";
// abstract int v; // 에러발생 : 변수와 함께 사용 불가능
public void call() {//구현 된 일반 메서드
System.out.println("Parent call()");
}
// public void print(); // 에러발생 : 메서드 바디 필요함(일반 메서드)
public abstract void print(); // 추상메서드
// public abstract void test(); {} // 에러발생 : 메서드 바디 삭제 필요함(추상메서드)
}
class AbsSub extends AbsSuper {
String name = "AbsSub";
@Override
public void print() { // AbsSuper의 추상메서드를 여기서 구현
System.out.println("자식 클래스의 PRINT()");
}
public void eat() {
System.out.println("식사하다");
}
}
public class Test01 {
public static void main(String[] args) {
// AbsSuper as = new AbsSuper(); // 불가능
AbsSuper as = new AbsSub(); // 자식 클래스에 가능
// 부모 = 자식 -> 업캐스팅, 묵시적형변환
System.out.println(as.name); // AbsSuper 나옴.. 변수는 무조건!!! 내거!!!!!!!!!!!!! 원래 타입이 AbsSuper니까 AbsSuper의 name!!! 호출됨!!!!!!
as.call(); // call 함수 AbsSuper 에만 있으니까 !!!! AbsSuper의 call 호출!
as.print(); // Abs.print 실행됨
// as.eat(); // 에러남. AbsSuper에는 eat 없으니까!!
}
}
인터페이스에 선언되는 모든 변수는 상수로 인식
- public static final 키워드 자동 추가됨.
인터페이스에 선언되는 메서드는 추상메서드로 인식
- public abstract 키워드 자동 추가됨.
interface ServerInfo {
/*public static final*/ String IP = "192.168.0.110";
/*public abstract*/ void call(); // 자동으로 추상메서드 되기 때문에 구현부 없어도 에러 안남. 다른 클래스에서 이 메서드를 구현할 때 public 필수
// void call() {} // 에러발생 : 인터페이스에는 '구현된 메서드' 불가능
}
public class Test02 {
public static void main(String[] args) {
System.out.println(ServerInfo.IP);// 'Server.'으로 호출 가능하다는 것은 static 의 성질
// ServerInfo.IP = "122"; // 값을 변경할 수 없다는 것으로 final 성질 확인
}
}
- 인터페이스는 객체 생성이 불가능
- 인터페이스를 활용하기 위해서는 자식 클래스 이용
- 자식클래스는 인터페이스의 메서드를 재정의 해야 한다. (static - 재정의 불가능, default - 메서드 선택)
interface A{
void a();
}
interface B{
void b();
}
interface C extends A, B{
void c();
}
class Child implements C { // 구현되지 않은 모든 메서드를 필수로 구현해야 한다.
// void c() {} // 에러 발생 : public 있어야 한다! (interface에는 "public abstract void c();" 라고 되어있기 때문)
public void a() { System.out.println("A 메서드"); }
public void b() { System.out.println("B 메서드"); }
public void c() { System.out.println("C 메서드"); }
}
public class Test03 {
public static void main(String[] args) {
// C c = new C(); // 에러 발생 : 인터페이스는 객체 생성 X
/*
기억해야할 것은
부모 A , 자식 B일때
A a = new B() 라고 했다면
a.~~ 하면
변수는 무조건 A 거 쓰고
함수는 B에 오버라이딩 되어있을 경우 B거 사용, 오버라이딩 안되어 있을 경우 A거 사용
*/
A a = new Child();
a.a(); // 메서드 1개.
B b = new Child();
b.b(); // 메서드 1개
C c = new Child();
c.a(); // 메서드 3개
c.b();
c.c();
}
}
interface AIMachine {
void work();
void tell();
default void music() { // java8부터 지원. 오버라이딩 필수 X
System.out.println("아직 지원되지 않는 기능입니다.");
}
static void common() { // java8부터 지원.
System.out.println("인터페이스에서 공통으로 사용하는 기능 정의");
}
}
class AIMachine01 implements AIMachine {
@Override
public void work() { }
@Override
public void tell() { }
@Override
public void music() { }
}
class AIMachine02 implements AIMachine { // 여기에는 void music() 없는데도 오류 안 남!
@Override
public void work() { }
@Override
public void tell() { }
}
public class Test04 {
public static void main(String[] args) {
AIMachine.common(); // 인터페이스명으로 바로 접근 가능.
AIMachine ai = new AIMachine02();
ai.music(); // 클래스에 정의안하고도 default 접근 가능.
}
}
'Java' 카테고리의 다른 글
[Java] 내부 클래스 (0) | 2020.08.12 |
---|---|
[Java] final (0) | 2020.08.12 |
[Java] 예외(Exception) (0) | 2020.08.11 |
[Java] Iterator (0) | 2020.08.11 |
[Java] Collections (+Generic) (0) | 2020.08.11 |