560 likes | 735 Views
객체지향프로그래밍 제 5 주 – 실행제어 , 배열. 제 5 장 , 6 장 , 7 장 실행제어 , 배열. 제 5 주 강의 목표 프로그램의 실행 제어를 위한 if 문과 반복문을 배운다 . 배열과 배열리스트의 사용법을 배운다. Chapter 6 결정문 (Decisions). if 문장. if (amount <= balance) balance = balance - amount;.
E N D
객체지향프로그래밍제 5주 –실행제어, 배열 강원대학교
제 5장, 6장, 7장실행제어, 배열 • 제 5주 강의 목표 • 프로그램의 실행 제어를 위한 if문과 반복문을 배운다. • 배열과 배열리스트의 사용법을 배운다. 강원대학교
Chapter 6결정문 (Decisions) 강원대학교
if문장 if (amount <= balance) balance = balance - amount; if (amount <= balance) balance = balance - amount;else balance = balance - OVERDRAFT_PENALTY; if (amount <= balance){ double newBalance = balance - amount; balance = newBalance; }else balance = balance - OVERDRAFT_PENALTY; 강원대학교
관계연산자 (Relational Operators) a = 5; // Assign 5 to a if (a == 5) . . . // Test whether a equals 5 강원대학교
소수 비교 double r = Math.sqrt(2);double d = r * r -2;if (d == 0) System.out.println("sqrt(2)squared minus 2 is 0");else System.out.println("sqrt(2)squared minus 2 is not 0 but " + d); sqrt(2)squared minus 2 is not 0 but 4.440892098500626E-16 * Math.sqrt(2) ==1.41421356237309504... 강원대학교
소수 비교 final double EPSILON = 1E-14;if (Math.abs(x - y) <= EPSILON) // x is approximately equal to y 강원대학교
문자열 비교 • Don't use == for strings! • Use equals method: Scanner in = new Scanner(System.in); String input = in.next(); if (input == "Y") // WRONG!!! “Y” input “Y” if (input.equals("Y")) if (input.equalsIgnoreCase("Y")) 강원대학교
문자열 비교 • s.compareTo(t) < 0 • 사전에서 s가 t보다 앞에 있다는 의미 • "car“가 "cargo"보다 앞에 있음 • 대문자가 소문자보다 앞에 있음 "Hello" comes before "car" 강원대학교
문자열 비교 String name = “Robert”; String nickname = name.substring(0, 3); if (nickname == “Rob”) // ? “Rob” nickname “Rob” 강원대학교
객체 비교 • ==연산자: 같은 객체인가? (tests for identity) • equals메소드: 같은 내용을 갖는가? (for identical content) • box1 != box3 • box1.equals(box3) • box1 == box2 Rectangle box1 = new Rectangle(5, 10, 20, 30);Rectangle box2 = box1;Rectangle box3 = new Rectangle(5, 10, 20, 30); 강원대학교
null reference if (middleInitial == null) System.out.println(firstName + " " + lastName);else System.out.println(firstName + " " + middleInitial + ". " + lastName); 강원대학교
단정메소드 (Predicate Method) • 부울 타입 값을 반환하는 메소드를 정의함 • 조건절에사용함 public boolean isOverdrawn(){ return balance < 0; } if (harrysChecking.isOverdrawn()) . . . 강원대학교
단정메소드 (Predicate Method) • Character클래스의 단정 메소드 • Scanner클래스의 단정 메소드 isDigitisLetterisUpperCaseisLowerCase if (Character.isUpperCase(ch)) hasNextInt hasNextDouble if (in.hasNextInt()) n = in.nextInt(); 강원대학교
논리연산자 (Boolean Operators) • && and • || or • ! Not if (0 < amount && amount < 1000) . . . if (input.equals("S") || input.equals("M")) . . . if (!input.equals("S")) . . . 강원대학교
부울 타입 변수 • private boolean married; • married = input.equals("M"); • if (married) . . . else . . . • if (!married) . . . if (married == true) . . . // Don't 강원대학교
주의할 점 if (0 < amount < 1000) … // 오류 if (0< amount && amount < 1000) … if (ch == ‘S’ || ‘M’) … // 오류 if (ch == ‘S’ || ch == ‘M’) … 강원대학교
선택적 실행 (Lazy Evaluation) if (input != null && Integer.parseInt(input) > 0) … input != null 판단이 false이면 뒷 조건표현은 계산하지 않음 강원대학교
Chapter 7반복 (Iteration) 강원대학교
While loops while (balance < targetBalance){ year++; double interest = balance * rate / 100; balance = balance + interest;} 강원대학교
doLoops double value;do{System.out.print("Please enter a positive number: "); value = in.nextDouble(); }while (value <= 0); boolean done = false; while (!done){System.out.print("Please enter a positive number: "); value = in.nextDouble(); if (value > 0) done = true; } 위 두 프로그램은 같은 조작임 강원대학교
for Loops for (int i = 1; i <= n; i++){ double interest = balance * rate / 100; balance = balance + interest;} i = 1; while (i <= n) { double interest = balance * rate / 100; balance = balance + interest; i++; } 강원대학교
for Loops for (initialization; condition; update)statement initialization;while (condition){ statement; update; } 강원대학교
초계값 (Sentinel Values) • Sentinel value: 데이터 세트의 끝을 표시하는 값 • 0이나-1같은 숫자보다는 Q와 같은 문자를 사용하는 것이 좋음 System.out.print("Enter value, Q to quit: ");String input = in.next();if (input.equalsIgnoreCase("Q"))We are doneelse { double x = Double.parseDouble(input); . . . } 강원대학교
중간에서 완료여부를 판단하는 루프 boolean done = false;while (!done){Print prompt String input = read input; if (end of input indicated) done = true; else {// Process input } } 강원대학교
Random Numbers and Simulations • Random number generator • 주사위 (random number between 1 and 6) Random generator = new Random();int n = generator.nextInt(a); // 0 <= n < adouble x = generator.nextDouble(); // 0 <= x < 1 int d = 1 + generator.nextInt(6); 강원대학교
File Die.java 01: import java.util.Random; 02: 03: /** 04: This class models a die that, when cast, lands on a 05: random face. 06: */ 07:public class Die 08: { 09: /** 10: Constructs a die with a given number of sides. 11: @param s the number of sides, e.g. 6 for a normal die 12: */ 13:public Die(int s) 14: { 15: sides = s; 16: generator = new Random(); 17: } 18: 강원대학교
File Die.java 19: /** 20: Simulates a throw of the die 21: @return the face of the die 22: */ 23:public int cast() 24: { 25:return1 + generator.nextInt(sides); 26: } 27: 28:private Random generator; 29:private int sides; 30: } 강원대학교
File DieTester.java 01: /** 02: This program simulates casting a die ten times. 03: */ 04:public class DieTester 05: { 06:public static void main(String[] args) 07: { 08: Die d = new Die(6); 09:final int TRIES = 10; 10:for (int i = 0; i < TRIES; i++) 11: { 12:int n = d.cast(); 13: System.out.print(n + " "); 14: } 15: System.out.println(); 16: } 17: } 강원대학교
배열 double[] data; data = new double[10]; double[] data = new double[10]; 강원대학교
객체의 배열 BankAccount[] accounts; accounts = new BankAccount[10]; 강원대학교
배열의 초기값 • 배열 타입에 따라 배열이 구성될 때 자동으로 저장되는 초기값이 다름 • Numbers: 0 • Boolean: false • Object References: null 강원대학교
배열의 한 원소를 지칭하는 법 data[2] = 29.95; System.out.println("The value of this data item is " + data[4]); 강원대학교
배열의 크기 • 배열의 크기를 알기 위해서는 length 필드를 읽음 • data.length • 배열은 객체로 취급됨 배열은 인스턴스 필드를 가질 수 있음 • length는 메소드가 아니라 배열 객체의 필드이므로 괄호를 붙이지 않음 • 인덱스는 0 부터 length - 1 까지 강원대학교
배열 관련 흔한 오류 double[] data = new double[3];data[0] = 1.2; data[1] = 3.4; data[2] = 0.7; double[] data = new double[3];data[3] = 29.95; // ERROR: 범위 밖 double[] data; data[1] = 29.95; //오류: 배열을 가리키는 reference만 // 선언하고 배열객체는 만들지 않았음 강원대학교
ArrayList클래스 • 배열과 비슷하나 아래와 같은 차이가 있음 • 필요에 따라 자동으로 커지거나 작아짐 • ArrayList클래스는 삽입 (insert), 삭제 (remove) 등의 메소드를 지원함 강원대학교
ArrayList • ArrayList클래스는 범용클래스(generic class)임 • ArrayList<T>는 T 타입의 객체들을 저장 ArrayList<BankAccount> accounts = new ArrayList<BankAccount>();accounts.add(new BankAccount(1001));accounts.add(new BankAccount(1015));accounts.add(new BankAccount(1022)); • ArrayList인스턴스의 크기를 지정해 줄 필요가 없음 • (기본초기용량 = 10) • 필요에 따라 자동으로 크기가 정해짐 강원대학교
배열리스트 내의 객체를 읽는 법 • get메소드 사용 • 인덱스는 0부터 시작 BankAccount anAccount = accounts.get(2); // gets the third element of the array list 객체를 배열리스트에서 제거하는 것은 아님! accounts anAccount 강원대학교
배열리스트 내의 객체를 읽는 법 • size() 메소드는 배열리스트 내 객체의 수를 반환함 • 인덱스가 범위를 벗어나면 bounds error int i = accounts.size();anAccount = accounts.get(i); // Error// legal index values are 0. . .i-1 강원대학교
배열리스트에 객체를 넣는 법 • set: 기존 값 엎어쓰기 • add: 값 추가하기 BankAccount anAccount = new BankAccount(1729);accounts.set(2, anAccount); accounts.add(i, a) boolean add(E o) o를 리스트 끝에 추가 void add(int index, E element) element를 index 위치에 삽입 (이후 객체들은 뒤로 밀림) 강원대학교
배열리스트에서 객체를 삭제하는 법 Accounts.remove(i) 강원대학교
래퍼 (Wrappers) • ArrayList는 객체만을 저장함 • 기본형 데이터는 ArrayList에 저장할 수 없음 • 여덟 가지 각 기본형 데이터에는 그에 대응되는 wrapper 클래스가 있음 강원대학교
Wrappers 강원대학교
Wrapper 인스턴스 강원대학교
자동포장기능 (Auto-boxing) • 기본 데이터타입과 wrapper 클래스 간 자동 변환 Double d = new Double(29.95); // 기존 방법Double d = 29.95; // auto-boxing double x = d.doubleValue(); // 기존 방법 double x = d; // auto-unboxing 강원대학교
자동포장기능 (Auto-boxing) • d의 포장을 벗겨double 타입으로 만듦 • 1을 더함 • 결과를 Double 타입 객체로 포장 • 레퍼런스를e가 포장된 Double 타입 객체를 가리키도록 함 Double d = new Double(3.1); Double e = d + 1.0; 강원대학교
배열리스트 조작에서의 자동포장 • ArrayList는 객체만을 저장함 • 기본형 데이터는 ArrayList에 저장할 수 없음 • 기본형 데이터를 ArrayList에 넣으려고 하면 auto-boxing이 일어남 ArrayList<Double> data = new ArrayList<Double>();data.add(29.95); // auto-boxingdouble x = data.get(0); // auto-unboxing 강원대학교
for-each루프 double[] data = . . .;double sum = 0;for (double e : data) // "for each e in data"{ sum = sum + e; // e는 data[0], data[1], ...} double[] data = . . .;double sum = 0;for (int i = 0; i < data.length; i++){ double e = data[i]; sum = sum + e;} 강원대학교
for-each루프 ArrayList<BankAccount> accounts = . . . ;double sum = 0;for (BankAccount a : accounts){ sum = sum + a.getBalance();} double sum = 0;for (int i = 0; i < accounts.size(); i++){ BankAccount a = accounts.get(i); sum = sum + a.getBalance();} 강원대학교