국비 16-1

냐아암·2023년 5월 9일
0

국비

목록 보기
21/114

다형성 복습

  • 상속
    -(자식 클래스의) 공통된 부분을 추출하여 부모 클래스를 만드는 것
    --> 공통된 필드, 메소드를 가진 클래스를 만들고 작성된 코드를 자식들이 물려 받아 사용
    (코드 길이 감소, 코드 중복 제거, 재사용성 증가, 자식에 대한 일관된 규칙 제공)
  • [일반 클래스] 상속
    -부모 클래스도 객체로 만들 수 있어야 되는 경우
    ex) (부)갤럭시 22 (자)갤럭시 22 울트라
  • [추상 클래스] 상속
    -★연관된 클래스★의 공통점을 묶어두되, 부모 클래스는 객체로 만들 수 없는 경우
  • 일부 미완성 클래스(abstract 메소드 0개 이상 포함)
    *abstract 메소드가 없어도 클래스를 객체로 못만들게 하고 싶은 경우가 있음
    ex) 계산기(+, -,
    , /) -> 기본 기능을 가지고 있지만 이것만으로는 사용 범위가 좁음
    --> abstract로 만들어서 객체 생성 막아둠

    *의미적으로 객체가 되면 안 되는 경우
    ex) Biology - 생물 객체는 어떤 생물인가?

    ex) Animal 클래스
    동물 객체는 어떤 동물인가? eat(), breath() 는 어떻게 수행되는가?
    --> 알 수 없음 but 동물의 공통된 기능명은 알고 있음

  • [인터페이스] 상속
    interface: 점점
    -★연관성이 낮거나 없는★ 클래스들에게 공통된 기능을 제공할 때 사용

    ex) 키보드, 마우스, 스캐너, 카메라, 압력센서, 기울기 센서
    --> 입력 장치(각각의 용도는 다르지만 "입력"이라는 공통된 "기능명"이 있을 뿐)

  • 모든 필드(변수)가 묵시적(암묵적) public static final
    ex) public staic final double PI = 3.141592;
    public static final int MAX_NUM = 10000;
    (public static final을 적지 않아도 자동으로 적혀져있다고 암묵적으로 정의)

  • 모든 메소드가 묵시적으로 public abstract (추상 메소드)
    ex) public abstract void input();
    "input"이라는 이름을 자식에게 제공할 뿐 생략 가능, 상세한 기능은 자식이 알아서 오버라이딩 해라
    ->그런데 추상 메소드이기 때문에 오버라이딩 강제화

(참고) 인터페이스 활용 용도
-default 메소드: 상속 받은 클래스에 공통 기능을 제공
--> 자바의 함수 지향 언어 사용을 위한 메소드로 사용

+람다, 스트림에 사용

+Spring AOP Proxy 사용


인터페이스

추상 클래스의 변형체(추상 클래스보다 추상도가 높다)
- 추상 클래스: 일부만 추상 메소드(0개 이상)
- 인터페이스: 모두 추상 메소드

  • 필드(묵시적으로 public static final)
  • 메소드(묵시적으로 public abstract)

상속 시 implements 사용


인터페이스 특징
1) 인터페이스를 부모 참조 변수로 사용하면 다형성의 업 캐스팅이 적용되어서 상속받은 모든 클래스를 자식 객체로 참조할 수 있다.

-> 이를 이용하여 중요한 메인 코드의 수정을 최소화할 수 있다.
ex) Run에 작성된 합, 차, 곱, 몫을 출력하는 코드의 수정 없이 객체 생성 코드 한 줄만 수정하여 다르게 작성된 기능을 수행할 수 있다.

2) 자식 클래스에 공통된 메소드 구현을 강제하기 때문에 모든 자식 클래스가 동일한 형태를 띄게 된다.
-> 이를 이용하여 공동 작업에 필요한 개발 환경을 조성할 수 있다


Calculator

package edu.kh.poly.ex2.model.service;

//class를 만든 게 아니라 interface로 들어가서 만들었음

//계산기 인터페이스
//-> 모든 계산기에 대한 공통 필드, 기능명을 제공하는 접점(interface) 용도
public interface Calculator {

	//인터페이스: 추상 클래스의 변형체(추상 클래스보다 추상도가 높다)
	//			- 추상 클래스: 일부만 추상 메소드(0개 이상)
	//			- 인터페이스: 모두 추상 메소드
	
	//필드(묵시적으로 public static final)
	//-> 어떻게 작성하든 모두 public static final
	public static final double PI = 3.14;
	static final int MAX_NUM = 100000;
	public int MIN_NUM = -100000;
	int ZERO = 0;
	
	//메소드(묵시적으로 public abstract)
	public abstract int plus(int num1, int num2); //{} 괄호 붙이면 오류남
	public abstract int minus(int num1, int num2); 
	public abstract int multiple(int num1, int num2); 
	public abstract double divide(int num1, int num2); 
	
	
	
	
}

KHJCalculator

package edu.kh.poly.ex2.model.service;

import edu.kh.poly.ex2.model.vo.Animal;

public class KHJCalculator extends Animal implements Calculator {
			//클래스, 인터페이스는 동시 상속 가능
			//인터페이는 다중 상속 가능

	//extends: 확장하다, implements: 구현하다
	
	//(부)클래스 - (자)클래스 상속 시 extends 사용(추상 클래스도 포함)
	//(부)인터페이스 - (자) 클래스 상속 시 implements
	
	
	@Override
	public int plus(int num1, int num2) {
		return num1 + num2;
	}

	@Override
	public int minus(int num1, int num2) {
		return num1 - num2;
	}

	@Override
	public int multiple(int num1, int num2) {
		return num1 * num2;
	}

	@Override
	public double divide(int num1, int num2) {
		return num1 / num2;
	}

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void breath() {
		// TODO Auto-generated method stub
		
	}
	

}

JHSCalculator

package edu.kh.poly.ex2.model.service;

public class JHSCalculator implements Calculator{

	@Override
	   public int plus(int num1, int num2) {
	      return num1 + num2 + MAX_NUM;
	   }

	   @Override
	   public int minus(int num1, int num2) {
	      return num1 - num2 + MAX_NUM;
	   }

	   @Override
	   public int multiple(int num1, int num2) {
	      return num1 * num2 + MAX_NUM;
	   }

	   @Override
	   public double divide(int num1, int num2) {
	      return (double)num1 / num2 + MAX_NUM;
	   }
	
	
	
	
}

AbstractionRun

package edu.kh.poly.ex2.run;

import edu.kh.poly.ex2.model.service.AbstractService;
import edu.kh.poly.ex2.model.service.Calculator;
import edu.kh.poly.ex2.model.service.JHSCalculator;

public class AbstractRun {

	public static void main(String[] args) {
		
		AbstractService service = new AbstractService();
	
//		service.ex1();
		
		//=======================================================
		
		// Calculator 임폴트
		// import edu.kh.poly.ex2.model.service.Calculator;
		      
		// 각자 만든 xxxCalculator 임폴트
		// import edu.kh.poly.ex2.model.service.JHSCalculator;
		
//		Calculator cal = new Calculator();
		//인터페이스 == 미완성 설계도 == 객체 생성 불가능
		//-> 추상 클래스처럼 참조변수로는 사용 가능
		
		//코드의 큰 수정 없이 
		//객체 생성 코드만 바꾸면 새로운 클래스 코드를 수행할 수 있다. 
		   
//		Calculator cal = new KHJCalculator();
		Calculator cal = new JHSCalculator();
		      
		System.out.println("합 : " + cal.plus(20, 15));
		System.out.println("차 : " + cal.minus(20, 15));
		System.out.println("곱 : " + cal.multiple(20, 15));
		System.out.println("몫 : " + cal.divide(20, 15));
		
		//인터페이스의 특징
		//1) 인터페이스를 부모 참조 변수로 사용하면 
		//	 다형성의 업 캐스팅이 적용되어서
		//	 상속받은 모든 클래스를 자식 객체로 참조할 수 있다.
		
		//-> 이를 이용하여 중요한 메인 코드의 수정을 최소화할 수 있다.
		//	 ex) Run에 작성된 합, 차, 곱, 몫을 출력하는 코드의 수정 없이
		//		 객체 생성 코드 한 줄만 수정하여 다르게 작성된 기능을 수행할 수 있다.
		
		//2) 자식 클래스에 공통된 메소드 구현을 강제하기 때문에
		//	 모든 자식 클래스가 동일한 형태를 띄게 된다.
		//	 -> 이를 이용하여 공동 작업에 필요한 개발 환경을 조성할 수 있다.
		

	}

}
profile
개발 일지

0개의 댓글