상속
-> 클래스를 다시 사용할 목적
-> 생성자는 상속이 안 됨(클래스 초기화 목적이기 때문)
-> 오버로딩 : 거의 생성자에 씀 초기화 목적으로 쓰기 때문//매개변수에 따라 초기화하는 내용이 다르게
-> 오버라이딩 : 상속에서 메소드를 내꺼로 덮어쓰는거
스택에 클래스가 쌓임,->그걸 실행할 때 힙으로 가서 실행을 시킴
타입 변환
-> super(), super. 부모 꺼를 사용함 // toString() <-이게 예 Object 에 있는 toString 메소드 오버라이딩해서,,
-> 부모타입//업캐스팅 자식타입으로감//다운캐스팅
부모 참조변수에 자식 타입을 집어넣었을 떄,
부모의 변수, 메소드만 사용 가능))))
자식-자식 관에는 관계 없음
instanceof 연산자
객체 타입을 비교하여 boolean(true or false)로 반환
단, is a 관계시(상속관계 - 사람은 동물이다)에는
true를 비교하므로
항상 자식->부모 순으로 비교해야 한다
다양한 동물 객체를 처리하기 위해 부모타입인
Animal의 타입으로 매개변수 선언
매개변수에 나온 인자값(객체)는
enter()변수 내부에서 먹다와 각자 오버라이딩됨
play()를 호출한다
단, Person일 경우
반드시 티켓을 사야 됨
----> 호랑이 동물 원숭이 동물 사람 동물 순으로 하고 ->사람이 할 때는 무조건 티켓 출력
(점심시간에 해보기)
부모타입으로 배열 만들어놓고
자식 타입을 부모타입 배열에 넣을 수 있음!!
자식이 부모를 넣을 수는 없음
참조 변수의 타입 변환(조상-자식)
자식 참조변수를 부모 타입으로 저장 가능~
Parent p = new Child(); 가능
Child c = new Parent(); 불가능
p = (Parent)c; 가능 (자식 객체를 부모 참조변수에 넣기!)
Parent p = (Parent)c; 가능 (위와 마찬가지)
// MemberVO m = new Professor(11,"강","감","강","강"); //부모 참조변수에 자식 인스턴스 생성함
if(m instanceof Professor) { //m이 자식인스턴스를 가리키는 참조변수라면?
MemberVO t = (MemberVO)m; //부모 참조변수 t로 m(자식인스턴스)의 주소를 가리키세요!!
System.out.println("ㅋㅋ"); //그리고 ㅋㅋ를 쓰세여
if(t instanceof MemberVO) { //t가 부모 타입이다?
m = (Professor)t; //바로 t(주소)를 자식 참조변수m 에 줘버리기 ㅋㅋ
System.out.println("ee"); //맞으면 ee를 쓰세요
}
}
//객체 캐스팅 부모 타입(업캐스팅)으로 참조
Person p = new Student("아이유","12");
System.out.println(p.getName());
System.out.println(((Student)p).getStuId()); //다운캐스팅, 자식 타입으로 변경
System.out.println(p);
if(p instanceof Student) { //자식인스턴스
System.out.println("나는 학생이다");
if(p instanceof Person) { //부모타입
System.out.println("나는 사람이다");
if(p instanceof Object) { //모든 클래스의 최고조상
System.out.println("나는 객체이다");
}
}
}
결국 부모의 타입으로 만든 자식 인스턴스는
자식타입/부모타입/최고조상타입도 되는 것이었다............;;;
예습------------------
<인터페이스> - 기본 설계도
추상클래스가 미완성 설계도라면? 인터페이스는 기본 설계도
추상메소드와 상수만 멤버로 가질 수 있다 //일반메소드X 멤버변수 X
ㄴ 다른 클래스 작성에 도움을 준다
키워드는 interface
접근제어자는 public 또는 default (클래스와 같음)
interface 인터페이스이름 {
public static final 타입 상수이름 = 값; <<<-한번 지정하면 못 바꿈
public abstract 메소드이름(매개변수 목록);
}
- 모든 멤버 변수는 오직 public static final
- 모든 메소드는 public abstract
절대 못 바꿈!!!!!!!그래서 생략 가능, 편의상 생략함(모든 인터페이스 공통)
static메소드와 default 메소드는 예외긴 함 -> JDK 1.8부터
<인터페이스의 상속> - 다중 상속 가능, 최고 조상 없음(Object XXX)
인터페이스는 인터페이스로부터만 상속 가능(부모가 무조건 interface)
interface Move { void move (int x, int y); } <-위치 이동 메소드
interface Attack { void attack (Unit u); } <- 공격 메소드
interface Fight extends Move, Attack { } <---인터페이스 끼리의 상속은 extends 임
ㄴ Fight에는 정의된 멤버가 없지만, Move와 Attack으로부터 상속받은 move, attack이 멤버
<인터페이스의 구현> ->클래스가 몸통을 만들어줘야 함, 그 자체로 인스턴스 생성 불가
추상클래스가 확장한다는 의미의 extends
인터페이스는 구현한다는 의미에 implements
class 클래스이름 implements 인터페이스이름 { //인터페이스의 모든 추상 메소드 구현 }
class Fighter implements Fightable {
public void move(int x, int y) { 내용 }
public void attack(Unit u) { 내용 }
}
만약 인터페이스의 일부만 구현한다면?
ㄴ abstract를 붙여 추상 클래스로 선언
클래스는 상속과 구현이 동시에 가능하다
class Fighter extends Unit implements Fightable
ㄴ클래스 Fighter는 Unit의 자손(상속관계)이자 Fightable 인터페이스를 구현한 클래스다
<인터페이스를 이용한 다형성> - 인터페이스(조상) 구현클래스(자손)
인터페이스를 구현한 클래스 (자손)
인터페이스 (조상)
ㄴ이라고 생각하기로 했다 ^^
interface Fightable
class Fighter implements Fightable
Fightable f = new Fighter(); <-가능
Fightable f = (Fightable)new Fighter(); <- 가능
ㄴ 그래서, 인터페이스는 메소드의 매개변수 타입으로도 사용 가능
(객체 매개변수 어쩌구 조상타입에 자식객체 어쩌구 라고 보면 될듯?)
void attack(Fightable f) { 내용 } -->Fightable 인터페이스를 구현한 모든 클래스의 인스턴스 대입 가능!!!
f.attack(new Fightable()); 가능---->Fightable을 참조한(구현한) 인스턴스니까용
메소드의 리턴타입으로 인터페이스 지정도 가능하다
Fightable method() {
Fighter f = new Fighter();
return f; } -> return Fighter(); 도 가능하겠죠?
ㄴ 리턴타입이 인터페이스라는 건,
메소드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환하는 것이죠
결국 상속과 다형성은 동일한 것
(조상) 인터페이스 (자손) 인터페이스를 구현한 클래스
<인터페이스의 장점!!>
1. 개발시간 단축 가능
인터페이스를 작성하면, 이를 사용해서 프로그램 작성이 가능하다
메소드 호출하는 입장에서, 메소드 내용과 관계 없이 선언부만 알면 됨
동시에 다른 한 쪽에서 인터페이스를 구현한 클래스를 작성하고
인터페이스를 구현하는 클래스가 작성될때까지 기다리지 않아도
양 쪽에서 동시에 개발 가능
2. 표준화 가능
프로젝트의 기본 틀을 인터페이스로 작성하면,
개발자들에게 그 틀을 기본으로 구현해서 프로그램 개발을 지시
일관되고 정형화된 프로그램이 개발 가능하다
3.관계 없는 클래스 관계를 맺어준다
상속관계도 아니고 같은 조상도 없지만
하나의 인터페이스를 공통으로 구현한다면?
서로 관계를 맺어줄 수 있답니다^^
4.독립적인 프로그래밍
클래스의 선언과 구현을 분리해서
독립적인 프로그램을 작성할 수 있다
직접적인 관계를 간접적으로 변경하면
한 클래스의 변경이 다른 클래스에 영향을 미치지 않는
"독립적인 프로그래밍"이 가능한 것이다
'국비 학원 가서 개발새발' 카테고리의 다른 글
예습) 프로그램 오류(에러와 예외) (0) | 2022.10.09 |
---|---|
예습) 디폴트 메서드와 스태틱 메서드(인터페이스) , 내부클래스... (1) | 2022.10.08 |
국비학원 8일차) 상속, protected, super..(예습:추상클래스) (1) | 2022.10.06 |
국비학원 7일차) 예습:패키지,(접근)제어자,캡슐화,다형성,참조변수 형변환 (0) | 2022.10.05 |
국비학원 6일차) 클래스 생성자를 배우다(예습:상속) (1) | 2022.10.04 |