상속 / 인터페이스 예제 +α

💻 상속


  • 메인클래스
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 쓰자,,!)))

좋은 웹페이지 즐겨찾기