Presentation is loading. Please wait.

Presentation is loading. Please wait.

강원대학교 3 클래스 구현 1. 강원대학교 클래스 구현 순서 1. 클래스의 공개 인터페이스 설계 2. 메소드 선언 ( 메소드 사용 사례를 적어 봄 ) 3. 구성자 선언 4. 주석 기입 및 API 문서 제작 5. 필드 선언 6. 메소드 구현 7. 테스트 2.

Similar presentations


Presentation on theme: "강원대학교 3 클래스 구현 1. 강원대학교 클래스 구현 순서 1. 클래스의 공개 인터페이스 설계 2. 메소드 선언 ( 메소드 사용 사례를 적어 봄 ) 3. 구성자 선언 4. 주석 기입 및 API 문서 제작 5. 필드 선언 6. 메소드 구현 7. 테스트 2."— Presentation transcript:

1 강원대학교 3 클래스 구현 1

2 강원대학교 클래스 구현 순서 1. 클래스의 공개 인터페이스 설계 2. 메소드 선언 ( 메소드 사용 사례를 적어 봄 ) 3. 구성자 선언 4. 주석 기입 및 API 문서 제작 5. 필드 선언 6. 메소드 구현 7. 테스트 2

3 강원대학교 외부에 보이는 개념 ( 기능과 사용법 ) 객체 (Object) 와 추상화 (Abstraction) 내부의 세부 내용 객체  외부에 나타나는 개념은 추상화 (abstraction) 를 통해 형성됨  추상화 (abstraction): 중요하지 않은 세부 내용을 제거함으로 써 핵심적인 내용만을 추출함 3

4 강원대학교 클래스의 공개 인터페이스 설계 (Designing the Public Interface of a Class) 클래스 사용법 = 공개 인터페이스 (public interface) – 지원되는 메소드의 종류, 각 메소드의 사용법 4

5 강원대학교 클래스의 공개 인터페이스 설계 (Designing the Public Interface of a Class) 예 : 자동차 (Car) 자동차가 갖추어야 할 기능 = 자동차 클래스의 공 개 인터페이스 –accelerate –break –turn 5

6 강원대학교 클래스의 공개 인터페이스 설계 (Designing the Public Interface of a Class) 예 : 은행계좌 (bank account) 은행계좌가 갖추어야 할 기능 = 은행계좌 클래스 의 공개 인터페이스 –deposit ( 예금하다 ) –withdraw ( 출금하다 ) –get balance ( 잔고를 조회하다 ) 6

7 강원대학교 클래스 설계 순서 1. 클래스의 공개 인터페이스 설계 2. 메소드 선언 ( 메소드 사용 사례를 적어 봄 ) 3. 구성자 선언 4. 주석 기입 및 API 문서 제작 5. 필드 선언 6. 메소드 구현 7. 테스트 7

8 강원대학교 메소드 선언 (Method Delaration) Class BankAccount { public void deposit(double amount) {... } public void withdraw(double amount) {... } public double getBalance() {... } } access specifier return type method namelist of parameters method body 8

9 메소드 사용 강원대학교 Class BankTester { Public static void main(String[] args) { BankAccount myAccount = new BankAccount(); myAccount.deposit(2000.0); myAccount.withdraw(500.0); System.out.println(myAccount.getBalance()); } 9

10 강원대학교 클래스 설계 순서 1. 클래스의 공개 인터페이스 설계 2. 메소드 선언 ( 메소드 사용 사례를 적어 봄 ) 3. 구성자 선언 4. 주석 기입 및 API 문서 제작 5. 필드 선언 6. 메소드 구현 7. 테스트 10

11 강원대학교 구성자 선언 (Constructor Declaration) 구성자는 객체를 구성할 때 실행한다. 객체의 상태변수 (field) 를 초기화하는 데 주로 사용된다. 구성자 이름은 클래스 이름과 같다. 반환값을 갖지 않는다. 파라미터리스트가 서로 다른 여러개의 구성자가 있을 수 있다. public BankAccount(); // 초기 잔고가 0 인 계좌 구성 public BankAccount(double initialBalance); // 초기 잔고가 initialBalance 인 계좌 구성 11

12 강원대학교 BankAccount Public Interface public interface of a class = public constructors + public methods public class BankAccount { public BankAccount() {... } public BankAccount(double initialBalance) {... } public void deposit(double amount) {... } public void withdraw(double amount) {... } public double getBalance() {...} // private fields } 12

13 강원대학교 클래스 설계 순서 1. 클래스의 공개 인터페이스 설계 2. 메소드 선언 ( 메소드 사용 사례를 적어 봄 ) 3. 구성자 선언 4. 주석 기입 및 API 문서 제작 5. 필드 선언 6. 메소드 구현 7. 테스트 13

14 강원대학교 Commenting on the Public Interface 정해진 규칙에 맞추어 주석을 달면 javadoc 도구를 사용 해 API 문서를 만들어 낼 수 있다. $ javadoc BankAccount.java /** BankAccount 는 은행계좌로서 입금, 출금이 가능하며 현재 잔고를 확인할 수 있다. */ public class BankAccount {... } 14

15 강원대학교 /** 잔고를 보여준다. @return 잔고 */ public double getBalance() { // 구현은 나중에 함 (implementation filled in later ) } /** 계좌에서 출금한다. @param amount 출금액수 */ public void withdraw(double amount) { // 구현은 나중에 함 (implementation filled in later ) } 15

16 강원대학교 16

17 강원대학교 17

18 강원대학교 클래스 설계 순서 1. 클래스의 공개 인터페이스 설계 2. 메소드 선언 ( 메소드 사용 사례를 적어 봄 ) 3. 구성자 선언 4. 주석 기입 및 API 문서 제작 5. 필드 선언 6. 메소드 구현 7. 테스트 18

19 강원대학교 Fields public class BankAccount { private double balance; // 인스턴스 필드 public BankAccount() {... } public BankAccount(double initialBalance) {... } public void deposit(double amount) {... } public void withdraw(double amount) {... } public double getBalance() {...} } 19

20 강원대학교 Instance Instance of a class = an object of the class 철수, 영희는 사람 클래스의 인스턴스이다. 메리, 독구, 쫑은 개 클래스의 인스턴스이다. 철수, 영희, 메리, 독구, 쫑은 모두 객체이다. 20

21 강원대학교 클래스 설계 순서 1. 클래스의 공개 인터페이스 설계 2. 메소드 선언 ( 메소드 사용 사례를 적어 봄 ) 3. 구성자 선언 4. 주석 기입 및 API 문서 제작 5. 필드 선언 6. 메소드 구현 7. 테스트 21

22 강원대학교 메소드 구현 Some methods do not return a value Some methods return an output value public void withdraw(double amount) { double newBalance = balance - amount; balance = newBalance; } public double getBalance() { return balance; } 22

23 강원대학교 인자와 매개변수 (arguments and parameters) public class BankAccount { private double balance; public void deposit(double amount) { double newBalance = balance + amount; balance = newBalance; } } BankAccount harrysChecking = new BankAccount(); harrysChecking.deposit(3000.0); BankTester 클래스의 main 메소드 파라미터 인자 (argument) call-by-value ( 값 복사 ) 0.0 3000. 0 메소드 선언 메소드 활용 23

24 강원대학교 구성자 (constructor) 구현 public BankAccount() { balance = 0.0; } public BankAccount(double initialBalance) { balance = initialBalance; } BankAccount harrysChecking = new BankAccount(1000.0); BankAccount marysChecking = new BankAccount(); 1000.00.0 harrysCheckingmarysChecking 24

25 완성된 BankAccount 클래스 강원대학교 25

26 강원대학교 File BankAccount.java 01: /** 02: A bank account has a balance that can be changed by 03: deposits and withdrawals. 04: */ 05: public class BankAccount 06: { 07: /** 08: Constructs a bank account with a zero balance. 09: */ 10: public BankAccount() 11: { 12: balance = 0; 13: } 14: 15: /** 16: Constructs a bank account with a given balance. 17: @param initialBalance the initial balance 18: */ 26

27 강원대학교 File BankAccount.java 19: public BankAccount(double initialBalance) 20: { 21: balance = initialBalance; 22: } 23: 24: /** 25: Deposits money into the bank account. 26: @param amount the amount to deposit 27: */ 28: public void deposit(double amount) 29: { 30: double newBalance = balance + amount; 31: balance = newBalance; 32: } 33: 34: /** 35: Withdraws money from the bank account. 36: @param amount the amount to withdraw 27

28 강원대학교 File BankAccount.java 37: */ 38: public void withdraw(double amount) 39: { 40: double newBalance = balance - amount; 41: balance = newBalance; 42: } 43: 44: /** 45: Gets the current balance of the bank account. 46: @return the current balance 47: */ 48: public double getBalance() 49: { 50: return balance; 51: } 52: 53: private double balance; 54: } 28

29 강원대학교 클래스 설계 순서 1. 클래스의 공개 인터페이스 설계 2. 메소드 선언 ( 메소드 사용 사례를 적어 봄 ) 3. 구성자 선언 4. 주석 기입 및 API 문서 제작 5. 필드 선언 6. 메소드 구현 7. 테스트 29

30 강원대학교 Testing a Class BlueJ 와 같은 도구를 이용 main 메소드가 들어 있는 Test 클래스를 작성 30

31 강원대학교 Testing with Bluej 31

32 강원대학교 File BankAccountTester.java 01: /** 02: A class to test the BankAccount class. 03: */ 04: public class BankAccountTester 05: { 06: /** 07: Tests the methods of the BankAccount class. 08: @param args not used 09: */ 10: public static void main(String[] args) 11: { 12: BankAccount harrysChecking = new BankAccount(); 13: harrysChecking.deposit(2000.0); 14: harrysChecking.withdraw(500.0); 15: System.out.println(harrysChecking.getBalance()); 16: } 17: } 32

33 정리 강원대학교 33

34 강원대학교 클래스 선언문 구성 class ClassName { fields methods nested classes and interfaces } 클래스 멤버 class 앞에 public 을 붙일 수 있다. 이 경우 세상 누구나 이 클래스를 사용할 수 있다는 의미 public 이 없으면 같은 패키지 내에서만 사용할 수 있다. 34

35 강원대학교 Fields 필드 변수 선언 – 타입과 변수이름을 적어줌 int i; // i 는 int 타입 변수임 Student s; // s 는 Student 타입 레퍼런스 변수임 – 선언과 함께 초기값을 정해줄 수도 있음 int i = 4; Student s = new Student(); 35

36 강원대학교 필드와 메소드 public class Box { private int length, width, height; public void setLength(int p) {length=p;} public void setWidth(int p) {width=p;} public void setHeight(int p) {height=p;} public int displayVolume() {System.out.println(length*width*height);} } Length Width height Box 인스턴스 메소드 36 객체데이터 ( 상태변수 )

37 강원대학교 Categories of Variables Fields ( 인스턴스 필드 ) Local variables ( 지역변수 ) Parameter ( 파라미터 ) public class BankAccount { private double balance; public void deposit(double amount) { double newBalance = balance + amount; balance = newBalance; } } 메소드에 속하며 메소드가 실행되는 동안에만 존재함 37

38 메소드를 구현할 때 파라미터 수를 미리 정하지 않을 수도 있다 (variable number of parameters) 강원대학교 38

39 가변수 파라미터 함수 (variable number of parameters) class Adder public int add(int... values) Adder adder = new Adder(); adder.add(1, 3, 7); adder.add(1, 2); adder.add(1, 3, 7, 8); 강원대학교 39

40 가변수 파라미터 함수의 구현 (variable number of parameters) class Adder public int add(int... values) { int sum = 0; for (int i = 0; i < values.length; i++) sum += values[i]; return sum; } 강원대학교 40

41 지역변수의 영역 강원대학교 41

42 강원대학교 지역변수의 영역 (Scope of a local variable) 지역변수의 영역 – 변수가 선언된 부분부터 변수가 포함되어 있는 블록의 끝까지 42

43 강원대학교 Scope of Local Variables 지역변수의 scope 내에는 같은 이름의 지역변수 가 있을 수 없다. Rectangle r = new Rectangle(5, 10, 20, 30); if (x >= 0) { double r = Math.sqrt(x); // Error–can't declare another variable called r here... } 43

44 강원대학교 Scope of Local Variables Scope 가 겹치지 않는다면 같은 이름의 지역변수 를 사용할 수 있다. if (x >= 0) { double r = Math.sqrt(x);... } // Scope of r ends here else { Rectangle r = new Rectangle(5, 10, 20, 30); // OK–it is legal to declare another r here... } 44

45 강원대학교 Overlapping Scope 지역변수와 필드가 같은 이름을 가질 때는 지역변 수가 필드를 가린다 (shadow). public class Coin {... public double getExchangeValue(double exchangeRate) { double value; // Local variable... return value; } private String name; private double value; // Field with the same name } 45

46 강원대학교 Overlapping Scope 가려진 필드에 접근하는 방법 – this 사용 public Coin(double value, String name) { this.value = value; this.name = name; } private String name; private double value; 46

47 기타 강원대학교 47

48 강원대학교 부울 타입 변수 Just use the simpler test if (married == true)... // Don't if (married)... 48

49 강원대학교 주의 if (0 < amount < 1000) … // 오류 if (0< amount && amount < 1000) … if (ch == ‘S’ || ‘M’) … // 오류 if (ch == ‘S’ || ch == ‘M’) … 49

50 강원대학교 Q 나 q 가 입력될 때까지 입력을 복창하는 루프 Scanner in = new Scanner(System.in) boolean done = false; while (!done) { System.out.print("Enter value, Q to quit: "); String input = in.next(); if (input.equalsIgnoreCase("Q")) done = true; else { System.out.println(input); } } 50

51 강원대학교 중간에서 완료여부를 판단하는 루프 boolean done = false; while (!done) { Print prompt String input = read input; if (end of input indicated) done = true; else { // Process input } } 51

52 강원대학교 초계값 (Sentinel Values) Sentinel value: 데이터 세트의 끝을 표시하는 값 System.out.print("Enter value, Q to quit: "); String input = in.next(); if (input.equalsIgnoreCase("Q")) We are done else { double x = Double.parseDouble(input);... } String 을 double 타입으로 변환해주는 메소드 52

53 강원대학교 같은 클래스 객체간에도 상호작용이 있을 수 있다. 53

54 강원대학교 54 10000 BankAccount 계좌이체 (transfer) 300 700300 BankAccount

55 강원대학교 public class BankAccount { public BankAccount() public BankAccount(double initialBalance) public void deposit(double amount) public void withdraw(double amount) public void transfer(double amount, BankAccount other) public double getBalance() private double balance; } BankAccount kims, moms; kims = new BankAccount(); moms = new BankAccount(1000.0); moms.deposit(2000.0); moms.transfer(500.0, kims); System.out.println(moms.getBalance()); System.out.println(kims.getBalance()); 1000 moms 0 0 kims 55 3000 0 0 2500 500

56 강원대학교 public class BankAccount { public void deposit(double amount) { double newBalance = balance + amount; balance = newBalance; } public void withdraw(double amount){...} public void transfer(double amount, BankAccount other) { withdraw(amount); other.deposit(amount); } private double balance; } BankAccount kims, moms; kims = new BankAccount(); moms = new BankAccount(1000.0); moms.deposit(2000.0); moms.transfer(500.0, kims); System.out.println(moms.getBalance()); System.out.println(kims.getBalance()); momskims 56

57 강원대학교 public class BankAccount { public void deposit(double amount) { double newBalance = balance + amount; balance = newBalance; } public void withdraw(double amount){...} public void transfer(double amount, BankAccount other) { withdraw(amount); // 객체 자신에게 메소드를 호출할 때는 // 메소드 이름만 적어주면 됨 (this 생략 !) other.deposit(amount); // 다른 객체에게 메소드를 호출할 때는 // 그 객체를 가리키는 레퍼런스를 // 적어 주어야 함 } private double balance; } 57

58 강원대학교 public class BankAccount { public void deposit(double amount) { double newBalance = balance + amount; balance = newBalance; } public void transfer(double amount, BankAccount other) { this.withdraw(amount) other.deposit(amount); } private double balance; } BankAccount kims, moms; kims = new BankAccount(); moms = new BankAccount(1000.0); moms.deposit(2000.0); moms.transfer(500.0, kims); System.out.println(moms.getBalance()); System.out.println(kims.getBalance()); momskims 58

59 구성자에서 구성자 호출하기 강원대학교 59

60 강원대학교 public BankAccount() { balance = 0; } public BankAccount(double initialBalance) { balance = initialBalance; } public BankAccount() { this(0); } public BankAccount(double initialBalance) { balance = initialBalance; } 60

61 인스턴스 멤버와 클래스 멤버 강원대학교 61

62 인스턴스 필드와 클래스 필드 인스턴스 필드 : 인스턴스마다 존재하는 필드 클래스 필드 : 클래스 공통으로 하나만 존재하는 필드 – 클래스 필드를 선언할 때는 static 으로 선언한다. public class BankAccount{ private double balance; private int accountNumber; private static int numberOfAccounts = 0; } 강원대학교 62

63 강원대학교 public class BankAccount{ private double balance; private int accountNumber; private static int numberOfAccounts = 0; public BankAccount(double initialBalance){ balance = initialBalance; // increment number of Accounts and assign account number accountNumber = ++numberOfAccounts; } public int getAccountNumber() { return accountNumber; } BankAccount numberOfAccounts: 0 63 클래스

64 강원대학교 public class BankAccount { private double balance; private int accountNumber; private static int numberOfAccounts = 0; public BankAccount(double initialBalance){ balance = initialBalance; accountNumber = ++numberOfAccounts; } BankAccount b1 = new BankAccount(100.0); BankAccount numberOfAccounts: 1 balance: 100.0 accountNumber: 1 b1 64 클래스

65 강원대학교 public class BankAccount { private double balance; private int accountNumber; private static int numberOfAccounts = 0; public BankAccount(double initialBalance){ balance = initialBalance; accountNumber = ++numberOfAccounts; } BankAccount b1 = new BankAccount(100.0); BankAccount b2 = new BankAccount(200.0); BankAccount numberOfAccounts: 2 balance: 100.0 accountNumber: 1 b1 balance: 200.0 accountNumber: 2 b2 65

66 강원대학교 클래스 메소드 메소드를 static 르로 선언하면 그 메소드는 개별 객체에 작용하지 않 는다는 의미 Static 메소드는 아래와 같은 형식으로 호출 ClassName. methodName(parameters) Math 클래스 메소드들은 대부분 static 메소드 66

67 강원대학교 The Math class (-b + Math.sqrt(b*b - 4*a*c)) / (2*a) 67

68 강원대학교 Mathematical Methods in Java Math.sqrt(x) square root Math.pow(x, y) power x y Math.exp(x) exex Math.log(x) natural log Math.sin(x), Math.cos(x), Math.tan(x) sine, cosine, tangent (x in radian) Math.round(x) closest integer to x Math.min(x, y), Math.max(x, y) minimum, maximum 68

69 강원대학교 69 double r = Math.random(); Random generator = new Random(); double r = generator.nextDouble();

70 public class BankAccount { private double balance; private int accountNumber; private static int numberOfAccounts = 0; public BankAccount(double initialBalance) { balance = initialBalance; accountNumber = ++numberOfAccounts; } public void deposit(double amount) {balance = balance + amount;} public void withdraw(double amount) {balance = balance – amount;} public static int getNumberOfAccounts() {return numberOfAccounts;} public static void main(String[] args) { deposit(100.0);  ------- 에러 ! BankAccount account = new BankAccount(100.0); account.deposit(100.0); // OK! System.out.println(BankAccount.getNumberOfAccounts()); } 강원대학교 70

71 public class Adder { public int add(int a, int b) { return a + b; } public static void main(String[] args) { System.out.println(add(1, 2));// error! } Cannot make a static reference to the non-static method add(int, int) from the type Adder 강원대학교 71

72 public class Adder { public int add(int a, int b) { return a + b; } public static void main(String[] args) { Adder adder = new Adder(); System.out.println(adder.add(1, 2));// OK! } 강원대학교 72

73 public class Adder { public static int add(int a, int b) { return a + b; } public static void main(String[] args) { System.out.println(Adder.add(1, 2));// OK! } 강원대학교 73

74 public class Adder { public static int add(int a, int b) { return a + b; } public static void main(String[] args) { System.out.println(Adder.add(1, 2));// OK! System.out.println(add(1, 2)); // OK! // 클래스 내부에서는 // 클래스이름 생략 가능 ! } 강원대학교 74

75 강원대학교 static final Constants( 상수 ) static final constant 는 다른 클래스에 의해 주로 사 용됨 static final constant 예 public class Math {... public static final double E = 2.7182818284590452354; public static final double PI = 3.14159265358979323846; } double circumference = Math.PI * diameter; // Math 클래스 밖에서 사용 75

76 강원대학교 Converting between Strings and Numbers Convert to number: Convert to string: String str = “35”; String xstr = “12.3”; int n = Integer.parseInt(str); double x = Double.parseDouble(xstr); int n = 10; String str = "" + n; str = Integer.toString(n); 76

77 강원대학교 Scanner scanner = new Scanner(System.in); String id = scanner.next(); if (id.matches("[a-z]"))... if (id.matches("a.c"))...// 문자 하나 if (id.matches("a*c"))...// a 가 0 개 이상 if (id.matches("a+c"))...// a 가 1 개 이상 if (id.matches("a?c"))...// a 가 0 혹은 1 개 if (id.matches("a.*c"))...// 문자가 0 개 이상 정규식 (regular expression) 입력 값을 검사하는 법 77

78 강원대학교 Color c = panel.getBackground(); if(c.equals(Color.black))... if(panel.getBackground().equals(Color.black))... 이렇게 써도 된다. 78 Color 클래스의 static field Color 객체

79 강원대학교 경과 시간 측정하는 법 long start = System.currentTimeMillis();.... long duration = System.currentTimeMillis()-start; 79

80 코드 실행시간 측정법 class TimeTest1 { public static void main(String[] args) { long startTime = System.currentTimeMillis(); long total = 0; for (int i = 0; i < 10000000; i++) { total += i; } long stopTime = System.currentTimeMillis(); long elapsedTime = stopTime - startTime; System.out.println(elapsedTime); } 강원대학교 80

81 강원대학교 Wrappers 81

82 강원대학교 Wrapper 인스턴스 82

83 강원대학교 자동포장기능 (Auto-boxing) 기본 데이터타입과 wrapper 클래스 간 자동 변환 Double d = new Double(29.95); // 기존 방법 Double d = 29.95; // auto-boxing double x = d.doubleValue(); // 기존 방법 double x = d; // auto-unboxing 83

84 강원대학교 Package Names and Locating Classes Use packages to avoid name clashes 패키지 이름은 혼동되지 않도록 정해야 한다. 권고 : 도메인 네임을 역순으로 사용 edu.sjsu.cs.walters: for Walters' classes (walters@cs.sjsu.edu) java.util.Timer vs. javax.swing.Timer 84

85 강원대학교 Base Directories and Subdirectories for Packages com.horstmann.bigjava.Nemeric 85

86 강원대학교 Package Names and Locating Classes 소스 파일의 path name 은 package name 에 대응되도록 해 주어야 한 다. 기준 위치 (base directory) 는 classpath 환경변수에 지정해 준다. 기준위치에서 컴파일, 실행 등 작업을 할 때에는 classpath 를 설정해 주지 않아도 된다. com/horstmann/bigjava/Financial.java export CLASSPATH=/home/walters:. set CLASSPATH=c:\home\walters;. com.horstmann.bigjava.Nemeric 86

87 강원대학교 패키지를 사용한 프로그래밍 패키지명 결정 kr.ac.kangwon.ckjeong.homework1 기본 디렉토리 ( 기준 위치 ) 설정 mkdir c:\oop 기본 디렉토리 안에 패키지명과 일치하는 서브디렉토리를 만듦 cd c:\oop mkdir kr mkdir kr\ac mkdir kr\ac\kangwon mkdir kr\ac\kangwon\ckjeong mkdir kr\ac\kangwon\ckjeong\homework1 87

88 강원대학교 패키지를 사용한 프로그래밍 소스 파일을 맨 아래 디렉토리에 작성 c:\oop\kr\ac\kangwon\ckjeong\homework1\Test.java 소스 파일에 package 문장 삽입 package kr.ac.kangwon.ckjeong.homework1 기본 디렉토리에서 소스 파일 컴파일 cd c:\oop javac kr\ac\kangwon\ckjeong\homework1\Test.java 기본 디렉토리에서 프로그램 실행 java kr.ac.kangwon.ckjeong.homework1.Test 파일 이름 클래스 이름 88


Download ppt "강원대학교 3 클래스 구현 1. 강원대학교 클래스 구현 순서 1. 클래스의 공개 인터페이스 설계 2. 메소드 선언 ( 메소드 사용 사례를 적어 봄 ) 3. 구성자 선언 4. 주석 기입 및 API 문서 제작 5. 필드 선언 6. 메소드 구현 7. 테스트 2."

Similar presentations


Ads by Google