오버로딩, 오버라이딩 / 인터페이스

losuif·2021년 7월 17일
0

학원 복습 - JAVA

목록 보기
19/32
post-thumbnail

👩🏼‍💻 메소드 오버로딩(Overloading) / 오버라이딩(Overriding)

오버로딩 (Overloading)

  • 단일 클래스, 상속관계 클래스에서 모두 적용
  • 동일한 메서드명, 다른 유형과 개수의 매개변수
  • 매개변수 시그너처가 일치하는 메서드가 실행됨

ex)

오버라이딩 (Overriding)

  • 상속관계의 클래스에서만 적용
  • 매개변수 시그너처가 동일한 메서드가 각각 슈퍼, 서브 클래스에 존재한다면, 서브 클래스의 메서드 내용이 슈퍼 클래스의 메서드 내용을 덮어쓰는 것

    ex

매개변수 시그너처

: 객체를 만들 때 매개변수의 짝이 일치하는 생성자 필요 (자료형의 개수와 순서의 일치)




👩🏼‍💻 인터페이스 (Interface)

  • 상수 필드 사용 : final static / static final 사용
  • 객체를 생성할 수 없다 => 생성자를 가질 수 없다
  • 추상 메서드(abstract method) 또는 디폴트 메서드(default method) 등 사용
  • 인터페이스를 구현한 클래스를 객체로 만들어 사용
  • 구현한 클래스에서는 추상 메서드를 반드시 구현해야 함

추상클래스 (abstract class)

  • 추상 메서드가 있는 클래스 => 추상 클래스
  • 추상 클래스는 직접 객체로 만들 수 없음
  • 상속 받은 클래스에서 슈퍼클래스에 있는 추상메서드를 오버라이딩 하지 않으면 에러 발생

인터페이스 / 추상클래스 사용 이유

  • 다형성 : 슈퍼클래스 또는 슈퍼인터페이스의 자료형으로 서브클래스의 객체를 사용하기 위해
  • 커스텀 메서드를 활용하기 위해
  • 분산처리

ex)

🔎 quiz) 인터페이스를 사용해 사칙연산하기

메인클래스)

package pack_Interface;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		
		System.out.println("아래 연산 중 1개를 선택하세요"
				+ " \n1.덧셈 \t2.뺄셈 \t3. 곱셈 \t4.나눗셈");
		
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("선택한 연산 : ");
		int calcCode = scanner.nextInt();
		
		System.out.print("\n계산에 사용할 숫자 2개를 입력하세요");
		double num1 = scanner.nextDouble();
		double num2 = scanner.nextDouble();
		
		scanner.close();
		
		System.out.println("----------------------------\n");
		System.out.println("[처리결과] ");	
		
		Distribute obj = null; 
		//참조자료형에 대한 초기화값은 null을 사용
		
		switch(calcCode) {
			case 1:
				obj = new Add(num1, num2);
				break;
			case 2:
				obj = new Sub(num1, num2);
				break;
			case 3:
				obj = new Times(num1, num2);
				break;
			case 4:
				obj = new Div(num1, num2);
				break;
		}
		
		obj.calc();
	}

}

인터페이스)
package pack_Interface;

public interface Distribute {

	public void calc(); //추상메서드
}

서브클래스1 Add)
package pack_Interface;

public class Add implements Distribute {
	//alt shift s v
			
		private double num1;
		private double num2;
		
		public Add(double num1, double num2) {
			this.num1 = num1;
			this.num2 = num2;
		}
		
		@Override
		public void calc() {
			System.out.println("Add 객체가 생성되었습니다.");
			System.out.println("calc 메서드가 실행되었습니다.");
			double res = num1+num2;
			System.out.printf("계산결과는 %.1f입니다.",res);
		}
		
}

서브클래스2 Sub)
package pack_Interface;

public class Sub implements Distribute {

	private double num1;
	private double num2;
	
	public Sub(double num1, double num2) {
		this.num1 = num1;
		this.num2 = num2;
	}
	
	@Override
	public void calc() {
		System.out.println("Sub 객체가 생성되었습니다.");
		System.out.println("calc 메서드가 실행되었습니다.");
		double res = num1-num2;
		System.out.printf("계산결과는 %.1f입니다.",res);
	}

}

서브클래스3 Times)
package pack_Interface;

public class Times implements Distribute {

	private double num1;
	private double num2;
	
	public Times(double num1, double num2) {
		this.num1 = num1;
		this.num2 = num2;
	}
	
	@Override
	public void calc() 
	{System.out.println("Times 객체가 생성되었습니다.");
	System.out.println("calc 메서드가 실행되었습니다.");
	double res = num1*num2;
	System.out.printf("계산결과는 %.1f입니다.",res);
	}

}

서브클래스4 Div)
package pack_Interface;

public class Div implements Distribute {

	private double num1;
	private double num2;
	
	public Div(double num1, double num2) {
		this.num1 = num1;
		this.num2 = num2;
	}
	
	@Override
	public void calc() {
		System.out.println("Div 객체가 생성되었습니다.");
		System.out.println("calc 메서드가 실행되었습니다.");
		double res = num1/num2;
		System.out.printf("계산결과는 %.1f입니다.",res);
	}

}

0개의 댓글