[Java] 추상 클래스 | 추상 메서드 | 인터페이스

준우·2023년 2월 20일
0

Java

목록 보기
30/30
post-thumbnail

추상 클래스란?

  • 미완성 설계도
  • 미완성 메서드를 가지고 있는 클래스
  • 다른 클래스 작성에 도움을 주기 위한 것
  • 인스턴스 생성 불가
  • 상속을 통해 추상 메서드를 완성해야 인스턴스 생성 가능

예시 코드

abstract class Player {				// 추상 클래스(미완성 클래스)

	boolean pause;
    int currenPos;
    
    Player() {						// 추상 클래스도 생성자가 있어야 한다.
    	pause = false;
        currentPost = 0;
    }
    
	abstract void play(int pos);	// 추상 메서드(몸통{}이 없는 미완성 메서드)
    abstract void stop();			// 추상 메서드
}
Player p = new Player(); 			// Error! 인스턴스 생성 불가
class AudioPlayer extends Player {
	void play(int pos) {	/* 내용생략 */	}	// 추상 메서드를 구현
    void stop() {	/* 내용생략 */	}			// 추상 메서드를 구현
}
AudioPlayer ap = new AudioPlayer();	//OK.

추상 메서드란?

  • 미완성 메서드
  • 구현부(몸통, {})가 없는 메서드
  • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우

예시 코드

/* 주석을 통해 어떤 기능을 수행할 목적으로 작성했는지 설명한다 */
abstract 리턴타입 메서드이름();

추상 클래스, 언제 작성하나?

  • 여러 클래스에 공통적으로 사용될 수 있는 추상 클래스를 바로 작성한다.
  • 기존 클래스의 공통 부분을 뽑아서 추상 클래스를 만든다.

예시 코드

아래와 같이 공통되는 부분을 추상 클래스로 만들어서 상속과 다형성을 활용하면 코드가 훨씬 간결해질 수 있다.


abstract class Unit {
	int x, y;
	abstract void move(int x, int y);
	void stop() { /* 현재 위치에 정지 */ }
}

class Marine extends Unit { // 보병
	void move(int x, int y) {
		System.out.println("Marine[x=" + x + ",y=" + y + "]");
	}
	void stimPack() { /* 스팀팩을 사용한다. */ }
}

class Tank extends Unit { // 탱크
	void move(int x, int y) {
		System.out.println("Tank[x=" + x + ",y=" + y + "]");
	}
	void changeMode() { /* 공격모드를 변환한다. */ }
}

class Dropship extends Unit { // 수송선
	void move(int x, int y) {
		System.out.println("Dropship[x=" + x + ",y=" + y + "]");
	}
	void load()   { /* 선택된 대상을 태운다. */ }
	void unload() { /* 선택된 대상을 내린다. */ }
}
Unit[] group = new Unit[3];
group[0] = new Marine();
group[1] = new Tank();
group[2] = new Dropship();

for(int i=0; i>group.length; i++) {
	group[i].move(100, 200);
}

인터페이스

  • 핵심! 추상 메서드의 집합
  • 구현된 것이 전혀 없는 설계도, 껍데기
  • 모든 멤버가 public (생략 가능)
  • 변수로 상수만을 가질 수 있음 (static final 생략 가능)
  • 인스턴스 변수를 가질 수 없다.
  • 메서드 선언 시 abstract 생략가능
  • 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상이 아님)
  • 다중 상속이 가능함(추상 메서드는 선언부가 같아도 내용이 다르기에 충돌해도 문제가 없음)
  • 조상과 후손에 같은 이름의 상수 값이 존재하면 덮어씌워짐
  • implements 키워드 사용해 구현할 인터페이스 명시
  • 인터페이스 구현 -> 인터페이스에 정의된 추상 메서드를 완성하는 것

추상클래스와 인터페이스의 차이점

  • 추상클래스: 일반 클래스인데, 추상 메서드를 가지고 있음.
  • 인터페이스: 추상 메서드 외에는 가질 수 없음

Default 메서드와 static 메서드

💡 JDK 1.8 부터는 인터페이스에 default 메소드, static 메소드를 추가할 수 있게 되었다.

  • 인터페이스에 디폴트 메서드, static 메서드 추가 가능
  • 인터페이스에 새로운 메서드(추상 메서드)를 추가하기 어려움 => 해결! 디폴트 메서드!
    (인터페이스에 새로운 메서드를 추가하면 해당 인터페이스를 상속받은 모든 클래스에 새로운 메서드를 구현해야하는 문제점을 인터페이스에 디폴트 메서드 추가를 허용함으로써 해결함.)
  • 디폴트 메서드는 인스턴스 메서드(인터페이스 원칙 위반)

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

인터페이스의 구현

  • 인터페이스에 정의된 추상 메서드를 완성하는 것
class 클래스이름 implements 인터페이스이름 {
	//인터페이스에 정의된 추상메서드를 모두 구현해야함
}

일부만 구현하는 경우 클래스 앞에 abstract를 붙여야 함.

인터페이스의 장점

  • 두 대상(객체)간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다.
    ex. 사람 ↔️ GUI ↔️ 컴퓨터
  • 선언(설계)와 구현을 분리시킬 수 있게 한다.
  • 개발 시간을 단축할 수 있다.
  • 표준화가 가능하다.
  • 서로 관계 없는 클래스들을 관계 맺어줄 수 있다.

🫡 Reference

1개의 댓글

comment-user-thumbnail
2023년 3월 11일

갑 자바가 필요해져서 다시보는중 ㅎㅎ 정리감사영

답글 달기