상속 / 인터페이스 예제 +α
💻 상속
- 메인클래스
public class Main {
public static void main(String[] args) {
//서브클래스의 자료형으로 서브클래스 객체 생성
Sub objSub = new Sub(5);
//sub 자바 키워드 존재 => objSub 사용
System.out.println("슈퍼클래스 필드 : " + objSub.getNum1());
objSub.mtd1();
//서브클래스 객체 생성했지만 슈퍼클래스 메서드 호출 가능
int num = objSub.getNum1();
System.out.println("슈퍼클래스의 필드(num1) : " + num);
objSub.mtd2();
System.out.println("서브클래스 필드(num2) : " + objSub.getNum2());
}
}
- 슈퍼클래스
public class Super {
//private 사용 시 메인클래스에서 접근 불가
//게터 생성 시 private 사용해도 접근 가능
private int num1;
/*디폴트생성자(매개변수가 없는 생성자)
=> 자동으로 만들어짐 but 매개변수를 갖는 다른 생성자가 호출된다면
디폴트 생성자 자동 생성 X => 직접 표기해서 만들어야 함*/
// public Super() {}
public Super(int num1) {
this.num1 = num1;
}
public void mtd1() {
System.out.println("슈퍼클래스의 메서드");
System.out.println("슈퍼클래스 필드(num1) : " + num1);
}
public int getNum1() {
return num1;
}
}
- 서브클래스
public class Sub extends Super {
//상속받으면 두개의 클래스가 하나의 클래스가 되어버린다!
private int num2;
public Sub(int num1) {
super(num1);
this.num2 = num1 * 2;
}
public void mtd1() {
System.out.println("오버라이딩");
}
public void mtd2() {
System.out.println("서브클래스의 메서드");
System.out.println("슈퍼클래스 필드(num2) : " + num2);
}
public int getNum2() {
return num2;
}
}
- 실행결과
💻 인터페이스
- 메인클래스
import java.util.Scanner;
public class Main {
static Super objSuper;
public static void main(String[] args) {
System.out.println("OO은행 방문을 환영합니다.");
System.out.println("잔액조회는 1번, "
+ "지점안내는 2번을 눌러주세요.");
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
scanner.close();
if (num==1) {
objSuper = new Sub(10000);
} else if (num==2) {
objSuper = new Sub2();
}
objSuper.mtd();
}
}
- 인터페이스
public interface Super {
public abstract void mtd(); //추상메서드(abstract 생략가능)
//본문 내용({...})이 없는 메서드
}
- 서브클래스1
public class Sub implements Super {
// extends : 상속
// implements : 구현
private int num1;
public Sub(int num1) {
this.num1 = num1;
}
public void mtd() {
System.out.println("잔액조회");
System.out.println("잔액 : " + num1);
}
}
- 서브클래스2
public class Sub2 implements Super {
@Override //어노테이션
public void mtd() {
System.out.println("지점전화번호");
System.out.println("123-456-7890");
}
}
- 실행결과
💻 +α
슈퍼클래스의 자료형으로 서브클래스 객체 참조하기
슈퍼클래스명 변수명 = new 서브클래스명(); 변수명.메서드명(); //오버라이딩 된 메서드
- 메서드 오버라이딩을 사용 목적으로 만듦
- 동일한 매개변수시그너처 => 슈퍼클래스의 메서드 실행 => 서브클래스의 내용 실행
- 분산처리 목적
상속과 인터페이스
(부모-자식)
- 상속(extends) : 클래스-클래스 / 인터페이스-인터페이스
- 구현(implements) : 인터페이스-클래스
- 클래스-인터페이스 는 존재 X
- 클래스는 단일 상속만 가능(자식클래스는 부모클래스 1개만 가질 수 있음)
- 부모클래스는 여러 자식 클래스를 가질 수 있음
- 인터페이스는 다중 구현 가능 : 자식클래스에서 여러 인터페이스를 부모로 가질 수 있음
(implements 인터페이스명, 인터페이스명, ...)
인터페이스에서 만들 수 있는 메서드
- 추상메서드 : 본체 내용이 없는 메서드, 인터페이스를 구현한 클래스에서는 반드시 구현(오버라이딩, 본체를 작성하는 것)해야 함
=> public, abstract 모두 생략 가능 (ex) void mtd();)
(((근데 헷갈리니까 그냥 둘 다 쓰자!)))
- 디폴트메서드
- 정적메서드
(디폴트메서드와 정적메서드는 인터페이스에서 본체를 가질 수 있다.)
인터페이스 구현
-
인터페이스에 추상메서드가 있다면 그 추상메서드를 반드시 구현해야한다. (안하면 오류!)
-
추상메서드 구현 = 메서드 오버라이딩
-
슈퍼자료형(인터페이스)의 추상메서드 접근제어 <= 서브자료형(클래스)에서 구현된 메서드의 접근제어 범위
(public > protected > package > private)
(((실무에선 걍 둘 다 public 적는다,,)))
(((인터페이스 추상메서드엔 public 없어도 구현된 클래스 메서드에는 반드시 public 적어야 함)))
(((헷갈리지 않게 걍 추상메서드에 public abstract 쓰자,,!)))
Author And Source
이 문제에 관하여(상속 / 인터페이스 예제 +α), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@losuif/상속-인터페이스-예제저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)