추상
추상: 실체 간에 공통되는 특성을 추출한 것.
클래스에서도 추상 클래스가 존재하는데 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상클래스라고 한다. 추상 클래스가 부모이고 실체 클래스가 자식으로 구현되면 실체 클래스는 추상 클래스의 모든 특성을 물려받고, 추가적인 특성(필드, 메소드)을 가질 수 있다.
추상 클래스 선언
추상 클래스를 선언할 때에는 클래스 선언에 abstract 키워드를 붙여야한다. abstract를 붙이게 되면 new연산자를 이용해서 객체를 만들지 못하고 상속을 통해 자식 클래스만 만들 수 있다.
public abstract class Phone{
//필드
public String owner;
//생성자
public Phone(String owner){
this.owner=owner;
}
//메소드
public void turnOn(){
System.out.println("폰 전원을 켭니다.");
}
public void turnOff(){
System.out.println("폰 전원을 끕니다.");
}
}
Phone 추상 클래스를 상속해서 SmartPhone 자식 클래스를 정의한 것이다.
SmartPhone 클래스의 생성자에서 super(owner)코드로 Phone의 생성자를 호출하고 있다.
public class SmartPhone extends Phone{
//생성자
public SmartPhone(String owner){
super(owner);
}
//메소드
public void internetSearch(){
System.out.println("인터넷 검색을 합니다.");
}
}
다음은 Phone의 생성자를 호출해서 객체를 생성할 수 없음을 보여준다.
자식클래스인 SmartPhone으로 객체를 생성해서 Phone의 메소드인 turnOn(),turnOff() 메소드를 사용할 수 있다.
public class Main {
public static void main(String[] args) {
// Phone phone = new Phone();
SmartPhone smartPhone = new SmartPhone("홍길동");
smartPhone.turnOn();
smartPhone.internetSearch();
smartPhone.turnOff();
}
}
추상 메소드와 오버라이딩
추상 클래스는 실체 클래스가 공통적으로 가져야 할 필드와 메소드들을 정의해 놓은 추상적인 클래스이므로 실체 클래스의 멤버를 통일화하는데 목적이 있다. 하지만 메소드의 선언만 통일화하고 실행 내용은 실체 클래스마다 달라야하는 경우가 있다.
예를들어 Animal 추상 클래스에서 sound()라는 메소드를 정의했다고 했을때 실체 클래스 별로 다른 소리를 내야하기 때문에 sound()는 각 실체 클래스 별로 따로 작성되어야 한다.
이로 인해 추상 클래스는 추상메소드를 선언할 수 있다.
public abstract class Animal{
//메소드의 선언부만 있고 메소드 실행 내용인 중괄호가 없다.
//하위 클래스는 반드시 실행 내용을 채워야 한다.
public abstract void sound();
}
다음 Dog 클래스는 추상클래스인 Animal을 상속하고 추상 메소드인 sound()를 재정의한다.
public class Dog extends Animal{
//추상메소드의 재정의
@Override
public void sound(){
System.out.println("멍멍");
}
}
인터페이스
자바에서 인터페이스는 객체의 사용 방법을 정의한 타입이다. 인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다.
그렇다면 왜 개발 코드가 직접 객체의 메소드를 호출하지 않고 중간에 인터페이스를 둘까? 인터페이스는 여러 구현객체들과 호환이 가능하므로 어떤 객체를 사용하느냐에 따라 실행 내용과 리턴값이 다를 수 있다. 이는 다형성을 구현하는데 중요한 역할을 한다.
인터페이스 선언
인터페이스 선언은 class 키워드 대신에 interface 키워드를 선언한다.
인터페이스는 상수와 메소드만을 구성 멤버로 가지며 객체로 생성할 수 없기 떄문에 생성자를 가질 수 없다.
interface RemoteControl{
//상수 : 대문자로 입력하며, 반드시 초기값대입
public static final MAX_VOLUME=10;
//추상메소드
public void turnOn();
public void turnOff();
}
구현클래스
implements를 통해 구현 클래스를 만들 수 있으며 이는 RemoteControl로 타입변환이 가능하다.
public class Television implements RemoteControl{
//필드
private int volume;
//turnOn() 추상메소드의 실체 메소드
public void turnOn(){
System.out.println("tv를 켭니다.");
}
//turnOff() 추상메소드의 실체 메소드
public void turnOff(){
System.out.println("tv를 끕니다.");
}
}
추상클래스와 인터페이스의 차이
공통점
1. 추상메서드를 구현한다.
2. new를 이용해 객체생성을 할 수 없다
차이점
1. 추상클래스는 단일상속, 인터페이스는 다중 상속이 가능하다는 것이다.
2. 공통된 기능을 사용하고자하면 동일한 인터페이스를 구현시키면 된다. 하지만 추상 클래스를 이용해서 상속시키는 방법도 있다. 이렇게 보면 둘의 차이가 없는 것 같지만, 자바에서 추상클래스는 Has-a 관계의 단일 상속만 가능하다.
하단의 그림을 보면 사람인 Kevin과 Turtle클래스는 다른 조상클래스로부터 확장된 실체 클래스이다.
이 두 클래스가 수영을 할수있다인 Swimable의 기능인 swim()메소드를 가지려면 부모인 추상클래스에 swim()을 추가해 줄 수도 있겠지만 모든 Human과 Animal이 수영을 할 줄 아는게 아니기 때문에 Kevin과 Turtle클래스에만 따로 인터페이스를 구현해주는 것이다.
출처:
(도서) 이것이 자바다
(블로그) https://myjamong.tistory.com/150
'컴퓨터 공부 > JAVA' 카테고리의 다른 글
2022-09-06 상속 (0) | 2022.09.06 |
---|---|
2022-09-05 객체 기초 (0) | 2022.09.05 |
multi-thread 동기화(synchronization) (0) | 2021.09.13 |
자바 Thread (0) | 2021.09.13 |
제네릭 프로그래밍 (0) | 2021.08.26 |
댓글