자바의 정석 (3) 추상 클래스 인터페이스

Sungmin·2023년 5월 26일
0

자바 기본 개념

목록 보기
4/21

참조변수의 형 변환

사용할 수 있는 멤버의 갯수를 조절하는 것
조상 - 자손 관계일 때 만 참조변수는 서로 형변환 가능

FireEngine f = new FireEngine();// FireEngine객체 생성
Car c = (Car)f; //f를 조상인(Car)타입으로 형변환
FireEngine f2 = (FireEngine)c; //c를 자손인 (FireEngine)으로 형변환
Ambulance a = (Ambulance)f; //상속관계간 아닌 클래스 간의 형변환 불가

-> 형 변환 시 실제 객체가 무엇인지 중요함
실제 객체보다 참조변수의 멤버가 더 많다면 에러가 발생할 수 있어 위험


instanceof 연산자

참조변수의 형변환 가능여부 확인에 사용.
가능하면 True반환

조건문이 참이면 형변환 가능

  • 참조변수를 형변환하는 이유: 참조변수를 변경함으로써 사용할 수 있는 멤버의 개수를 조절하기 위해
  • instanceof연산자는 언제 사용하나: 참조변수를 형변환하기 전에 형변환 가능여부를 확인할때

매개변수의 다형성

참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.

장점

  • 다형적 매개변수
  • 하나의 배열에 여러 종류 객체 저장가능

다형적 매개변수

Product p = new Tv1();
b.buy(p)

b.buy(new Tv1()); //위 코드 한줄요약

매개변수에 조상타입을 쓰고 다형성을 사용하여 메서드를 하나로 단축가능.

하나의 배열에 여러종류 객체저장

Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();

추상 클래스

미완성 설계도. 미완성 메서드를 갖고 있는 클래스

abstract class Player{
	abstract void play(int pos);
   	abstract void stop();
}

Palyer p = new Player(); //에러!! 추상클래스의 인스턴스 생성불가

class AudioPlayer extends Player {
	void play(int pos){.. }	//추상메서드 구현
   	void stop(){.. } //추상메서드 구현
}

AudioPlayer ap = new AudioPlayer(); //Ok!

만약 Player.paly를 구현하면 추상클래스가 아닌 추상메서드를 구현한 메서드가 실행됨

정리

추상클래스를 상속받으면, 상속받은 클래스는 추상메서드를 모두 구현해야 한다.
ex) Player를 상속받은 AudioPlayer는 미완성인 playerstop메서드의 몸통을 만들어줘야 에러가 발생하지 않는다. 구현하지 않으면 AudioPlayer클래스에도 abstract붙여줘야함

인터페이스

추상 메서드의 집합
구현된 것이 전혀 없는 설계도. 껍데기(모든 멤버가 public)

  • 변수 갖을수 없음. 상수만.
    public abstract는 생략가능.(인터페이스는 항상 public abstract이기 때문)

변수 public static final을 일부 또는 전부 생략한 예시

메서드 public abstract를 생략한 예시

인터페이스의 상속

인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상이 아님)
다중 상속(extends 여러개)이 가능.

인터페이스의 구현

class 클래스이름 implements 인터페이스이름{
	//인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
}

예시

Fighter클래스는 Fightable인터페이스를 구현했다.

class Fighter implements Fightable {
	public void move(int x, int y) {내용생략}
    public void attack(Unit u)	{내용생략}
}

@@만약 일부만 구현했을 경우, 클래스앞에 abstract를 붙여야 함.@@
예시

abstract class Fighter implements Fightable {
	public void move(int x, int y) {내용생략} //1개만 구현
}

인터페이스를 이용한 다형성

class Fighter extends Unit implements Fightable {
	public void move(int x, int y) {내용생략}
    public void attack(Fightable f) {내용생략}
}

Unit u = new Fighter();
Fightable f = new Fighter();

Fightable타입의 참조변수fFighter클래스를 참조하는게 가능!

대신!

  • 인터페이스에 선언된 추상메서드만 Fightable클래스에서 사용가능.

  • 인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능
    (Fightable인터페이스를 구현한 클래스의 인스턴스만 가능)


    moveattack만 사용가능!

인터페이스의 장점

두 객체간의 연결, 대화, 소통을 돕는 중간 역할을 한다.

인터페이스를 사용하지않는 경우

  • A클래스가 C를 사용하려면 A클래스를 수정해야 한다.

인터페이스를 사용한 경우

  • 개발 시간을 단축할 수 있다.
  • 변경에 유리한 유연한 설계가 가능하다
  • 표준화가 가능하다
  • 서로 관계없는 클래스들의 관계를 맺어줄 수 있다.

인터페이스의 디폴트 메서드와 static메서드

  • 인터페이스에 새로운 메서드를 추가하기 어려움
    해결책 -> 디폴트 메서드

디폴트 메서드가 기존의 메서드와 충돌할 때의 해결책

  1. 여러 인터페이스의 디폴트 메서드 간의 충돌
    • 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 해야한다.
  2. 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
    • 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

결론: 직접 오버라이딩 하면 된다.

profile
Let's Coding

0개의 댓글