추상 클래스(abstract class) : 미완성 설계도라고 불리며 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상 클래스로 인스턴스(객체)를 만들 수 없음
실생활에서 추상 클래스를 사용하는 예시)
삼성에서 만든 여러 개의 TV 모델이 있는데 각각의 TV들의 사이즈, 색, 무게들은 다르지만 TV를 만드는 과정의 50% 이상은 비슷할 것이다.
만약 처음부터 TV 제품마다 각각 설계도를 따로 만들어놓고 TV를 만드는 것보다 각각의 TV 제품들의 공통부 분만을 포함하고 있는 미완성 설계도를 만들어 놓고 TV 제품마다 다른 부분들은 해당 미완성 설계도를 토대로 구체적으로 완성하는 게 훨씬 효율적이다.
추상 클래스 구현 코드)
<추상 클래스>
// 클래스 앞에 'abstract' 붙여줌
public abstract class Unit {
int x,y; // 추상 클래스도 멤버변수를 가질수 있음
// 일반 메서드도 선언 가능
void stop() {
System.out.println("멈춤!");
}
// 추상 메서드도 마찬가지로 'abstract' 붙여줌
// 추상 메서드이므로 구현부가 없음 (추상 클래스를 상속받는 자손클래스에서 해당 메소드를 구현해줘야됨)
abstract void move(int x,int y); // 모든 유닛들이 가지고 있는 이동 기능
}
<추상 클래스를 상속받은 자식 클래스>
// Unit(추상클래스) 상속받은 Tank 클래스
public class Tank extends Unit{
// 추상클래스를 상속받아서 사용할때 구현이 안되어있는 추상 메서드는 구현해줘야됨!
@Override
void move(int x, int y) {
System.out.println("일반 속도에서 -10 감소");
}
// 탱그만의 고유한 기능(시즈모드 변환)
void changeMode() {
System.out.println("시즈 모드 변환!");
}
// Unit 클래스에 있는 stop() 함수 사용
void stop() {
super.stop();
}
}
// Unit(추상클래스) 상속받은 Marine 클래스
public class Marine extends Unit{
// 상속받은 추상 메서드 구현
@Override
void move(int x, int y) {
System.out.println("일반 속도에서 10 증가");
}
// 마린의 고유 기능(스팀팩)
void stimPack() {
System.out.println("스팀팩 사용");
}
// Unit 클래스에 있는 stop() 함수 사용
void stop() {
super.stop();
}
}
각 클래스의 공통부분을 뽑아내서 Unit 클래스를 만들고 미완성 설계도인 Unit 클래스를 상속받아서 해당 클래스에 알맞게 구현해서 사용하도록 설계하였다.
다른 유닛들(저그,오버로드)이 추가된다 하더라도 설계도를 새로 만들지 않고 Unit 클래스로부터 상속받아서 해당 유닛에 알맞게 클래스를 구체적으로 만들면 되므로 재활용이 가능하고 시간도 절약된다는 면에서 자바의 객체지향적인 면모를 확인할 수 있었다.
인터페이스(interface) : 추상클래스보다 더 추상화된 클래스로 메서드와 상수만을 포함할 수 있음
코드)
인터페이스 선언하기
// Human 인터페이스
public interface Human {
// 상수(남,여) 선언 (public static final 생략가능)
public static final char sexm = '남';
public static final char sexw = '여';
// 먹기라는 추상 메서드 선언(public abstract 생략가능)
public abstract void eat();
}
- 인터페이스는 인터페이스 끼리만 extends(상속)이 가능 (다중 상속도 가능)
인터페이스 구현
// 인터페이스는 구현한다는 implements의 키워드를 사용해 인터페이스에 정의된 메서드를 구체적으로 구현함
public class SoccerPlayer implements Human{
// 인터페이스에 정의된 eat() 메서드 구현하기
@Override
public void eat() {
System.out.println("음식을 먹는다.");
}
// 축구선수만 보유하고 있는 메서드
public void trapping() {
System.out.println("트래핑(퍼스트 터치) 시도");
}
}
// 상속과 동시에 구현도 가능함 (순서 : SoccerPlayer가 Human을 먼저 구현하고 Messi가 SoccerPlayer 상속받음)
public class Messi extends SoccerPlayer implements Human{
// 메시만의 기술
public void m_speed() {
System.out.println("빠른 스피드로 수비수를 제치기");
}
}
인터페이스를 사용하는 이유는?)
- 인터페이스로 기본적인 틀을 잡아서 제공하면 프로그램을 만드는 여러 개발자들은 기본적인 틀에 맞춰서 개발을 하기 때문에 표준화가 가능하다.
- 서로 관계없는 클래스들을 새로운 관계를 맺어줄 수 있다.
'프로그래밍 언어' 카테고리의 다른 글
자바 1주차 스터디 (0) | 2021.02.16 |
---|---|
다형성 (0) | 2021.02.12 |
배열 vs 리스트 (0) | 2021.01.26 |
인스턴스,static 개념 (0) | 2021.01.24 |
Call Stack(호출스택) (0) | 2021.01.24 |