Transcript Document

컴퓨터 응용 및 실습
Week 3 : 클래스와 메소드와 객체2
2015년 7월 21일 화요일
최 윤 정([email protected])
이번 장에서 학습할 내용
• 클래스와 객체
• 객체의 일생
• 메소드
• 필드
속성
동작
1. 객체는 ________과
_________을
가지고 있다.
2. 자동차가 객체라면 클래스는 ________이다.
설계도
• UML
• 지금 이 시점에서는 클래스는 무엇이다.
• 반복/비교문을 사용할 수 있으며
• 커피머신 정도는 클래스로 구현할 수 있다.! 정도면 충분합니다.
2
클래스의 구성

클래스(class)는 객체의 설계도라 할 수
있다.



클래스는 필드와 메소드로 이루어진다.
필드(field)는 객체의 속성을 나타낸다.
메소드(method)는 객체의 동작을
나타낸다.
3
테스트 클래스
Car.java
CarTest.java
public class CarTest {
class Car {
public static void main(String[] args) {
// 필드 정의
public int speed; // 속도
public int mileage; // 주행거리
public String color; // 색상
Car myCar = new Car();
// 메소드 정의
public void speedUp() { // 속도 증가 메소드
speed += 10;
}
myCar.speed = 60;
// 객체의 필드 변경
myCar.mileage = 0;
// 객체의 필드 변경
myCar.color = "blue";
// 객체의 필드 변경
myCar.speedUp();
// 객체의 메소드 호출
// 첫번째 객체 생성
Car yourCar = new Car(); // 두번째 객체 생성
public void speedDown() { // 속도 감소 메소드
speed -= 10;
}
System.out.println(myCar);
public String toString() {
// 객체의 상태를 문자열로 반환하는 메소드
return "속도: " + speed + " 주행거리: " +
mileage + " 색상: " + color;
}
}
yourCar.mileage = 10;
yourCar.speed = 120;
// 객체의 필드 변경
// 객체의 필드 변경
yourCar.color = "white"; // 객체의 필드 변경
•
이제 이런 코드들은 쉽죠?
•
OO 스럽게 수정할 수 있는 부분도 막 보이죠??
yourCar.speedDown();
// 객체의 메소드 호출
System.out.println(yourCar);
}
}
4
UML
 UML(Unified Modeling Language)
연관(association)
집약/집합(aggregation)
위에서 약속한 것을 쓰되,
표현히 모호하다.! 그러면
차라리 화살표 위에
use, like, love 로 쓰도록 합니다.
use
위와 같은 그림은 표현방법에서도 에러입니다.
5
디자인패턴 & class diagram 검색해보기
• http://www.ibm.com/developerworks/kr/library/sep04/bell/
• http://public.dhe.ibm.com/software/dw/rationaledge/nov03/t_modelinguml_db.pdf
CDSalesReport 클래스는 Report 클래스에서 상속을 받고,
CDSalesReport는 한 개의 CD와 관련이 되어 있지만,
CD 클래스는 CDSalesReport에 대해 아무것도 모르고 있다.
CD와 Band 클래스는 서로에 대해 알고 있고, 두 클래스는 서로 연관되어
있다.
클래스 다이어그램에는 이 보다 더 많은 개념들을 적용할 수 있다..
(읽어볼 것.)
거의 모든 개발자들은 이 다이어그램이 무엇을 하고 있는지를 알고 있으나 대부분의 프로그래머들은 관계도를 잘못 그리고 있다.
위와 같은 클래스 다이어그램의 경우 상속 관계를 그릴 때에는 화살표 방향을 위로 향하게 하여 수퍼 클래스를 지시하게 하면서
화살표 모양은 완벽한 삼각형이 되도록 해야 한다. 상관 관계는 두 클래스들이 서로를 인식하고 있다면 일직선이 되어야 하고, 클래스의 한 편만 알
고 있는 관계라면 화살표 표시가 되어있는 선을 그어야 한다.. (중략)
http://www.objectmentor.com/resources/articles/umlClassDiagrams.pdf
6
Television
-isOn
-volume
-channel
+setChannel()
+getChannel()
+setVolume()
+getVolume()
+turnOn()
+turnOff()
+toString()
7
예제
class DeskLamp {
// 인스턴스 변수 정의
private boolean isOn; // 켜짐이나 꺼짐과 같은 램프의 상태
// 메소드 정의
public void turnOn() // 램프를 켠다.
{
isOn = true;
}
public class DeskLampTest {
public static void main(String[] args) {
// 역시 객체를 생성하려면 new 예약어를
public void turnOff() // 램프를 끈다.
{
isOn = false;
}
}
사용한다.
DeskLamp myLamp = new DeskLamp();
public String toString() {
return "현재 상태는 " + (isOn == true ? "켜짐" : "꺼짐");
}
// 객체의 메소드를 호출하려면 도트 연산자인 .을
사용한다.
myLamp.turnOn();
System.out.println(myLamp);
현재 상태는 켜짐
현재 상태는 꺼짐
myLamp.turnOff();
System.out.println(myLamp);
}
}
8
객체의 생성
9
객체의 일생
Car c = new Car();
c.speedUp();
c = null;
10
속도: 70 주행거리: 0 색상: blue
속도: 110 주행거리: 10 색상: white
11
주의
Car
myCar;
위의 문장으로 객체가 생성되는
것은 아님!!!
객체를 가리키는 참조값을 담을
수 있는 변수만 생성됨.
12
참조 변수와 대입 연산
 Car
car1 = new Car();
 Car
car2 = car1;
// 대입 연산의 의미
13
객체의 사용
 객체를 이용하여 필드와 메소드에 접근할 수 있다.
14
객체의 소멸
객체는
참조가
없어지면
소멸!!
15
객체의 소멸
16
메소드
17
매개 변수
18
값에 의한 전달
19
매개 변수가 객체인 경우
20
메소드 호출
21
메소드 호출의 예제
import java.util.*;
public class DiceGame {
private int diceFace;
private int userGuess;
private void RollDice()
{
diceFace = (int)(Math.random() * 6) + 1;
}
public class DiceGameTest {
public static void main(String[] args) {
DiceGame game = new DiceGame();
game.startPlaying();
}
}
private int getUserInput(String prompt)
{
System.out.println(prompt);
Scanner s = new Scanner(System.in);
예상값을 입력하시오:
3
틀렸습니다
return s.nextInt();
}
private void checkUserGuess()
{
if( diceFace == userGuess )
System.out.println("맞았습니다");
else
System.out.println("틀렸습니다");
}
public void startPlaying()
{
this.userGuess = getUserInput("예상값을 입력하시오: ");
RollDice();
}
}
checkUserGuess();
22
중복 메소드 : 메소드 재정의
 메소드 오버로딩(overloading) & 오버라이딩(overriding)
***Overriding : 상속관계에서 물려받은 메소드를
하위클래스에서 재정의 하는 경우.
 Overloading

메소드 호출시 매개 변수를 보고 일치하는 메소드가 호출된다.

만약 square(3.14)와 같이 호출되면 컴파일러는 매개 변수의 개수, 타입, 순서 등을 봐서 두
번째 메소드를 호출한다.
23
중복 메소드 예제
class Car {
// 필드 선언
private int speed; // 속도
// 중복 메소드: 정수 버전
public void setSpeed(int s) {
speed = s;
System.out.println("정수 버전 호출");
}
// 중복 메소드: 실수 버전
public void setSpeed(double s) {
speed = (int)s;
System.out.println("실수 버전 호출");
}
정수 버전 호출
실수 버전 호출
}
public class CarTest1 {
public static void main(String[] args) {
Car myCar = new Car(); // 첫번째 객체 생성
myCar.setSpeed(100); // 정수 버전 메소드 호출
myCar.setSpeed(79.2); // 실수 버전 메소드 호출
}
}
24
자바에서의 변수의 종류
 필드(field) 또는 인스턴스 변수: 클래스 안에서 선언되는 멤버 변수
 지역 변수(local variable): 메소드나 블록 안에서 선언되는 변수
필드
Class Car {
int speed;
…
void speedUp(int s){
int limit=100;
…
}
}
지역 변수
25
필드의 선언
26
필드의 사용 범위
27
설정자와 접근자
 설정자(mutator, setter)
 필드의 값을 설정하는 메소드
 setXXX() 형식
 접근자(accessor,getter)
 필드의 값을 반환하는 메소드
 getXXX() 형식
28
설정자와 접근자의 예

설정자에서 매개 변수를 통하여 잘못된 값이 넘어오는 경우, 이를 사전에 차단할 수 있다.

필요할 때마다 필드값을 계산하여 반환할 수 있다.

접근자만을 제공하면 자동적으로 읽기만 가능한 필드를 만들 수 있다.
29
변수를 사용할 때는 항상 주의
30
변수와 변수의 비교
 “변수1 == 변수2”의 의미
31
정적 변수

인스턴스 변수(instance variable): 객체마다 하나씩 있는 변수

정적 변수(static variable): 모든 객체를 통틀어서 하나만 있는 변수는 static
으로 정의합니다.
32
정적 변수의 예
33
정적 메소드


정적 메소드(static method): 객체를 생성하지 않고도 사용할 수 있는 메소드
(예) Math 클래스에 들어 있는 각종 수학 메소드 들
double value = Math.sqrt(9.0);
double num = Math.rando,();
34
상수
 공간을 절약하기 위하여 정적 변수로 선언된다.
35
접근 제어

접근 제어(access control): 다른 클래스가 특정한 필드나 메소드에 접근하는
것을 제어하는 것
protected 와 지정하지 않았을 때도 어떻게 동작하는지 알아오세요.
36
this

자기 자신을 참조하는 키워드


this.member = 10;
생성자를 호출할 때도 사용된다.

this(10, 20);
37
중간 점검 문제: 서로 이야기 해보세요
1. 정적 변수는 어떤 경우에 사용하면 좋은가?
2. 정적 변수나 정적 메소드를 사용할 때, 클래스 이름을 통하여
접근하는 이유는 무엇인가?
3. main() 안에서 인스턴스 메소드를 호출할 수 없는 이유는
무엇인가?
4. this의 주된 용도는 무엇인가?
5. this()와 같이 표기하면 무엇을 의미하는가??
38
클래스와 클래스 간의 관계

사용(use): 하나의 클래스가 다른 클래스를 사용한다.

집합(has-a): 하나의 클래스가 다른 클래스를 포함한다.

상속(is-a): 하나의 클래스가 다른 클래스를 상속한다.

위와 같이 의미를 부여할 수 있을 때 사용하는 것이 중요합니다.
39