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 생략가능)
//본문 내용({...})이 없는 메서드
}
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);
}
}
public class Sub2 implements Super {
@Override //어노테이션
public void mtd() {
System.out.println("지점전화번호");
System.out.println("123-456-7890");
}
}
슈퍼클래스명 변수명 = new 서브클래스명(); 변수명.메서드명(); //오버라이딩 된 메서드
(부모-자식)
- 추상메서드 : 본체 내용이 없는 메서드, 인터페이스를 구현한 클래스에서는 반드시 구현(오버라이딩, 본체를 작성하는 것)해야 함
=> public, abstract 모두 생략 가능 (ex) void mtd();)
(((근데 헷갈리니까 그냥 둘 다 쓰자!)))
- 디폴트메서드
- 정적메서드
(디폴트메서드와 정적메서드는 인터페이스에서 본체를 가질 수 있다.)
인터페이스에 추상메서드가 있다면 그 추상메서드를 반드시 구현해야한다. (안하면 오류!)
추상메서드 구현 = 메서드 오버라이딩
슈퍼자료형(인터페이스)의 추상메서드 접근제어 <= 서브자료형(클래스)에서 구현된 메서드의 접근제어 범위
(public > protected > package > private)
(((실무에선 걍 둘 다 public 적는다,,)))
(((인터페이스 추상메서드엔 public 없어도 구현된 클래스 메서드에는 반드시 public 적어야 함)))
(((헷갈리지 않게 걍 추상메서드에 public abstract 쓰자,,!)))