6. 클래스와 객체
들어가며
Q: 축구 게임에서 먼저 공격하는 팀을 정하기 위해 동전을 던진다. 우리는 동전을 던질 때 앞면이 나오느냐 아니면 뒷면이 나오느냐에만 관심이 있다. 또한 동전을 가지고 해야 할 일은 동전을 던지는 것과 동전을 던진 후 결과를 알면 된다.
이 동전을 효과적으로 나타낼 수 있는 방법을 기술하라.
A:
클래스와 객체
• 객체(object): 우리 주변의 어떤 대상의 모델이다.
- 예: 학생, 예금계좌, 자동차, 고객
• 객체 = 데이터(data) + 연산(operation)
- 예: 예금계좌
- 데이터: 예금주, 계좌번호, 잔고
- 연산: 입금한다, 출금한다, 잔고 확인한다, 계좌이체한다
• 클래스(class)는 객체가 생성되는 틀, 원형 혹은 청사진이다. 객체는 클래스에 의해 정의된다.
• 객체는 클래스의 실례(instance)이다.
예: 클래스와 객체
질문: 클래스와 객체의 다른 예는?
예: 클래스와 객체
은행계좌
클래스 (개념)
갑돌의 은행계좌 잔고: 825,000
(실현) 객체
갑순의 은행계좌 잔고: 350,000 지우의 은행계좌
잔고: 70,000
같은 클래스로부터
여러 객체들
클래스와 객체
클래스: - 객체의 형태를 기술한다.
- 틀, 원형(template), 혹은 청사진 - 변수(데이터 표현), 연산, 그리고 상속
객체: - 클래스의 한 실례(instance) - 모든 객체 변수의 고유한 복사본을 가진다
이름 짓기 관례:
클래스: 이름내의 각 단어의 첫 자는 대문자로 시작 예: NeuralNetwork
객체: 이름내의 첫 단어의 첫 자는 소문자로 시작하고 다른 단어의
클래스와 그 클래스의 객체사이의 차이는
데이터 형과 그 형의 변수사이의 차이와 유사
핵심 개념
객체 지향 프로그래밍
(Object Oriented Programming)
• 구조 프로그래밍(structured
programming)의 강력한 대안이다.
• 구조 프로그래밍은 주어진 문제를 풀기 위해 데이터 구조들을 설계하고 그
구조들을 함수들(functions)로 처리한다.
• 기본 아이디어 : 모든 적절한 데이터와 그
데이터를 읽거나 수정하는 메소드들을
포함하는 클래스들을 설계한다.
객체 지향 프로그래밍이란?
1. 주어진 문제를 보고 필요한 객체들을 인식하고 이들을 클래스들로 모델한다 .
2. 필요한 클래스들의 일부가 이미 만들어져 있 다 면 그 클 래 스 들 을 부 품 과 같 이 사 용 한 다 . 나 머 지 클 래 스 들 은 새 로 작성한다.
3. 새로 작성하는 클래스들 사이에 유사성이 있다면 한 클래스를 또 다른 클래스에 기초하여 만든다.
4. 부품들을 조립하여 완성품을 만드는 것과
같 이 클 래 스 들 을 모 아 서 프 로 그 램 을
완성한다.
메시지와 메소드
• 객체지향 프로그램은 상호작용하는 객체들로 구성된다.
• 어떤 객체가 다른 객체에게 어떤 일을 수행하도록 명령하기 위해서 우리는 그 객체에 메시지를 보내야 한다. 이때
메시지는 메소드 호출에 해당한다.
• 한 객체가 메시지를 처리하기 위해서는
그것에 대응하는 메소드가 있어야 한다.
클래스
• 클래스는 데이터를 나타내는 변수 선언문(들)과 연산(들)을 나타내는 메소드 정의(들)을 포함한다.
int x, y;
char ch; 변수 선언문
메소드 정의
클래스의 구조
• 클래스는 머리부(header)와 몸체(body)로 이루어진다.
class 클래스이름 {
변수 선언문들 메소드 정의들 }
• 변수와 메소드는 각각 모델하는 객체의 데이터와 연산을 나타낸다.
• 변수는 객체 변수와 클래스 변수로 나누어진다.
메소드의 분류
• 메소드들은 크게 생성자 메소드(constructor), 변경자(modifier) 메소드와 접근자(accessor) 메소드로 나눌 수 있다.
• 생성자 메소드: 클래스로부터 객체를 만든다.
이때 객체 변수들의 값을 초기화할 수 있다.
• 변경자 메소드: (객체) 변수의 값을 변경한다.
• 접근자 메소드: (객체) 변수의 값을 되돌려
주거나 새로운 값을 계산하여 되돌려 준다.
가시성 수정자
• 가시성 수정자(visibility modifier)는 메소드나 변수들의 사용 범위를 명시하는 자바의
예약어이다.
• 세 개의 가시성 수정자: public, private, protected
• public 으로 선언된 클래스의 변수들과 메소드들은 어디서든지 이용될 수 있다.
• private로 선언된 클래스의 변수들과 메소드들은 그 클래스 내에서만 이용될 수 있다.
• protected 수정자는 9장에서 다루어진다.
클래스 작성
• 문제: 대학 내에 있는 한 은행의 계좌 관리 프로그램에서 은행계좌를
나타내야 한다.
• 은행계좌를 어떻게 모델할까?
- 은행계좌를 대표하는 속성은 무엇일까?
- 은행계좌에 적용 가능한 연산들은
무엇일까?
클래스 설계: 은행계좌
• 대표 속성
- 예금주 이름 - 잔고
• 연산
- 예금주 이름을 주어진 값으로 변경한다 - 잔고를 주어진 값으로 변경한다
- 예금주 이름을 알려 준다 - 잔고를 알려 준다
- 주어진 금액을 입금한다 - 주어진 금액을 출금한다
- 객체를 생성하면서 속성 데이터를 주어진 값들로
초기화한다
구현: 은행계좌 클래스
• 클래스의 이름: Account
• 클래스의 구조
class Account
{ // 변수 선언문(들) . . .
// 메소드 정의(들) . . .
}
class Account {
String ownerName;
int balance;
public void setOwnerName(String name) { ownerName = name;
}
public void setBalance(int amount) { balance = amount;
}
public void deposit(int amount) { balance = balance + amount;
}
public void withdraw(int amount) {
예금계좌 클래스
객체 변수
변경자 메소드
계속
public String getOwnerName( ) { return (ownerName);
}
public int getBalance( ) { return (balance);
}
// 객체 변수들의 초기화를 수행하는 생성자 메소드 public Account( String name, int amount) {
setOwnerName(name);
setBalance(amount):
} }
예금계좌 클래스 (계속)
접근자 메소드
접근자와 변경자 메소드
접근자(accessor) 메소드:
“get” 메소드 . . .
( 메소드명은 보통 “get”으 로 시작)
객체의 데이터에 대한 값을 되돌려 준다
변수 값을 반환할 수 있다 계산되는 어떤 값을 반환할
변경자 (modifier) 메소드:
“set” 메소드 . . .
( 메소드명은 보통 “set”으로 시작)
객체의 변수 값을 바꾸는 메소드 변수들에 대한 접근을 제한하고 그에 따라 변수 값을 제어하도록 한다
생성자 메소드
동기 :
우리는 객체를 만들 때 새 객체의 변수들을 초기화하는 수단이 필 요하다.
수단: 생성자 메소드는 객체가 만들어 질 때 자동적으로 호출되며 new 연산자의 일부로서 객체의 초기 화가 메모리 할당과 같이 이루어 진다.
public Account (String name, int amount) {
setOwnerName (name);
setBalance (amount);
주: 이 메소드는 클래스 이름과 같은 이름을 가져야 한다.
그러면 우리는 다음과 같이 할 수 있다:
Account acct =
new Account (“홍길동”, 10000);
이는 다음과 같다:
Account acct = new Account();
acct.setOwnerName(“홍길동”);
acct.setBalance(10000);
생성자 메소드
절대안됨!
반환하는 값은 생성자 메소드가 아니라는 것을
생성자 메소드는 반환하는 값을 가지지 않는다:
다음과 같이 하지 말아라:
public int Account ( ) {
. . . // 임의의 코드 }
public void Account ( {
객체 사용하기
• 클래스의 한 보기인 객체를 만들어야 한다 .
• 이는 다음과 같은 세 과정을 포함한다:
1. 객체를 가리키는 참조 변수를 정의한다: Account acct;
2. 클래스의 객체를 만든다:
acct = new Account( );
위의 두 과정은 하나로 합칠 수 있다:
Account acct = new Account( );
3. 생성자 메소드를 통해 객체 변수들의 초기 값들을 줄 수 있다:
public Account (String name, int amount) { setOwnerName (name);
setBalance (amount);
}
생성자메소드를 적절히 사용하여 위의 세 과정을 한 번에 할 수 있다:
객체 사용하기
• 다음으로 만들어진 객체를 이용하여 원하는 일을 수행하기 위해서 객체의 적절한 메소드를 호출해야 한다.
• 객체 메소드 호출 방법
<객체를 가리키는 참조변수 명>.<객체 메소드 명> (실 매개변수 목록)
주: 객체 메소드가 매개변수를 가지고 있지 않다면 실 매개변수
예제: Account 객체 사용하기
• 문제: 한 예금계좌를 개설하여 입금과 출금을 하고 난 후 잔고를 출력한다.
• 설계
변수: 예금계좌 객체 참조변수
알고리즘
1. 예금주가 ‘홍길동’이고 초기 입금액이 10,000 원인 새 예금계좌를 만든다.
2. 이 계좌에 3,000원을 입금한다.
3. 이 계좌에서 5,000원을 출금한다.
Account 객체 사용하기
class Driver {
public static void main (String[ ] argv) { Account acct;
// 주어진 값들을 갖는 Account 객체를 만든다 acct = new Account(“홍길동”, 10000);
// 입금한다
acct.deposit(3000);
// 출금한다
acct.withdraw(5000);
// 잔고를 출력한다
두 번째 클래스가 Account 클래스의
한 보기인 객체를 만들기 위해 사용된다.
Driver 클래스는 main 메소드를 가지고 있고 한 프로그램으로서
실행된다.
예금계좌 객체 사용하기
class Driver {
public static void main (String[ ] argv) { Account acct;
// 주어진 값들을 갖는 Account 객체를 만든다 acct = new Account(“홍길동”, 10000);
// 입금한다
acct.deposit(3000);
// 출금한다
acct.withdraw(5000);
// 잔고를 출력한다
System.out.println(“현 잔고: ” + acct.getBalance());
먼저, acct 라는 변수를 선언한다.
이 시점에서, acct는 아무 것도 가리키지
않는다.
다음으로, acct가
가리키는 한 객체를 만든다.