자바프로그래밍 제 4 주 클래스 설계 2

1 / 54

# 자바프로그래밍 제 4 주 클래스 설계 2 - PowerPoint PPT Presentation

자바프로그래밍 제 4 주 클래스 설계 2. 객체 자신에게 메소드 호출하기 vs 다른 객체에게 메소드 호출하기. public class BankAccount { public BankAccount () public BankAccount (double initialBalance ) public void deposit(double amount) public void withdraw(double amount )

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.

## PowerPoint Slideshow about '자바프로그래밍 제 4 주 클래스 설계 2' - konane

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

강원대학교

### 객체 자신에게 메소드 호출하기vs다른 객체에게 메소드 호출하기

강원대학교

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;

}

BankAccountkims, 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());

moms

kims

강원대학교

public class BankAccount{public void deposit(double amount)

{

double newBalance = balance + amount;

balance = newBalance;

}

private double balance;

}

BankAccountkims, 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());

moms

kims

강원대학교

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;

}

BankAccountkims, 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());

moms

kims

강원대학교

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;

}

BankAccountkims, 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());

moms

kims

강원대학교

class Account {

private double balance = 0.0;

final double BONUS_RATE = 0.01;

public void deposit(double amount) {

balance = amount + calculateBonus(amount);

// 혹은 balance = amount + this.calculateBonus(amount);

}

public double getBalance() {

return balance;

}

double calculateBonus(double amount){

return amount*BONUS_RATE;

}

}

강원대학교

### 구성자에서구성자 호출하기

강원대학교

public BankAccount(){ balance = 0;}public BankAccount(double initialBalance){ balance = initialBalance;}

public BankAccount(){this(0);}public BankAccount(double initialBalance){ balance = initialBalance;}

강원대학교

### 인스턴스 멤버와 클래스 멤버

강원대학교

인스턴스 변수와 클래스 변수
• 인스턴스 변수: 인스턴스마다 존재하는 변수
• 클래스 변수: 클래스 공통으로 하나만 존재하는 변수

public class BankAccount{

private double balance;

private int accountNumber;

private static int numberOfAccounts = 0;

}

강원대학교

인스턴스 변수와 클래스 변수
• 인스턴스 변수: 인스턴스마다 존재하는 변수
• 클래스 변수: 클래스 공통으로 하나만 존재하는 변수

public class BankAccount{

private double balance;

private int accountNumber;

private static int numberOfAccounts = 0;

}

강원대학교

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

강원대학교

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);

balance: 100.0

accountNumber: 1

BankAccount

numberOfAccounts: 1

b1

강원대학교

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);

balance: 100.0

accountNumber: 1

b1

BankAccount

numberOfAccounts: 0

balance: 200.0

accountNumber: 2

b2

강원대학교

클래스 변수에접근하는 법

public class BankAccount{

double balance;

int accountNumber;

static int numberOfAccounts = 0;

}

BankAccount b1 = new BankAccount(100.0);

// 인스턴스변수에는 레퍼런스를 통해 접근

System.out.println(b1.balance);

// 클래스변수에는 클래스이름을 통해 접근

System.out.println(BankAccount.numberOfAccounts);

강원대학교

클래스메소드
• static 키워드가 메소드 앞에 붙으면 그 메소드는 개별 객체에 작용하지 않는다는 의미
• Static 메소드는 아래와 같은 형식으로 호출

ClassName. methodName(parameters)

• Math 클래스 메소드들은 대부분 static 메소드

강원대학교

The Math class

(-b + Math.sqrt(b*b - 4*a*c)) / (2*a)

강원대학교

맥락에 맞게 사용해야 함
• 인스턴스 메소드에서 인스턴스 변수와 인스턴스 메소드에 직접 접근 가능
• 인스턴스 메소드에서 클래스 변수와 클래스 메소드에 직접 접근 가능
• 클래스 메소드에서 클래스 변수와 클래스 메소드에 직접 접근 가능
• 클래스 메소드에서 인스턴스 변수와 인스턴스 메소드에 직접 접근 불가능

강원대학교

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 = amount + amount;}

public void withdraw(double amount) { balance = balance – amount;}

public static int getNumberOfAccounts() {return numberOfAccounts;}

public static void main(String[] args) {

BankAccount account = new BankAccount(100.0);

account.deposit(100.0);

withdraw(100.0); -------

System.out.println(BankAccount.getNumberOfAccounts());

}

}

강원대학교

public int add(int a, int b)

{

return a + b;

}

public static void main(String[] args) {

}

}

Cannot make a static reference to the non-static method add(int, int) from the type Adder

강원대학교

public int add(int a, int b)

{

return a + b;

}

public static void main(String[] args) {

}

}

강원대학교

public static int add(int a, int b)

{

return a + b;

}

public static void main(String[] args) {

}

}

강원대학교

public static int add(int a, int b)

{

return a + b;

}

public static void main(String[] args) {

System.out.println(add(1, 2)); // 같은 클래스 내

}

}

강원대학교

Constants(상수): static final
• 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 클래스 밖에서 사용

강원대학교

접근성
• private – 같은 클래서 내에서만 접근 가능
• (package) – 같은 패키지 내에서만 접근 가능
• protected – 같은 패키지, 혹은 서브클래스에서 접근 가능
• public – 누구나 접근 가능

강원대학교

클래스 멤버에의 접근성
• 외부로 노출시켜야 할 멤버는 public
• 내부 기능을 위한 멤버는 private
• 멤버: 메소드와 필드

(, inner classes and interfaces)

강원대학교

Fields에의 접근성
• 필드 변수에의 접근성(accessibility)

public inti; // 누구나 i에 접근할 수 있음

inti; // 같은 패키지 안에서 접근할 수 있음

private inti; // 같은 클래스 안에서만 접근할 수 있음

• 일반적으로 클래스 외부에서 클래스 내의 변수에 접근하는 것은 정보은닉 원칙에 어긋나므로 이를 허용하지 않도록 private로 선언

 필드 변수는 통상 private로 선언!

강원대학교

Fields
• public 클래스 필드에 직접 접근하려면 아래와 같이 할 수 있음

Student s = new Student();

System.out.println(s.name);

s.name = “배철수”;

class Studnent

{

public String name = “철수”; // 필드

}

이런 방법은 권장하지 않음

필드 변수는 private로 선언하고

필드 변수는 그 객체가 지원하는 메소드를 통해서 변경하는 것이 좋음

강원대학교

private instance field
• private instance field에는 해당 클래스 내에서만 접근 가능하다.

public class BankAccount

{private double balance;

public void deposit(double amount) {

double newBalance = balance + amount;balance = newBalance;}

}

BankAccount maryAccount = new BankAccount(5000);

maryAccount.balance = maryAccount.balance + 3000;

Tester:

컴파일 에러!

강원대학교

메소드에의 접근성
• 외부로 노출시켜야 할 메소드는 public
• 내부 기능을 위한 메소드는 private

강원대학교

class Account {

private double balance = 0.0;

final double BONUS_RATE = 0.01;

public void deposit(double amount) {

balance = amount + calculateBonus(amount);

}

public double getBalance() {

return balance;

}

// Account 내부에서만 사용되는 메소드

private double calculateBonus(double amount){

return amount*BONUS_RATE;

}

}

강원대학교

### 기타

강원대학교

String Concatenation(문자열 연결)
• Use the + operator:
• 문자열을 다른 값과 + 연산자로 연결하면 다른 값은 자동으로 문자열로 변환됨

String name = "Dave";String message = "Hello, " + name; // message is "Hello, Dave"

String a = "Agent";int n = 7;String bond = a + n; // bond is “Agent7”

강원대학교

Concatenation in Print Statements
• 아래 두 프로그램은 동일 결과

System.out.print("The total is ");System.out.println(total);

System.out.println("The total is " + total);

강원대학교

객체를 출력하면
• 객체에 toString() 메소드가 호출되고 그 반환값이 출력됨
• 객체를 문자열과 + 연산자로 연결하면
• 객체에 toString() 메소드가 호출되고 그 반환값이 문자열과 연결됨

Rectangle r = new Rectangle();

System.out.println(r);

// java.awt.Rectangle[x=0,y=0,width=0,height=0]

Rectangle r = new Rectangle();

String s = r + "";

System.out.println(s);

// java.awt.Rectangle[x=0,y=0,width=0,height=0]

강원대학교

Strings and Numbers
• Number (integer의 경우)

12 = 0000 000C (0000 0000 0000 0000 0000 0000 0000 1100)1024 = 0000 0400 (0000 0000 0000 0000 0000 0100 0000 0000)

1048576 = 0100 0000 (0000 0000 0001 0000 0000 0100 0000 0000)

• String

"12" = 0031 0032

"1024" = 0030 0030 0032 0034

"1048576" = 0031 0030 0034 0038 0035 0037 0036

강원대학교

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);

강원대학교

Substrings
• String 클래스의 메소드

String greeting = "Hello, World!";String sub = greeting.substring(0, 5); // sub is "Hello"

inclusive exclusive

강원대학교

• Scanner 인스턴스를 만들고 이 객체에 적절한 입력 메소드 호출
• next reads a word (until any white space)
• nextLine reads a line (until user hits Enter)

Scanner in = new Scanner(System.in);System.out.print("Enter quantity: ");int quantity = in.next();

강원대학교

객체를 생성하기 위해서는 키워드 new 생성자를 사용

Rectangle r = new Rectangle(1, 1, 2, 3);

• 그러나 String 객체만은 예외적으로

String s = "스트링“

과 같이 간편하게 생성하는 것도 가능

• 특수문자

new line –"\n"

탭 – "\t"

따옴표 –"\""

강원대학교

입력 값을 검사하는 법

Scanner scanner = new Scanner(System.in);

String id = scanner.next();

if (id.matches("[12]")) ...

정규식 (regular expression)

[a-z]

강원대학교

이렇게 써도 된다.

Color c = panel.getBackground();

if(c.equals(Color.black)) ...

if(panel.getBackground().equals(Color.black)) ...

강원대학교

경과 시간 측정하는 법

long start = System.currentTimeMillis();

....

long duration = (System.currentTimeMillis()-start)/1000;

강원대학교

switch 문장 형식

switch (expr) { // expr는 정수나 char 등의 타입!

case c1:

statements // do these if expr == c1

break;

case c2:

statements // do these if expr == c2

break;

case c2:

case c3:

case c4: // Cases can simply fall thru.

statements // do these if expr == any of c's

break;

. . .

default:

statements // do these if expr != any above

}

강원대학교

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: }

강원대학교

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;

강원대학교