윤 홍 란 hryun@sookmyung.ac.kr 4 장 클래스 작성 윤 홍 란 hryun@sookmyung.ac.kr.

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

6 장 객체 - 지향 설계 ③. 목차 GUI 레이아웃  전화기 키 패드 전화기 키 패드 전화기 키 패드 모양의 GUI 를 만드는 Telephone.java, TelephonePanel.java 를 완성해 보자.  주석을 참고하여 TelephonePanel.java.
01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
최윤정 Java 프로그래밍 클래스 상속 최윤정
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
7장 배열 ③.
컴퓨터 프로그래밍 실습 #7 제 4 장 GUI 클래스 작성.
8장 상속 ②.
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
3장 객체-지향 프로그래밍 언어.
제 9 장 구조체와 공용체.
6장 객체-지향 설계 ①.
제 4 장 클래스 작성 Lab 4- 2.
제2장 데이터 및 수식.
1학기 Java 요약.
7장 배열 ②.
6장 객체-지향 설계 ②.
Lesson 5. 레퍼런스 데이터형.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
프로그래밍 개론 Ⅰ 제 3장. 클래스와 객체의 사용 ②.
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
9장 다형성 Lab 9-2.
10장 예외 Lab 10-2.
5장 조건과 반복 ③.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
자바 5.0 프로그래밍.
패키지와 접근 제어 패키지에 대하여 접근 제어에 대하여.
Power Java 제14장 배치 관리자.
그래픽 사용자 인터페이스와 사건처리.
Java 6장. 클래스 : 속성 public class SumTest {
Lesson 7. 클래스와 메소드 - 1.
제 4 장 클래스 작성 4-1 LAB.
컴퓨터 프로그래밍 실습 #6 제 4 장 클래스 작성.
컴퓨터 프로그래밍 : 실습3 2장 데이터와 식.
6장 객체-지향 설계 ①.
자바 5.0 프로그래밍.
4 장 클래스 작성.
13. 연산자 오버로딩.
7장 인터페이스와 추상 클래스.
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
자바응용.
4 장 클래스 작성.
6장 객체-지향 설계 ①.
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
10장 객체-지향 프로그래밍 I ©창병모.
자바 5.0 프로그래밍.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Power Java 제11장 상속.
JA A V W. 06.
Fucntion 요약.
CHAP 21. 전화, SMS, 주소록.
객체기반 SW설계 팀활동지 4.
18강. 인터페이스 – II - 인터페이스와 다중상속 - 인터페이스를 통한 로봇 장남감 만들기 프로그래밍
제 4 장 클래스 작성 Lab 4- 2.
Outline 클래스의 해부 캡슐화(Encapsulation) 메쏘드의 해부 그래픽 객체(Graphical Objects)
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
안드로이드 앱 개발과정 Step1. 기초과정 강사 : 정 훈 희.
3. 모듈 (5장. 모듈).
Chapter 4 클래스 작성.
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
Power Java 제14장 배치 관리자.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
OOP Practices OOP presentation 6 작성자 Kimjinsik 소속 Mobile computing Lab
7 생성자 함수.
Presentation transcript:

윤 홍 란 hryun@sookmyung.ac.kr 4 장 클래스 작성 윤 홍 란 hryun@sookmyung.ac.kr

Outline 클래스의 해부 캡슐화(Encapsulation) 메쏘드의 해부 그래픽 객체(Graphical Objects) 그래픽 사용자 인테페이스 버튼과 텍스트 필드

메쏘드 선언(Declarations) 메쏘드 선언(method declaration)은 메쏘드가 호출(invoked, called)될 때 실행되는 코드를 명시한다. 메쏘드가 호출되면 제어의 흐름은 호출된 메쏘드로 넘어가서 그 메쏘드의 문장들을 하나씩 실행한다. 그 메쏘드의 실행이 끝나면 제어는 호출된 위치로 반환되어 실행이 계속된다. 메쏘드가 어떻게 작성 되었느냐에 따라 호출은 값을 반환할 수도 혹은 그렇지 않을 수도 있다. 값을 반환할 경우: 반환 값의 타입 명시 값을 반환하지 않을 경우: 예약어 void 사용

메쏘드 제어 흐름(Control Flow) 만약 호출된 메쏘드가 호출한 메쏘드와 같은 클래스에 있을 때는 메쏘드의 이름만을 사용한다. myMethod(); myMethod compute

메쏘드 제어 흐름(Control Flow) 종종 호출된 메쏘드가 호출한 메쏘드와 다른 클래스나 객체에 속할 경우가 있다. obj.doIt(); main doIt helpMe helpMe(); 다른 클래스

매개변수 리스트(parameter list) 메쏘드 헤더(Method Header) 메쏘드 선언은 메쏘드 헤더 (method header)로 시작한다. char calc (int num1, int num2, String message) 메쏘드 이름 (method name) 매개변수 리스트(parameter list) 매개변수 리스트는 각 매개변수의 타입(type)과 이름(name)을 선언한다. 메소드 선언에서 사용된 매개변수 이름을 형식 매개변수(formal parameter)라 부른다. 반환 타입 (return type)

메쏘드 본체(Method Body) 메쏘드 해더(method header) 다음에는 메쏘드 본체(method body)가 온다. char calc (int num1, int num2, String message) { int sum = num1 + num2; char result = message.charAt (sum); return result; } “sum” 과 “result”는 지역 데이터(local data) 임. 지역 데이터는 메쏘드가 호출 될 때 마다 생성되었다가 메쏘드가 끝날 때 소멸된다. 반환 문은 반드시 메쏘드 헤더에 명시된 반환 타입과 일치하는 값을 갖고 있어야 한다.

반환 문(return Statement) 메쏘드의 반환 타입(return type)은 메쏘드를 호출한 지점으로 반환하게 되는 값의 타입을 나타낸다. 값을 반환하지 않는 메쏘드는 void 반환 타입(return type)을 갖는다. 반환 문(return statement) 반환될 값을 명시한다. return expression; 이 때 수식(expression)의 결과는 반드시 반환 타입과 같아야 한다.

매개변수(Parameters) 메쏘드가 호출되면, 호출 지점의 실 매개변수들이 (actual parameters) 메쏘드 해더의 형식 매개변수들로 복사된다. 실 매개변수(actual parameters) ch = obj.calc (25, count, "Hello"); char calc (int num1, int num2, String message) { int sum = num1 + num2; char result = message.charAt (sum); return result; } 형식 매개변수(fomal parameters)

지역 데이터(Local Data) 앞 장에서 지역 변수(local variables)들이 메쏘드 안에서 선언되는 것을 보았다. 메쏘드의 형식 매개변수(formal parameters)들은 메쏘드가 호출 될 때 자동 지역 변수(automatic local variables)를 생성한다. 메쏘드가 종료되면, 모든 지역 변수들은 소멸된다. (형식 매개변수 포함) [비교] 클래스 레벨에서 선언된 실체 변수(instance variables) 들은 객체가 존재하는 한 소멸되지 않고 메모리에 존재한다.

은행 계좌(Bank Account) 예제 한 클래스와 그 사용에 대한 또 하나의 예를 살펴보자. Account 클래스의 상태(state): 계좌 번호(account number), 잔고(current balance), 예금주 이름(name of the owner) Account의 행동(behaviors) (혹은 서비스): 입금(deposits)과 출금(withdrawals), 이자 가산(adding interest)

구동 프로그램(Driver Programs) Transactions 클래스는 Account 클래스를 사용하여 서비스를 연습을 구동하는 main 메쏘드를 포함하고 있다. Transactions.java (국문 177쪽, 영문 172쪽) 참조 Account.java (국문 178쪽, 영문 173쪽) 참조

Transactions.java acct1.addInterest(); acct2.addInterest();       System.out.println ();       System.out.println (acct1);       System.out.println (acct2);       System.out.println (acct3);    } } //******************************************************************* // 여러 Account 객체들의 생성과 사용을 보인다. public class Transactions {    //---------------------------------------------------------------    //  은행 계좌를 몇 개 만들고 다양한 서비스를 요청한다.    public static void main (String[] args)    {       Account acct1 = new Account ("Ted Murphy", 72354, 102.56);       Account acct2 = new Account ("Jane Smith", 69713, 40.00);       Account acct3 = new Account ("Edward Demsey", 93757, 759.32);       acct1.deposit (25.85);       double smithBalance = acct2.deposit (500.00);       System.out.println ("Smith balance after deposit: " +                                    smithBalance);  System.out.println ("Smith balance after withdrawal: " +                                 acct2.withdraw (430.75, 1.50));

Account.java //******************************************************************* //  입금과 출금 같은 기본적인 서비스를 가진 은행 계좌를 나타낸다. import java.text.NumberFormat; public class Account {    private final double RATE = 0.035;  // 이자율 3.5%    private long acctNumber;    private double balance;    private String name;                                                                                 //-----------------------------------------------------------------   //  예금주, 계좌번호, 초기 잔액을 정의하여 계좌를 설정한다.    public Account (String owner, long account, double initial)    {       name = owner;       acctNumber = account;       balance = initial;    }

Account.java //-----------------------------------------------------------------   //  명시한 금액을 계좌에 입금하고 새로운 잔액을 반환한다.     //-----------------------------------------------------------------    public double deposit (double amount)    {       balance = balance + amount;       return balance;    }   //  명시한 금액을 계좌로부터 출금하고 수수료를 적용하고 새로운 잔액을 반환한다.            public double withdraw (double amount, double fee)       balance = balance - amount -fee; return balance;    //-----------------------------------------------------------------   //  계좌에 이자를 추가하여 새로운 잔액을 반환한다.    public double addInterest ()       balance += (balance * RATE);

Account.java  //-----------------------------------------------------------------   //  계좌의 현재 잔액을 반환한다.   //-----------------------------------------------------------------    public double getBalance ()    {       return balance;    }    //----------------------------------------------------------------    //  계좌를 한 줄의  스트링으로 표현하여 반환한다.    public String toString ()       NumberFormat fmt = NumberFormat.getCurrencyInstance();       return (acctNumber + "\t" + name + "\t" + fmt.format(balance)); }

Bank Account 예제 acct1 acctNumber 72354 balance 102.56 name “Ted Murphy” acct2 69713 acctNumber 40.00 balance name “Jane Smith”

Bank Account 예제 Account 클래스는 개선될 여지가 있다. 형식적인 접근자(getter)와 설정자(setter)를 모든 데이터에 대해 만들 수 있을 것이다. 새로운 getter의 예: 예금주, 계좌번호, 이자율 등. 새로운 setter의 예: 이자율 등 일부 계좌의 잔액을 갱신하는 메쏘드들은 보다 엄밀하게 설계될 수 있을 것이다. 예) 음수 액수를 출금하는 것을 막는 것처럼 매개변수 값이 유효한지 확인하는 검사를 해야 할 것이다.

구성자(Constructors) [유의사항] 구성자는 메쏘드 해더에 반환 타입이 명시되어 있지 않다. (void도 명시되지 않음) 프로그래머의 일반적인 실수 중 하나가 구성자에 리턴 타입을 사용하는 것이다. 리턴 타입을 사용하면(void라도) 더 이상 구성자가 아닌 “보통” 메쏘드가 되고 만다. 이 경우 클래스 이름과 같은 이름을 갖는 메쏘드가 되고 이는 때때로 난해한 오류를 초래할 수 있다. 프로그래머는 꼭 클래스의 구성자(constructor)를 정의할 필요는 없다. 각각의 클래스는 매개변수를 갖지 않는 디폴트 구성자(default constructor)를 갖는다.

Outline 클래스의 해부 캡슐화(Encapsulation) 메쏘드의 해부 그래픽 객체(Graphical Objects) 그래픽 사용자 인테페이스 버튼과 텍스트 필드

그래픽 객체(Graphical Objects) 일부 객체들은 그래픽 표현을 가지는데, 이것은 객체가 시각적으로 어떻게 보이는지에 관한 정보가 그 객체의 상태와 동작에 포함되어 있음을 의미한다. 대부분의 GUI 컴포넌트들은 그래픽 객체이다. 컴포넌트들이 어떻게 그려져야 할지를 나타내는 효과를 가질 수 있다. 우리는 2장에서 애플릿에 paint 메쏘드를 정의할 때 이러한 그래픽 효과를 사용하는 것을 보았다. 이 장에서 그래픽 객체의 다른 예들을 더 살펴보도록 하자.

Smiling Face 예제 SmilingFace 프로그램은 패널(panel)의 paintComponent 메쏘드를 정의함으로써 얼굴을 그린다. SmilingFace.java (국문 182쪽, 영문 177쪽) 참조 SmilingFacePanel.java (국문 183쪽, 영문 178쪽) 참조 SmilingFace 클래스의 main 메쏘드는 프로그램을 위한 프레임을 준비하여 SmilingFacePanel 클래스를 실체화 하고 디스플레이 한다. SmilingFacePanel 클래스는 JPanel 클래스의 특징을 상속(inherit)받아 확장(extends)하여 만든다.

SmilingFace.java //******************************************************************** //  별도의 패널 클래스를 사용하는 것을 보여준다. import javax.swing.JFrame; public class SmilingFace {    //-----------------------------------------------------------------    //  프로그램의 주 프레임을 생성한다.    //-----------------------------------------------------------------    public static void main (String[] args)    {       JFrame frame = new JFrame ("Smiling Face");       frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);       SmilingFacePanel panel = new SmilingFacePanel();       frame.getContentPane().add(panel);       frame.pack();       frame.setVisible(true);    } }

SmilingFacePanel.java //******************************************************************** //  별도의 패널 클래스를 사용하는 것을 보여준다. import javax.swing.JPanel; import java.awt.*; public class SmilingFacePanel extends JPanel {    private final int BASEX = 120, BASEY = 60; // (그림의) 머리를 위한 기준 점    //-----------------------------------------------------------------    //  구성자: 이 패널의 주 특성을 설정한다.    //-----------------------------------------------------------------    public SmilingFacePanel ()    {       setBackground (Color.blue);       setPreferredSize (new Dimension(320, 200));       setFont (new Font("Arial", Font.BOLD, 16));    }

SmilingFacePanel.java //-----------------------------------------------------------------    // 얼굴을 그린다.    //-----------------------------------------------------------------    public void paintComponent (Graphics page)    {       super.paintComponent (page);       page.setColor (Color.yellow);       page.fillOval (BASEX, BASEY, 80, 80);  // 머리       page.fillOval (BASEX-5, BASEY+20, 90, 40);  // 귀       page.setColor (Color.black);       page.drawOval (BASEX+20, BASEY+30, 15, 7);  // 눈       page.drawOval (BASEX+45, BASEY+30, 15, 7);       page.fillOval (BASEX+25, BASEY+31, 5, 5);  // 눈동자       page.fillOval (BASEX+50, BASEY+31, 5, 5);

SmilingFacePanel.java page.drawArc (BASEX+20, BASEY+25, 15, 7, 0, 180);  // 눈썹       page.drawArc (BASEX+45, BASEY+25, 15, 7, 0, 180);       page.drawArc (BASEX+35, BASEY+40, 15, 10, 180, 180);  // 코       page.drawArc (BASEX+20, BASEY+50, 40, 15, 180, 180);  // 입       page.setColor (Color.white);       page.drawString ("Always remember that you are unique!",                            BASEX-105, BASEY-15);       page.drawString ("Just like everyone else.", BASEX-45, BASEY+105);    } }

Smiling Face 예제 모든 Swing 컴포넌트는 paintComponent 메쏘드를 갖는다. paintComponent 메쏘드는 패널을 위한 그래픽 문맥(graphics context)을 나타내는 그래픽 객체를 받아들인다. 예제에서는 적당한 Graphics 메쏘드를 불러 얼굴을 그리기 위하여 paintComponent 메쏘드를 정의하였다. 패널에 그리는 것과 다른 GUI 컴포넌트들을 패널에 추가하는 것의 차이점에 유의하라

Splat 예제 Splat 예제는 조금 다른 구성을 갖고 있다. 이 프로그램은 몇 개의 속이 채워진 원들을 패널에 그리는데 각각의 원은 자신의 그래픽 정보를 유지하는 독립적인 객체로 표현된다. 패널의 paintComponent 메쏘드는 각 원으로 하여금 자신을 스스로 그리도록 요청한다. Splat.java (국문 185쪽, 영문 180쪽) 참조 SplatPanel.java (국문 186쪽, 영문 181쪽) 참조 Circle.java (국문 188쪽, 영문 182쪽) 참조

Splat.java //******************************************************************** //  그래픽 객체의 사용을 보여준다. import javax.swing.*; import java.awt.*; public class Splat {    //-----------------------------------------------------------------    //  원들의 모임을 보여준다.    //-----------------------------------------------------------------    public static void main (String[] args)    {       JFrame frame = new JFrame ("Splat");       frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);       frame.getContentPane().add(new SplatPanel());       frame.pack();       frame.setVisible(true);    } }

SplatPanel.java   //-----------------------------------------------------------------    // 각 원이 스스로를 그리게 요청함으로써 이 패널을 그린다.    //-----------------------------------------------------------------    public void paintComponent (Graphics page)    {       super.paintComponent (page);       circle1.draw(page);       circle2.draw(page);       circle3.draw(page);       circle4.draw(page);       circle5.draw(page);    } } //******************************************************************** //  그래픽 객체의 사용을 보여준다. import javax.swing.*; import java.awt.*; public class SplatPanel extends JPanel {    private Circle circle1, circle2, circle3, circle4, circle5;    //-----------------------------------------------------------------    //  구성자: 다섯 개의 Circle 객체들을 생성한다.    //-----------------------------------------------------------------    public SplatPanel ()    {       circle1 = new Circle (30, Color.red, 70, 35);       circle2 = new Circle (50, Color.green, 30, 20);       circle3 = new Circle (100, Color.cyan, 60, 85);       circle4 = new Circle (45, Color.yellow, 170, 30);       Circle5 = new Circle (60, Color.blue, 200, 60);       setPreferredSize (new Dimension(300, 200));       setBackground (Color.black);    }

Circle.java //-------------------------------------------------------------    // 지정된 그래픽 문맥으로 이 원을 그린다.    //-----------------------------------------------------------    public void draw (Graphics page)    {       page.setColor (color);       page.fillOval (x, y, diameter, diameter);    }   //------------------------------------------------------------   // 지름 변경자.    public void setDiameter (int size)       diameter = size;    //----------------------------------------------------------    // 색상 변경자.    //----------------------------------------------------------    public void setColor (Color shade)       color = shade; //******************************************************************** //  특정한 위치, 크기, 색상을 가진 원을 표현한다. import java.awt.*; public class Circle {    private int diameter, x, y;    private Color color;    //-----------------------------------------------------------------    //  구성자: 지정된 값들을 가지고 이 원을 설정한다.    //-----------------------------------------------------------------    public Circle (int size, Color shade, int upperX, int upperY)    {       diameter = size;       color = shade;       x = upperX;       y = upperY;    }

Circle.java //-----------------------------------------------------------------    // X 변경자.    //-----------------------------------------------------------------    public void setX (int upperX)    {       x = upperX;    }    //-----------------------------------------------------------------    // Y 변경자.    public void setY (int upperY)       y = upperY;    // 지름 접근자.    public int getDiameter ()       return diameter; //-----------------------------------------------------------------    // 색상 접근자.    //-----------------------------------------------------------------    public Color getColor ()    {       return color;    }    //-----------------------------------------------------------------    // X 접근자.    public int getX ()       return x;    // Y 접근자.    public int getY ()       return y; }