Transcript 강의 5

객체지향프로그래밍
제 5주 – 배열과 ArrayList
객체지향프로그래밍
강원대학교
1
기본데이터형의 배열
double[] data;
data = new double[10];
double[] data = new double[10];
data[0] = 1.0;
data[1] = 5.0;
data[2] = 7.3;
double d = data[2];
객체지향프로그래밍
강원대학교
2
객체의 배열
BankAccount[] accounts;
accounts = new BankAccount[10];
accounts[0] = new BankAccount(1000.0);
accounts[1] = new BankAccount(2000.0);
객체지향프로그래밍
강원대학교
3
객체지향프로그래밍
강원대학교
4
배열의 초기값
• 배열 타입에 따라 배열이 구성될 때 자동으로 저
장되는 초기값이 다름
– Numbers: 0
– Boolean: false
– Object References: null
객체지향프로그래밍
강원대학교
5
배열의 크기
• 배열의 크기를 알기 위해서는 length 필드를 읽음
– data.length
– 배열은 객체로 취급됨  배열은 인스턴스 필드를 가질
수 있음
– length는 메소드가 아니라 배열 객체의 필드이므로 괄
호를 붙이지 않음
• 인덱스는 0 부터 length - 1 까지
객체지향프로그래밍
강원대학교
6
배열 관련 흔한 오류
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만
// 선언하고 배열객체는 만들지 않았음
객체지향프로그래밍
강원대학교
7
코드 예
double[] values = new duble[10];
for (int i = 0; i < values.length; i++)
values[i] = i * i;
객체지향프로그래밍
강원대학교
8
ArrayList 클래스
• 배열과 비슷하나 아래와 같은 차이가 있음
– 필요에 따라 자동으로 커지거나 작아짐
– ArrayList 클래스는 삽입 (insert), 삭제
(remove) 등의 메소드를 지원함
객체지향프로그래밍
강원대학교
9
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)
• 필요에 따라 자동으로 크기가 정해짐
객체지향프로그래밍
강원대학교
10
배열리스트 내의 객체를 읽는 법
• get 메소드 사용
• 인덱스는 0부터 시작
BankAccount anAccount = accounts.get(2);
// gets the third element of the array list
객체를 배열리스트에서 제거하는 것은 아님!
accounts
anAccount
객체지향프로그래밍
강원대학교
11
배열리스트 내의 객체를 읽는 법
• size() 메소드는 배열리스트 내 객체의 수를
반환함
• 인덱스가 범위를 벗어나면 bounds error
int i = accounts.size();
anAccount = accounts.get(i); // Error
// legal index values are 0. . .i-1
객체지향프로그래밍
강원대학교
12
배열리스트에 객체를 넣는 법
• set: 기존 값 엎어쓰기
BankAccount anAccount = new BankAccount(1729);
accounts.set(2, anAccount);
• add: 값 추가하기
accounts.add(i, a)
boolean add(E o)
o를 리스트 끝에 추가
void add(int index, E element)
element를 index 위치에 삽입 (이후 객체들은 뒤로 밀림)
객체지향프로그래밍
강원대학교
13
배열리스트에서 객체를 삭제하는 법
Accounts.remove(i)
객체지향프로그래밍
강원대학교
14
래퍼 (Wrappers)
• ArrayList는 객체만을 저장함
• 기본형 데이터는 ArrayList에 저장할 수 없음
• 여덟 가지 각 기본형 데이터에는 그에 대응되는
wrapper 클래스가 있음
객체지향프로그래밍
강원대학교
15
Wrappers
객체지향프로그래밍
강원대학교
16
Wrapper 인스턴스
객체지향프로그래밍
강원대학교
17
자동포장기능 (Auto-boxing)
• 기본 데이터타입과 wrapper 클래스 간 자동 변
환
Double d = new Double(29.95); // 기존 방법
Double d = 29.95; // auto-boxing
double x = d.doubleValue(); // 기존 방법
double x = d; // auto-unboxing
객체지향프로그래밍
강원대학교
18
자동포장기능 (Auto-boxing)
Double d = new Double(3.1);
Double e = d + 1.0;
① d의 포장을 벗겨 double 타입으로 만듦
② 1을 더함
③ 결과를 Double 타입 객체로 포장
④ 레퍼런스를 e가 포장된 Double 타입 객체를
가리키도록 함
객체지향프로그래밍
강원대학교
19
배열리스트 조작에서의 자동포장
• ArrayList는 객체만을 저장함
• 기본형 데이터는 ArrayList에 저장할 수 없음
• 기본형 데이터를 ArrayList에 넣으려고 하면
auto-boxing이 일어남
ArrayList<Double> data = new ArrayList<Double>();
data.add(29.95); // auto-boxing
double x = data.get(0); // auto-unboxing
객체지향프로그래밍
강원대학교
20
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;
}
객체지향프로그래밍
강원대학교
21
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();
}
객체지향프로그래밍
강원대학교
22
간단한 배열 조작 알고리즘
• 일치하는 횟수 세기
• 특정값 찾기
• 최소값 혹은 최대값 찾기
• 교과서 8.5절 샘플 코드 참고
객체지향프로그래밍
강원대학교
23
2차원 배열 (Two-Dimensional Arrays)
final int ROWS = 3;
final int COLUMNS = 3;
String[][] board = new String[ROWS][COLUMNS];
board[i][j] = "x";
for (int i = 0; i < ROWS; i++)
for (int j = 0; j < COLUMNS; j++)
board[i][j] = " ";
객체지향프로그래밍
강원대학교
24
배열의 복사 (Copying Arrays)
double[] data = new double[10];
// fill array . . .
double[] prices = data;
객체지향프로그래밍
강원대학교
25
배열의 복사 (Copying Arrays)
double[] prices = (double[]) data.clone();
객체지향프로그래밍
강원대학교
26
여러개의 기본 타입 배열 대신 객체
의 배열을 사용함
•
// 이렇게 하지 마시오!
int[] accountNumbers;
double[] balances;
객체지향프로그래밍
강원대학교
27
여러개의 기본 타입 배열 대신 객체
의 배열을 사용함
BankAccount[] accounts;
객체지향프로그래밍
강원대학교
28
참고: 가변수 파라미터 함수
(variable number of parameters)
class Adder
public int add(int... values)
Adder adder = new Adder();
adder.add(1, 3, 7);
adder.add(1, 2);
객체지향프로그래밍
강원대학교
29
참고: 가변수 파라미터 함수
(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;
}
객체지향프로그래밍
강원대학교
30
지역변수의 영역
(Scope of Local Variables)
변수의 영역 (Scope of variable):
– 프로그램의 일부분
– 이 부분에서만 그 변수를 사용할 수 있음
지역변수의 영역 (Scope of a local variable):
– 변수가 선언된 부분부터 변수가 포함되어 있
는 블록의 끝까지
객체지향프로그래밍
강원대학교
31
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
. . .
}
객체지향프로그래밍
강원대학교
32
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
. . .
}
객체지향프로그래밍
강원대학교
33
Scope of Class Members
• Private 멤버는 class scope를 갖는다.
– 클래스 내의 어떤 메소드에서건 클래스 멤버
를 사용할 수 있다.
• 클래스 밖에서 public member를 사용하려면 어
떤 멤버를 사용할 것인지 명확히 지정해야 한다.
Math.sqrt() // static member의 경우
harrysChecking.getBalance() // instance member의 경우
객체지향프로그래밍
강원대학교
34
Scope of Class Members
• 메소드 내에서 필드 혹은 메소드 이름만 적어주
면 this를 붙여 준 것과 같다. 즉 현재 메소드를
실행하고 있는 객체에게 메소드를 호출한 셈이
다.
public class BankAccount
{
public void transfer(double amount, BankAccount other)
{
withdraw(amount); // i.e., this.withdraw(amount);
other.deposit(amount);
}
...
}
객체지향프로그래밍
강원대학교
35
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
}
객체지향프로그래밍
강원대학교
36
Overlapping Scope
• 가려진 필드에 접근하는 방법 – this 사용
public Coin(double value, String name)
{
this.value = value;
this.name = name;
}
private String name;
private double value;
객체지향프로그래밍
강원대학교
37
Importing Packages
• Can always use class without importing
java.util.Scanner in = new java.util.Scanner(System.in);
• Tedious to use fully qualified name
• Import lets you use shorter class name
import java.util.Scanner;
. . .
Scanner in = new Scanner(System.in)
객체지향프로그래밍
강원대학교
38
Importing Packages
• Can import all classes in a package
import java.util.*;
• Never need to import java.lang
• 같은 패키지 내에 있는 클래스는 import하지 않
고도 사용할 수 있다.
객체지향프로그래밍
강원대학교
39
Package Names and Locating
Classes
• Use packages to avoid name clashes
java.util.Timer vs. javax.swing.Timer
• 패키지 이름은 혼동되지 않도록 정해야 한다.
• 권고: 도메인 네임을 역순으로 사용
edu.sjsu.cs.walters: for Walters' classes
([email protected])
객체지향프로그래밍
강원대학교
40
Base Directories and
Subdirectories for Packages
com.horstmann.bigjava.Nemeric
객체지향프로그래밍
강원대학교
41
Package Names and Locating
Classes
• 소스 파일의 path name은 package name에 대응되도록 해 주어야
한다.
com.horstmann.bigjava.Nemeric
com/horstmann/bigjava/Financial.java
• 기준 위치(base directory)는 classpath 환경변수에 지정해 준다.
export CLASSPATH=/home/walters:.
set CLASSPATH=c:\home\walters;.
• 기준위치에서 컴파일, 실행 등 작업을 할 때에는 classpath를 설정
해 주지 않아도 된다.
객체지향프로그래밍
강원대학교
42
패키지를 사용한 프로그래밍
• 패키지명 결정
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
객체지향프로그래밍
강원대학교
43
패키지를 사용한 프로그래밍
• 소스 파일을 맨 아래 디렉토리에 작성
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
파일 이름
클래스 이름
객체지향프로그래밍
강원대학교
44