거리계산문제 간단한문제 n 2 차원평면상의두점사이의거리를구하는프로그램을작성해보자 n 해법 : 피타고라스정리 거리구하는공식 n 두점 (x 1, y 1 ) 과 (x 2, y 2 ) 사이의거리 d n 제곱근은 Math.sqrt, 제곱은 Math.ow 로구함 4 절차지향적거리

Similar documents
JAVA PROGRAMMING 실습 08.다형성

gnu-lee-oop-kor-lec06-3-chap7

No Slide Title

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - 2강

PowerPoint Presentation

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Design Issues

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

PowerPoint Presentation

PowerPoint Presentation

No Slide Title

PowerPoint Presentation

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 02. 표준 입출력

JAVA PROGRAMMING 실습 07. 상속

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

17장 클래스와 메소드

(Microsoft PowerPoint - java2-lecture3.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - Lect04.pptx

Microsoft PowerPoint - java2 [호환 모드]

제11장 프로세스와 쓰레드

PowerPoint Presentation

Microsoft PowerPoint - chap11

PowerPoint Presentation

객체 Key Point 객체는그객체의특성을나타내는상태 (state) 와그객체의행동 (behaviors) 으로이루어진다. 좌표상의점 n 상태 : x 좌표값, y 좌표값 n 행동 : 점의이동 주사위 n 상태 : 표면값 n 행동 : 주사위굴리기 은행계좌 n 상태 : 예금주,

JVM 메모리구조

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

JAVA PROGRAMMING 실습 05. 객체의 활용

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

Microsoft PowerPoint 장강의노트.ppt

PowerPoint 프레젠테이션

Microsoft PowerPoint - Java7.pptx

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

설계란 무엇인가?

강의계획서 1. 강의개요 학습과목명 객체지향프로그래밍 Ⅰ 학점 3 학점교 강사명교 강사전화번호 강의시간 4시간강의실수강대상 2. 교과목학습목표 4차산업혁명시대의도래로컴퓨터와프로그래밍에대한관심이커지고있으며, 여러분야에서소프트웨어의중요성을강조하며, 새시대를이끌

PowerPoint Template

PowerPoint Presentation

슬라이드 1

쉽게

C++ Programming

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

PowerPoint Presentation

PowerPoint 프레젠테이션

Microsoft PowerPoint - CSharp-10-예외처리

Network Programming

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

PowerPoint Presentation

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

Microsoft Word - java19-1-midterm-answer.doc

PowerPoint Template

Chapter 6 Objects and Classes

JAVA PROGRAMMING 실습 09. 예외처리

오버라이딩 (Overriding)

Microsoft PowerPoint - additional07.ppt [호환 모드]

Microsoft PowerPoint - C++ 5 .pptx

PowerPoint Presentation

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

Slide 1

PowerPoint Presentation

JAVA PROGRAMMING 실습 02. 표준 입출력

소프트웨어공학개론 강의 5: 객체지향개념 최은만동국대학교컴퓨터공학과

유니티 변수-함수.key

ThisJava ..

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

C++ Programming

쉽게 풀어쓴 C 프로그래밍

KNK_C_05_Pointers_Arrays_structures_summary_v02

2 단계 : 추상화 class 오리 { class 청둥오리 extends 오리 { class 물오리 extends 오리 { 청둥오리 mallardduck = new 청둥오리 (); 물오리 redheadduck = new 물오리 (); mallardduck.swim();

PowerPoint Presentation

슬라이드 1

Microsoft PowerPoint - 04_OOConcepts(2010).pptx

Java Programing Environment

Microsoft PowerPoint - additional08.ppt [호환 모드]

C++ 기본문법 정리

JUNIT 실습및발표

C# Programming Guide - Types

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

쉽게 풀어쓴 C 프로그래밍

슬라이드 1

슬라이드 1

Semantic Consistency in Information Exchange

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

Chapter 4. LISTS

슬라이드 1

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

PowerPoint Template

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밊

Transcription:

Part 06 상속과다형성 Kwangman Man (htt://comiler.sangji.ac.kr, kkman@sangji.ac.kr) SangJi University 2012 이장의내용 클래스상속의필요성 클래스상속설계 Java 에서클래스상속구현 클래스상속과다형성의관계 Java 에서다형성구현 클래스계층과추상클래스, 최종클래스 2 6.1 두점사이의거리 kkman@sangji.ac.kr, 2012. 1

거리계산문제 간단한문제 n 2 차원평면상의두점사이의거리를구하는프로그램을작성해보자 n 해법 : 피타고라스정리 거리구하는공식 n 두점 (x 1, y 1 ) 과 (x 2, y 2 ) 사이의거리 d n 제곱근은 Math.sqrt, 제곱은 Math.ow 로구함 4 절차지향적거리계산 실행결과 ========================= 첫번째점의좌표 (x, y) 를입력하세요. 1 2 두번째점의좌표 (x, y) 를입력하세요. 4 5 (1, 2) 와 (4, 5) 사이의거리 = 4.24 5 객체지향적거리계산 두점, q 를만들고.distanceFrom(q) 로거리를구함 Point 클래스가필요함 실행결과 ========================= 첫번째점의좌표 x 와 y 를입력하세요. 1 2 두번째점의좌표 x 와 y 를입력하세요. 4 6 (1, 2) 과 ( 와 ) (4, 6) 사이의거리 = 5.00 6 kkman@sangji.ac.kr, 2012. 2

Point 클래스 실제거리를구하는부분 7 6.2 리팩토링 ( 고급주제 ) 리팩토링 리팩토링이란? n 프로그램의수행내용을변경시키지않으면서도프로그램의내부구조를깔끔하게정리하는것 n 기계적으로수행될수있음 리팩토링수행시주의할점 n 리팩토링결과가항상프로그래머의도와일치하는것은아님 n 항상리팩토링이전으로돌아갈수있도록리팩토링을수행해야함 n 리팩토링을수행한후에는이전에통과했던모든테스트가통과되는지점검해야함 9 kkman@sangji.ac.kr, 2012. 3

이클립스지원주요리팩토링 리팩토링기법 이름변경 이동 메소드시그너처변경 메소드추출 지역변수추출 상수추출 인라인 매개변수도출 내용 클래스, 메소드, 변수등의이름을변경 클래스, 메소드, 필드등의위치를다른클래스나패키지로이동 리턴타입, 인수타입및순서, 메소드가시성등메소드시그너처를변경 선택한문장이나수식을메소드로추출해냄 선택한수식을지역변수로추출해냄 상수수식을클래스상수로추출해냄 메소드호출부분이나변수등을메소드본체나수식으로대치 선택한수식을매개변수로도출해냄 10 메소드추출 1. 메소드로추출할부분을마우스로선택함 2. 메소드이름과인수접근제한자를결정함 3. 변경되는부분을점검함 11 메소드추출결과 Refactoring Point 를읽는부분을메소드로추출함 12 kkman@sangji.ac.kr, 2012. 4

1단계전에매개변수로도출할매개변수도출코드를복사해야할수있음 1. 매개변수로도출할부분을마우스로선택함 2. 매개변수타입을확인하고매개변수이름과위치를결정함 3. 변경되는부분을점검함 13 매개변수도출결과 Refactoring 프롬프트를매개변수로도출함 14 간단한정리후 프롬프트뒤에공백문자넣는것을 readpoint 메소드로옮겼음 15 kkman@sangji.ac.kr, 2012. 5

6.3 이름이붙여진점 클래스설계절차 1. 클래스이름정하기 n 클래스가나타내는대상을클래스이름으로정함 n 가능하면구체적인이름으로정하는것이좋음 2. 데이터필드정하기 n 이클래스의객체에저장해야하는데이터와타입을정함 n 필드이름을먼저정하고적합한타입을정함 3. 메소드정하기 n 이클래스의객체에적용할수있는연산들을생각함 n 이클래스를이용하여하려는일에필요한어떤작업이있다면이것을메소드로정함 17 이름이붙여진점클래스 A 이름이붙여진점클래스 B n 수학에서는점에이름을붙이는경우가많다. 이름이붙여진점클래스설계 n 클래스이름 : NamedPoint n 필드설계 : name, x, y n 메소드설계 : tostring(), getx(), gety(), getname() 클래스다이어그램 n 클래스설계내용을담고있음 NamedPoint 18 C -name: String -x: int -y: int +tostring(): String +getx(): int +gety(): int +getname(): String kkman@sangji.ac.kr, 2012. 6

NamedPoint 구현클래스다이어그램을그대로코드로옮김 19 MakeNamedPoint NamedPoint 를테스트하기위한드라이버클래스 실행결과 ============================ 점의이름과좌표 x, y를입력하세요. B 3 4 창병모, 우균입력된점 = B(3, 4) 20 작성한프로그램의문제점 코드중복 n 프로그램여러곳에같은코드가사용되는현상 n 비효율적일뿐만아니라코드관리가매우어려워짐 n 코드중복은 ' 죄악 ' 이다! Point NamedPoint -x: int -y: int -name: String -x: int -y: int +tostring(): String +getx(): int +gety(): int +tostring(): String +getx(): int +gety(): int +getname(): String 21 kkman@sangji.ac.kr, 2012. 7

6.4 상속 상속 클래스상속이란? n 다른클래스의필드와메소드를그대로물려받아새로운클래스를정의하는기법 n 수퍼클래스 ( 상위클래스 ): 물려주는 ( 이미있던 ) 클래스 n 서브클래스 ( 하위클래스 ): 물려받은 ( 새로만든 ) 클래스 상속의필요성 n 객체지향프로그래밍에서죄악 ( 코드중복 ) 을저지르지않는방법 n 이미있는코드를재사용하는방법 23 Java 의상속 Java 에서클래스를상속하는방법 n 키워드 extends 를이용함 class AA extends A { } n 클래스 A 로부터상속하여 AA 를선언한것임 n 수퍼클래스는 A, 서브클래스는 AA Java 의유비쿼터스상속 n Java 에는상속이도처에널려있다. n 여러분도모르는사이에이미상속은있었다. n 간단한예를보기위해 SimlePoint 를보자 ( 다음슬라이드 ) 24 kkman@sangji.ac.kr, 2012. 8

SimlePoint 의 tostring WOW! SimlePoint 에는 tostring 메소드가 실행결과 ============================ 점의좌표 x와 y를입력하세요. 2 3 창병모, 우균 25 없다! 그럼, 어딜까? 입력된점 = SimlePoint@60aeb0 최상위클래스 Object Object 클래스 n Java 에서모든클래스의상위클래스 n 모든클래스가필요로할만한메소드들을정의하고있음 n 예컨대 tostring 도 Object 클래스의메소드임 SimlePoint extends Object n 모든클래스는무조건 Object 의서브클래스 n 아래두선언의의미는같음 class SimlePoint { } class SimlePoint extends Object { } Object 클래스에대한자세한사항은아래링크를참고하세요. htt://download.oracle.com/javase/7/docs/ai/java/lang/object.html 창병모, 우균 26 클래스상속설계 클래스상속설계절차 1. 상위클래스와중복되는필드삭제 2. 하위클래스의오버라이딩메소드정의 3. 상속관계수립 : 하얀삼각형 화살표 NamedPoint의상속설계 n 필드 x, y 삭제 n 메소드 tostring, getx, gety 삭제 Point NamedPoint -x: int -y: int -name: String -x: int -y: int Point -x: int -y: int +tostring(): String +getx(): int +gety(): int NamedPoint -name: String +getname(): String +tostring(): String +getx(): int +gety(): int +tostring(): String +getx(): int +gety(): int +getname(): String 27 kkman@sangji.ac.kr, 2012. 9

클래스상속프로그래밍 클래스상속프로그래밍절차 1. 상속관계 : 키워드 extends로상속 2. 필드가시성 : 꼭필요하면 rivate à rotected 3. 하위클래스생성자 : 생성자첫줄에서키워드 suer 로상위클래스생성자호출 4. 메소드오버라이딩 (overriding): 하위클래스에서다르게구현해야할메소드재지정 (suer 이용가능 ) NamedPoint의상속프로그래밍 n 2번은필요없음 : suer.tostring 이용 n 3번 : suer(x, y) 호출필요 n 4번 : tostring 오버라이딩 28 NamedPoint: 상속이용 상위클래스 Point 의생성자호출 메소드 tostring 재지정 상위클래스 Point 의메소드 tostring 호출 창병모, 우균 29 IS-A 관계와적합한상속 IS-A 관계 n A 클래스를상속하여 AA 클래스를만들려면 "AA 는 A 다 (AA is-a A)" 관계가성립해야함 n 이런뜻에서상속관계를 IS-A 관계라고함 부적절한상속 (imroer inheritance) n IS-A 관계가성립하지않는상속관계 n 부적절한상속예 : Line extends Point Line 은 Point 가아님 n 적합한 (roer) 상속예 : NamedPoint extends Point NamedPoint 는 Point 가맞음 30 kkman@sangji.ac.kr, 2012. 10

6.5 다형성소개 다형성정의 다형성이란? n 여러타입의데이터를다룰수있는기능 n 상속을이용하면수퍼클래스를이용하여다형성을자동으로처리할수있다. 상속이없었다면 n Point, q, NamedPoint r, s 에대해 4 가지거리계산을구현해야함 n 상속을이용하면모두 Point 의 distancefrom 으로처리할수있음 q.distancefrom(q).distancefrom(s) r r.distancefrom(q) r.distancefrom(s) s 32 CalcDistance (1/2) 창병모, 우균 33 kkman@sangji.ac.kr, 2012. 11

CalcDistance (2/2) 34 CalcDistance 실행결과 다형성의강력한효과 n Point 에만 distancefrom 을정의하면 n Point 와 NamedPoint 에모두사용할수있음 실행결과 ============================ 첫번째점의좌표 x 와 y 를입력하세요. 1 2 두번째점의좌표 x 와 y 를입력하세요. 4 6 세번째점의이름과좌표 x, y 를입력하세요. R 2 3 네번째점의이름과좌표 x, y 를입력하세요. S 5 7 (1, 2) 과 ( 와 ) (4, 6) 사이의거리 = 5.00 (1, 2) 과 ( 와 ) R(2, 3) 사이의거리 = 1.41 R(2, 3) 과 ( 와 ) (4, 6) 사이의거리 = 3.61 R(2, 3) 과 ( 와 ) S(5, 7) 사이의거리 = 5.00 35 6.6 상속과다형성정리 kkman@sangji.ac.kr, 2012. 12

객체지향프로그래밍 객체지향설계방법 n 문제를서술하고문제의명사는객체로, 형용사와동사는메소드로만든다. n 메소드를설계할때는입출력데이터 ( 시그너처, signature) 를정하고입력데이터를출력데이터로만드는방법 ( 알고리즘, algorithm) 을결정한다. 절차지향 vs. 객체지향 n 절차지향적프로그래밍에서는알고리즘을가장중요하게생각했었음 n 객체지향적프로그래밍은객체의관계에초점을맞춤 n 알고리즘이중요하지않다는뜻은아님 37 상속의역할과다형성 상속의역할 n 프로그램의요구사항이변경되었을때유연하게대처할수있음 n 현재가지고있는클래스를확장함으로써요구사항을수용할수있을가능성이높아짐 다형성 n 수퍼클래스를통해여러객체를일관된방법으로다룰수있음 n C 에서 union 을사용했던프로그램은 Java 의서브클래스로구현하는것이바람직함 38 마지막리팩토링 : 메소드이동 CalcDistance 클래스의다음두메소드이동 rivate static Point readpoint(scanner scan, String romt); rivate static NamedPoint readnamedpoint(scanner scan, String romt); 어디로이동할까? n 각각 Point와 NamedPoint로 n 가시성은? à ublic 메소드이동방법 1. 메소드이름선택후 Refactor à Move 2. 목적지클래스입력 3. 리팩토링결과미리보기및검토 39 kkman@sangji.ac.kr, 2012. 13

마지막리팩토링수행단계 1. Refactor à Move 2. 목적지클래스입력 3. 가시성변경경고 4. 결과미리보기 40 Point 이동된메소드 default 가시성을 ublic 으로바꿈 41 Named Point 이동된메소드 default 가시성을 ublic 으로바꿈 42 kkman@sangji.ac.kr, 2012. 14

CalcDistance 창병모, 우균 43 메소드두개가이동되어간단해졌음변경사항 n readpoint à Point.readPoint n readnamedpoint à NamedPoint.readNamedPoint Refactoring 이제어떤객체를입력받는지알수있으므로 rename을수행해도됨 readpoint à read readnamedpoint à read 6.7 클래스계층 클래스계층다이어그램 클래스계층트리 n Java 에서상속관계가복잡해지면클래스계층다이어그램이트리형태가될수있음 n 다중상속을허용하는경우에는비순환방향그래프 (DAG: directed acyclic grah) 가될수도있음 은행계좌클래스계층트리예 n 저축계좌 (SavingsAccount) n 입출금계좌 (CheckingAccount) Account SavingsAccount CheckingAccount 45 kkman@sangji.ac.kr, 2012. 15

Account 클래스필드 n serialaccid: 유일한계좌번호를부여하기위한것임 인스턴스필드 n accid: 계좌번호 n balance: 잔액 창병모, 우균 46 SavingsAccount 와 CheckingAccount Account 47 PrintAccounts 다형성 : account.tostring() 은 account 객체가무엇인가에따라알맞은내용을출력해준다. 실행결과 ============================ Account(1: 0.0) Savings(2: 0.0) Checking(3: 창병모, 우균 0.0) 48 kkman@sangji.ac.kr, 2012. 16

두단계클래스계층 클래스계층은여러단계일수있다. 마이너스통장계좌 n 마이너스통장계좌는입출금계좌임 n LoanAccount IS-A CheckingAccount Account SavingsAccount CheckingAccount LoanAccount 49 LoanAccount 클래스필드 n defaultapr: 기본대출이율 인스턴스필드 n loanapr: 대출이율 n loanlimit: 대출한도 창병모, 우균 50 PrintAccounts 다형성 : Account 클래스의 tostring() 메소드는 CheckingAccount 뿐만아니라 LoanAccount 에대해서도다형성이적용된다. 실행결과 ============================ Account(1: 0.0) Savings(2: 0.0) Checking(3: 창병모, 우균 0.0) 51 LoanAccount(4: 0.0)[Loan Limit: 1000, APR: 20.0%] kkman@sangji.ac.kr, 2012. 17

추상클래스 한번생각해볼것 n 'Account 객체 ' 라는것이존재하는가? n 은행에가서 ' 그냥계좌 ' 를개설해달라고하면계좌를개설해주는가? à ' 그냥계좌 ' 는없다. Account 객체는없다! 추상클래스 n 객체를만들수없는클래스 n 다형성만을위해만들어진클래스 n 추상클래스는이탤릭으로나타냄 n Java 에서추상클래스는 abstract 키워드로정의함 52 추상클래스 Account Account SavingsAccount CheckingAccount LoanAccount 창병모, 우균 53 최종클래스 최종클래스란? n 상속받을수없는클래스 n 따라서어떤클래스의수퍼클래스도될수없음 최종클래스만들기 n 클래스를선언할때키워드 final 을이용하여선언함 n 예 ) LoanAccount 를최종클래스를만들기 ublic final class LoanAccount extends ChekingAccount { } 54 kkman@sangji.ac.kr, 2012. 18

Key Point Key Point 1 어떤대상을클래스로정할것인지결정하고데이터필드타입과메소드시그너처를결정하는것을클래스설계라고한다. 다른클래스의필드와메소드를그대로물려받아서새로운클래스를정의하는방법을상속이라고하는데, 상속을이용하면유사한클래스사이의중복을해결할수있다. 이때기존클래스를수퍼클래스라고하고새로정의한클래스를서브클래스라고한다. 두클래스사이에 'AA는 A다 (AA IS-A A) 라는관계가성립한다면 A 를 AA의수퍼클래스로설계해야한다. 클래스다이어그램에서 IS-A 관계는하얀삼각형 ( ) 꼭지화살표로나타내며, 서브클래스에서수퍼클래스로향하는방향으로화살표를그어나타낸다. 수퍼클래스의생성자를호출하는문장은반드시생성자의첫번째문장으로나타나야한다. 이때키워드 suer를사용하여호출한다. 보호필드는클래스외부에서는볼수없지만, 서브클래스에서는볼수있다. 56 Key Point 2 서브클래스에서수퍼클래스의메소드를다시정의하는것을메소드재정의, 메소드오버라이딩이라고부르는데, 이때서브클래스에서수퍼클래스의메소드를호출할때도키워드 suer를사용한다. 객체 의메소드 m에대하여.m(...) 형태의메소드호출을메시지라고하며이때 를메시지수신자라고부른다. 여러타입을한가지타입인것처럼다룰수있는특성을다형성이라고한다. 상속관계 (IS-A 관계 ) 를통해서이루어지는클래스사이의계층을클래스계층이라고한다. 구체적인객체에따라서호출되는메소드가결정되는것을메소드호출동적바인딩이라고하는데, 상속관계에있는객체사이의다형성은메소드호출동적바인딩을통해이루어진다. 자신은객체를생성할수없으나객체를생성할수있는클래스들을묶기위한클래스를추상클래스라고하는데, Java에서추상클래스는키워드 abstract를이용하여정의한다. 더이상확장할수없는클래스를최종클래스라고하는데, Java에서는키워드 final을이용하여최종클래스를정의한다. 57 kkman@sangji.ac.kr, 2012. 19

Key Point: 리팩토링 프로그램의수행내용을변경시키지않으면서도복잡하게얽힌프로그램의내부구조를깔끔하게정리하는것을리팩토링이라고한다. 리팩토링을수행하면프로그램을읽기쉽게바꿀수있으며결과적으로프로그램유지보수에도움이된다. 메소드추출이란프로그램의일정부분을별도의메소드로정의하는기법이다. 매개변수도출이란메소드내의특정수식을별개의매개변수로정의하는기법이다. 클래스를작성하기위해서는클래스이름, 데이터필드, 메소드등을정해야한다. 코드중복이란프로그램의여러곳에같은코드가사용되는현상을말하는데, 코드중복이발생하면프로그램을관리하기가매우어려워진다. 58 프로그래밍실습 프로그래밍실습 1 1. 택시거리 (taxicab distance, Manhattan distance) n 유클리드공간이아닌다른공간을가정하면두점사이의거리를다르게정의할수있다. 예컨대정사각형블록구획으로구성된공간을가정하면두점 (x1, y1) 과 (x2, y2) 사이의거리는각좌표의차를합한것으로정의할수있다. x1 - x2 + y1 - y2 n 택시거리를계산하기위한점클래스 TaxicabPoint 를작성하라. 단, 이장에서작성한 Point 클래스의서브클래스로작성하고 distancefrom 메소드를재정의하여택시거리를계산하도록하라. 60 kkman@sangji.ac.kr, 2012. 20

프로그래밍실습 2 2. 연결리스트 n 상속을이용하여연결리스트를구현하라. 연결리스트 List 는 NullList 이거나 Pair 둘중의하나로구현된다. n List 클래스와이클래스의서브클래스로 NullList 와 Pair 를작성하라. List 클래스에는 isnull, ispair, first, second, tostring 등의메소드를구현한다. n 이들메소드는모두하위클래스에서재지정해야한다. NullList 객체에대해서 isnull 을호출하면 true 가되지만 ispair 는 false 가된다. Pair 객체에대해서는그반대가된다. 61 프로그래밍실습 2 ( 계속 ) n List 객체는 Pair 와 NullList 생성자로만든다. 예 ) List list = new Pair(1, new Pair(2, new Pair(3, new NullList()))) n first 와 second 메소드는각각 Pair 의정수와 List 객체를돌려준다. first 는 NullList 객체에대해서는정의되지않는다. NullList 객체에대해 second 가호출된다면 NullList 객체자신을리턴한다. 예 ) int num = list.second().first(); n List 의 tostring 메소드는리스트를문자열로출력한다. 예 예 ) list.tostring() 은 [1 2 3] 62 kkman@sangji.ac.kr, 2012. 21