Java - 상속/인터페이스/추상클래스
2022. 6. 21. 00:02ㆍJava
상속/인터페이스/추상클래스 개념
상속
- extends 키워드로 선언
- 부모 클래스 = super class
- 자식 클래스 = sub class
- 슈퍼 클래스 객체와 서브 클래스의 객체는 별개
- 서브 클래스 객체는 슈퍼 클래스 멤버 포함
class Animal{
int age;
String Species;
}
class dog extends Animal{
String name;
}
//dog 클래스는 Animal 클래스를 상속 받았기 때문에 age, Species 멤버에 접근 가능
자바 상속의 특징
- 클래스 다중 상속 불가능
- 단 인터페이스의 경우 다중 상속 허용
슈퍼 클래스 멤버의 접근 지정자
슈퍼 클래스 멤버에 접근하는 클래스 종류 슈퍼 클래스 멤버의 접근 지정자 private default protected public 같은 패키지의 클래스 x o o o 다른 패키지의 클래스 x x x o 같은 패키지 서브 클래스 x o o o 다른 패키지 서브 클래스 x x o o
- protected 멤버에 대한 접근은 같은 패키지의 모든 클래스 or 상속되는 서브 클래스에게 허용
- 서브 클래스의 객체가 생성될 때, 슈퍼클래스 서브 클래스 생성자 둘다 실행 된다.
- 이때 생성자의 목적은 객체 초기화 이므로 서브 클래스의 생성자는 서브 클래스의 멤버나 필요한 초기화를 수행하고, 슈퍼 클래스의 생성자는 슈퍼 클래스의 멤버나 필요한 초기화를 각각 수행한다.
- 슈퍼클래스 생성자 -> 서브클래스 생성자 순으로 실행된다.
- super()로 슈퍼 클래스의 생성자를 선택 호출할 수 있다.
- 이 경우 반드시 서브 클래스 생성자 코드의 제일 첫 라인에 와야 함
추상 클래스
- 추상 메소드 : abstract로 선언된 메소드, 메소드의 코드는 없고 원형만 선언함
abstract public String getName(); //추상 메소드
abstract public String fail() { return "good bye"; } //추상 메소드 X
- 추상 클래스 상속
- 추상 클래스를 상속받으면 추상 클래스가 됨
- 서브 클래스도 abstract로 선언함
- 추상 클래스 구현
- 서브 클래스에서 슈퍼 클래스의 추상 메소드 구현(오버라이딩)
- 추상 클래스를 구현한 서브 클래스는 추상 클래스 아님
- 추상 클래스의 목적
- 상속을 위한 슈퍼 클래스로 활용하는 것
- 서브 클래스에서 추상 메소드 구현
- 다형성 실현
abstract class Calculator{ //추상 클래스
public abstract int add(int a, int b);
public abstract int subtract(int a, int b);
public abstract double average(int[] a);
}
class GoodCalc extends Calculator{
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public double average(int[] a) {
double sum=0;
for(int i=0; i<a.length; i++){
sum+=a[i];
}
return sum;
}
@Override
public int subtract(int a, int b) {
return a-b;
}
}
public class prt1{
public static void main(String[] args) {
GoodCalc a = new GoodCalc();
System.out.println(a.add(2,3));
System.out.println(a.subtract(5, 2));
System.out.println(a.average(new int []{2,5,6}));
}
}
추상클래스를 활용한 예제
abstract class Vehicle{
protected int speed;
public void setSpeed(int s){
speed = s;
System.out.println("속도를 "+speed+"로 변경했습니다");
}
abstract void show();
}
class Car extends Vehicle{
private int num;
private double gas;
public Car(int n, double g){
num = n;
gas = g;
System.out.println("차량번호 "+num+", 연료양"+gas+"인 자동차가 만들어졌습니다");
}
public void show(){
System.out.println("차량번호는 "+num+"입니다");
System.out.println("연료양은 "+gas+"입니다");
System.out.println("속도는 "+speed+"입니다");
}
}
class Plane extends Vehicle{
private int flight;
public Plane(int f){
flight = f;
System.out.println("비행기 번호가 "+flight+"인 비행기가 만들어졌습니다");
}
public void show(){
System.out.println("비행기 번호는"+flight+"입니다");
System.out.println("속도는"+speed+"입니다");
}
}
public class test{
public static void main(String[] args) {
Vehicle[] vc;
vc = new Vehicle[2];
vc[0] = new Car(1234,20.5);
vc[0].setSpeed(60);
vc[1] = new Plane(232);
vc[2].setSpeed(2600);
for(int i =0; i<vc.length;i++){
vc[i].show();
}
}
}
자바의 인터페이스
- 클래스가 구현해야 할 메소드들이 선언
- 인터페이스 선언은 Interface 키워드로 선언
- 인터페이스에는 필드(멤버 변수) 선언 불가
- 인터페이스의 구성 요소들
- 상수 public만 허용하며 public static final 생략
- 추상 메소드 public abstract 생략 가능
- default 메소드
- 인터페이스에 코드가 작성된 메소드
- 인터페이스를 구현하는 클래스에 자동 상속
- public 접근 지정만 허용
- private 메소드
- 인터페이스 내에 메소드 코드가 작성 되어야 함
- 인터페이스 내에 있는 다른 메소드에 의해서만 호출 가능
- static 메소드
- public private 모두 지정 가능, 생략하면 public
- 인터페이스간에 상속 가능
- 인터페이스를 상속하여 확장된 인터페이스 작성 가능
- 다중 상속 허용
- 인터페이스의 추상 메소드를 모두 구현한 클래스 작성
- implements 키워드 사용
- 여러개의 인터페이스 동시 구현 가능
interface PhoneInterface{ //인터페이스 선언
final int TIMEOUT = 10000; //상수 필드 선언
void sendCall(); //추상 메소드
void receiveCall(); //추상 메소드
default void printLogo(){ //default 메소드
System.out.println("** Phone **");
}
}
class SamsungPhone implements PhoneInterface{
@Override
public void receiveCall() {
System.out.println("뽀잉 뽀잉");
}
@Override
public void sendCall() {
System.out.println("삼성폰 전화왔어요~");
}
public void flash(){
System.out.println("전화기에 불이 켜졌습니다");
}
}
public class prt1{
public static void main(String[] args) {
SamsungPhone Galaxy = new SamsungPhone();
Galaxy.printLogo();
Galaxy.sendCall();
Galaxy.receiveCall();
Galaxy.flash();
}
}
'Java' 카테고리의 다른 글
JAVA - Swing/AWT/GUI (0) | 2022.10.05 |
---|---|
Java - 패키지와 모듈화 / Wrapper (0) | 2022.06.21 |
Java - 클래스와 객체 (0) | 2022.06.20 |
Java - 컬렉션 (0) | 2022.06.19 |
Java - 객체(2) (1) | 2022.04.25 |