대학수업/프로그램설계방법론

[08] 프로그램 설계 방법론(제어 구조_조건-선택)

MIRIP 2022. 9. 29. 14:46
반응형

주제 : 제어 구조(Control Structure)

  • 기술한 순서대로 진행
  • 메서드 호출

선택 구조 : If와 else문을 사용하여 작성하는 문법

import javax.swing.JOptionPane;

public class Conditional {
	public static void main(String[] args) {
		String input = JOptionPane.showInputDialog("나이를 알려주세요");
		int age = Integer.parseInt(input);
		if(age<19)
			System.out.println(age + "세는 미성년입니다.");
		else
			System.out.println(age + "세는 성년입니다.");
		int n = Integer.parseInt(JOptionPane.showInputDialog("역수를 계산해드립니다."));
		if (n==0)
			System.out.println("0은 역수가 없습니다.");
		else
			System.out.println(n+"의 역수는 " + 1.0/n + "입니다.");
	}
}

중첩 선택 : if와 else를 많이 사용하여 여러 가지 경우의 수로 표현하는 것을 말한다.

 

논리 연산 : 

예외 처리 : 특정 조건을 충족하였을 때 프로그램을 나가는 등의 코드가 작동하도록 프로그래밍하는 것이다.

if (dollars<0 || cents<0 || cents>99) {
    System.exit(0);
}

switch : switch( ) { } 문 안에 case와 break를 사용하여 조건문을 나누는 것을 뜻한다. 별로 권장하지 않는다.

 


애플리케이션 구현 절차

스텝 1 : 유즈 케이스(use-case) 수집 --> View(사용자 인터페이스) 설계

스텝 2 : 클래스 다이어그램 작성

스텝 3 : 클래스 별로 클래스 명세 작성

스텝 4 : 클래스 별로 코드 작성 및 테스트

스텝 5 : 통합 테스트


사례 학습 : 지갑 애플리케이션

 

스텝 1 : 유즈 케이스 수집 + 사용자 인터페이스 설계

  • 서비스 : 수입(+), 지출(-), 종료(Q, q)
  • 금액 : 정수(음수 불가)

스텝 2 : 클래스 다이어그램 작성

클래스 다이어그램

스텝 3 : 클래스 명세 작성

Model
View
Controller

스텝 4 : 코드 작성

스텝 5 : 테스트 및 버그 수정

//Model
public class Purse {
	private int balance;
	
	public boolean earn(int amount) {
		if (amount<0) {
			return false;
		}
		else {
			balance+=amount;
			return true;
		}
	}
	
	public boolean spend(int amount) {
		if (amount<0|| amount>balance) {
			return false;
		}
		else {
			balance-=amount;
			return true;
		}
	}
	
	public int getBalance() {
		return balance;
	}
}
//View

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.*;

public class PurseWriter extends JPanel{
	private Purse purse;
	String last_transaction;
	
	public PurseWriter(String title, int x, int y, Purse p) {
		purse = p;
		JFrame f = new JFrame();
		f.getContentPane().add(this);
		f.setTitle(title);
		f.setLocation(x,y);
		f.setSize(300, 200);
		f.setVisible(true);
		f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}
	
	protected void paintComponent(Graphics g) {
		g.setColor(Color.white);
		g.fillRect(0, 0, 300, 222);
		g.setColor(Color.black);
		g.drawString(last_transaction, 50, 50);
		g.drawString("잔액 = " + purse.getBalance(), 50, 70);
	}
    
	public void showTransaction(int amount, String message) {
		last_transaction = amount + " " + message;
		this.repaint();
	}
	public void showTransaction(String message) {
		last_transaction = message;
		this.repaint();
	}
}
//View

import javax.swing.JOptionPane;

public class PurseReader {
	public char readRequest(String message) {
		String input = JOptionPane.showInputDialog(message);
		return input.charAt(0);
	}
	
	public int readAmount(String message) {
		String input = JOptionPane.showInputDialog(message);
		input = input.trim();
		if(input.length()>0)
			return Integer.parseInt(input);
		else {
			JOptionPane.showInputDialog(null, "금액 입력 오류");
			return 0;
		}
	}
}
//Controller

public class PurseController {
	private PurseReader reader;
	private PurseWriter writer;
	private Purse purse;
	
	public PurseController(PurseReader r, PurseWriter w, Purse p) {
		reader = r; writer = w; purse = p;
	}
	
	public void processTransactions() {
		String message = "+,-,Q 키 중 하나를 누르고 OK 단추를 누르세요.\n 수입 +, 지출 -, 종료 Q";
		char request = reader.readRequest(message);
		message = "금액을 입력하고 OK 닻루를 누르세요.";
		int amount;
		if(request == 'Q' || request == 'q') {
			writer.showTransaction("서비스를 마칩니다.");
			return;
		}
		else if(request == '+') {
			amount = reader.readAmount(message);
			if(purse.earn(amount))
				writer.showTransaction(amount, "수입");
			else
				writer.showTransaction("수입 실패");
		}
		else if(request == '-') {
			amount = reader.readAmount(message);
			if (purse.spend(amount))
				writer.showTransaction(amount, "지출");
			else
				writer.showTransaction("지출 실패");
		}
		else
			writer.showTransaction("요청 오류");
		this.processTransactions();
	}
}
728x90
반응형