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

국비학원 9일차) 상속, instanceof, 타입변환... 예습)인터페이스

by 휴일이 2022. 10. 8.

상속
-> 클래스를 다시 사용할 목적
-> 생성자는 상속이 안 됨(클래스 초기화 목적이기 때문)
-> 오버로딩 : 거의 생성자에 씀 초기화 목적으로 쓰기 때문//매개변수에 따라 초기화하는 내용이 다르게
-> 오버라이딩 : 상속에서 메소드를 내꺼로 덮어쓰는거


스택에 클래스가 쌓임,->그걸 실행할 때 힙으로 가서 실행을 시킴



타입 변환
-> 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.독립적인 프로그래밍

클래스의 선언과 구현을 분리해서

독립적인 프로그램을 작성할 수 있다

직접적인 관계를 간접적으로 변경하면

한 클래스의 변경이 다른 클래스에 영향을 미치지 않는

"독립적인 프로그래밍"이 가능한 것이다

728x90