2021. 04. 07(수) TIL

Dylan·2021년 4월 7일
0

Java

재정의와 다형성 요약

super()

  • super() 메소드는 항상 첫줄에 적어야 한다.

static import

package day3;


/*
 * static import문
 *  - 클래스의 static 변수, static 메소드를 import한다.
 *  - static import문을 사용하면, 소스코드에서 static 변수나 static 메소드를 사용할 떄
 *    클래스이름을 생략하고 사용 할 수 있다.
 *  - 작성 예
 *  	import static java.lang.Math.*;
 *  		Math 클래스의 모든 static 변수와 static 메소드를 import 한다.
 *  	import static java.lang.Math.PI;
 *  		Math 클래스의 static 변수(상수) PI를 import한다.
 *  	import static java.lang.Math.random;
 *  		Math 클래스의 static 메소드 random()을 import한다.
 */
import static java.lang.Math.*;

public class StaticImportApp {

	public static void main(String[] args) {
//		double value1 = Math.random();
//		double value2 = Math.cos(3.14);
//		long value3 = Math.round(12.54);
//		double value4 = Math.floor(1.6);
		
		// static import문을 사용해서 클래스이름없이 static 메소드를 사용하는 예
		System.out.println("임의의 수 : " + random());
		
		System.out.println();
		System.out.println("반올림된 값(3.2) : " + round(3.2));
		System.out.println("반올림된 값(3.7) : " + round(3.7));
		
		System.out.println();
		System.out.println("바닥값(-3.2) : " + floor(-3.2));
		System.out.println("바닥값(-3.7) : " + floor(-3.7));
		System.out.println("바닥값(3) : " + floor(3));
		System.out.println("바닥값(3.2) : " + floor(3.2));
		System.out.println("바닥값(3.7) : " + floor(3.7));
		
		System.out.println();
		System.out.println("천장값(-3.2) : " + ceil(-3.2));
		System.out.println("천장값(-3.7) : " + ceil(-3.7));
		System.out.println("천장값(3) : " + ceil(3));
		System.out.println("천장값(3.2) : " + ceil(3.2));
		System.out.println("천장값(3.7) : " + ceil(3.7));
		
	}
}

추상화(Abstraction)

  • 추상화는 객체에서 공통된 속성과 기능을 추출하는 것이다.
  • 자바에서 추상화는 공통된 속성과 기능을 모아서 추상클래스(Abstract Class)나 인터페이스(Interface)를 정의하는 것이다.
  • 공통 속성은 변수나 상수로 표현하고, 기능은 추상메소드로 표현한다.
  • 추상화를 통해서 하위 클래스들이 구현해야할 공통 기능을 정의할 수 있다.

추상메소드

  • 추상메소드는 공통기능을 추상화하는 메소드다.
  • 추상메소드는 구현부가 없는 메소드다.
  • 추상메소드는 추상클래스와 인터페이스에만 정의할 수 있다.
  • 일반 클래스(구현 클래스)는 추상메소드를 보유할 수 없다.
  • 만약, 추상메소드를 상속받았다면 반드시 메소드 재정의를 통해서 구현부가 있는 메소드로 만들어야 한다.
      // 추상 메소드
      abstract void sample(); 

추상클래스(Abstract Class)

  • 추상클래스는 abstract 키워드가 붙은 클래스다.

      public abstract class Sample {
    
      }
  • 추상클래스는 추상화된 추상메소드를 가지는 클래스다.

      public abstract class Sample {
        // 추상 메소드
        abstract void test1();
        // 추상 메소드
        abstract void test2();
        // 구현 메소드
        void test3() {
    		수행문;
        }
      }
  • 추상클래스는 new 키워드를 사용해서 객체 생성할 수 없다.

  • 목적

    • 하위 클래스들이 반드시 구현할 기능을 추상메소드를 사용해서 추상화한다.
    • 모든 하위 클래스가 동일한 동작하는 기능을 추상 클래스에서 구현해서 상속시킴으로써 하위 클래스의 구현부담을 경감시킨다.

추상화의 예

package day3.template;

public abstract class AbstractBanking {

	// 모든 뱅킹작업에서 항상 실행하는 전처리 작업 - 변하지 않는 부분
	private void before() {
		System.out.println("은행 전산시스템과 연결하기");
		System.out.println("사용자 인증작업 수행하기");
	}
	
	// 모든 뱅킹작업에서 항상 실행하는 후처리 작업 - 변하지 않는 부분
	private void after() {
		System.out.println("은행 전산시스템과 연결 해제하기");
	}

	// 실제로 수행하는 작업에 대한 메소드만 설계 - 변하는 부분
	// AbstractBanking을 상속받는 하위 클래스가 구현해야할 부분
	public abstract void job();
	
	// 뱅킹작업에 참여하는 모든 메소드를 순서에 맞게 실행해주는 메소드
	void process() {
		before();
		job(); // 하위클래스에서 재정의한 job()이 실행된다.
		after();
	}
}

package day3.template;

public class ATM {

	// AbstractBanking클래스의 구현객체를 참조하는 참조변수
	// 이체작업, 입금작업, 출금작업, 대출작업 등을 구현한 다양한 AbstractBanking의 하위객체를
	// 참조할 수 있다.
	private AbstractBanking banking;
	
	// AbstractBanking 하위객체의 주소값을 전달받는 Setter 메소드
	public void setBanking(AbstractBanking banking) {
		this.banking = banking;
	}
	
	// 뱅킹작업을 실행하는 메소드
	// 뱅킹작업과 관련된 일련의 작업들을 순서대로 실행해주는 process() 메소드를 실행한다.
	public void runBanking() {
		banking.process();
	}
}

package day3.template;

import java.util.Scanner;

public class ATMApp {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		ATM atm = new ATM();
		Deposit deposit = new Deposit();
		Transfer transfer = new Transfer();
		
		while (true) {
			System.out.println("-----------------------------------");
			System.out.println("1. 입금   2.이체   0.종료");
			System.out.println("-----------------------------------");
			
			System.out.print("메뉴번호를 선택하세요 : ");
			int menuNo = sc.nextInt();
			
			if (menuNo == 1) {
				System.out.println("[입금작업]");
				
				atm.setBanking(deposit);
				atm.runBanking();
				
			} else if (menuNo == 2) {
				System.out.println("[이체작업]");
				
				atm.setBanking(transfer);
				atm.runBanking();
				
			} else if (menuNo == 0) {
				System.out.println("[종료]");
				break;
			} else {
				System.out.println("잘못 입력하셨습니다 다시 선택해주세요");
				continue;
			}
		}
	}
}

package day3.template;

public class Deposit extends AbstractBanking {

	@Override
	public void job() {
		System.out.println("입금액을 입력받는다.");
		System.out.println("금액을 확인한다.");
		System.out.println("잔액을 증가시킨다");
		System.out.println("입금결과를 표시한다.");
	}
}

package day3.template;

public class Transfer extends AbstractBanking {
	
	@Override
	public void job() {
		System.out.println("이체금액을 입력받는다.");
		System.out.println("수신자 계좌번호를 입력받는다.");
		System.out.println("수신자에게 금액을 이체한다.");
		System.out.println("잔액을 변경한다.");
		System.out.println("이체결과를 화면에 표시한다.");
	}
}

0개의 댓글