144
객객객객객객객객객 객객객 uEngine.org 객객객객

객체지향프로그래밍 특강

Embed Size (px)

Citation preview

Page 1: 객체지향프로그래밍 특강

객체지향프로그래밍

장진영 uEngine.org 대표이사

Page 2: 객체지향프로그래밍 특강

목차• 객체지향프로그래밍 (OOP) 이란 ?• OOP 기초 실습 ( 인피니티 북스 )• OOP 와 개발 조직• OOP 와 클라우드 컴퓨팅 구현

Page 3: 객체지향프로그래밍 특강

목차• 객체지향프로그래밍 (OOP) 이란 ?• OOP 기초 실습 ( 인피니티 북스 )• OOP 와 개발 조직• OOP 와 클라우드 컴퓨팅 구현

Page 4: 객체지향프로그래밍 특강

프로그램이란 ?

• 컴퓨터에서 동작하는 현실세계의 시뮬레이션• 모든 종류의 컴퓨터에 동작할 수 있어야 함• 프로그래밍에는 현실세계를 표현 하기 위한 일종의 패러다임이 필요

Page 5: 객체지향프로그래밍 특강

컴퓨터란 ?

Page 6: 객체지향프로그래밍 특강

컴퓨터란 ?

• 생각하는 기계• 생각은 왜 하는가 ?• 미래를 예측하기 위하여• 현실세계를 시뮬레이션 하는 것

Page 7: 객체지향프로그래밍 특강

패러다임이란 ?

• 사고의 방식 체계• 일관성과 완전성을 갖춤• 프로그래밍 패러다임의 여러 종류

• 절차적 프로그래밍 vs 선언형 프로그래밍 • 객체 지향 프로그래밍• 관점 지향 프로그래밍• 함수형 프로그래밍

Page 8: 객체지향프로그래밍 특강

객체지향 프로그래밍 패러다임• 컴퓨팅 성능 중심 개발 인건비 중심• 인간의 사고체계와 가장 유사

• 뉴런 ( 데이터와 함수 )• 시냅스 ( 메시지 )

• 여러 사람이 함께 개발하기 좋은• 분업과 집중

• 여러 컴퓨터가 함께 동작하기 좋은• 대규모 분산 시스템 클라우드 컴퓨팅

Page 9: 객체지향프로그래밍 특강

그래서 , OOP 가 내 인생에 무슨 관계 ?• 세계 일류 소프트웨어 회사들 - 구글 , 인포시스 등 – 의 입사시에 핵심 검증사항 • 숙련된 소프트웨어 개발자와 비숙련자와의 개발 성능 차이는 40 배 , 숙련된 설계자는 개발 비용 차이를 100 이상 차이나게 함 .• 객체지향설계와 프로그래밍은 SW 기업의 경쟁력에 매우 지대한 영향을 미침 .

Page 10: 객체지향프로그래밍 특강

그래도 , OOP 가 왜 필요한지 모르겠다구요 ?• OOP 는 생각 자체를 하는 도구 ( 패러다임 ) 는 아님• 생각을 쪼개고 나누어 해결하는 도구

• 초인지를 활용하는 학생과 아닌 학생• 학습과 성장에 소요되는 시간을 단축

Page 11: 객체지향프로그래밍 특강

목차• 객체지향프로그래밍 (OOP) 이란 ?• OOP 기초 실습 ( 인피니티 북스 )• OOP 와 개발 조직• OOP 와 클라우드 컴퓨팅 구현

Page 12: 객체지향프로그래밍 특강

OOP 의 효과• 분업과 협업

• In Build-time• SW 개발 팀간의• Product Vendor 와 Third-party Vendor 간

• In Run-time • SW 모듈간• 컴퓨터간

Page 13: 객체지향프로그래밍 특강

여러 사람이 일을 하려면 ?

• 관심사의 분리• 구조적 관심 ( 설계관점 )• 세부적 관심 ( 구현관점 )

• 표준화• 메시지 규격• 인터페이스

Page 14: 객체지향프로그래밍 특강

소설 : 개발자 D• 개발자 D 는 이제 중급 개발자 5 년 차이다 . 게으르고 , 잔머리를 잘 쓴다 . 어느 날 본의 아니게 큰 프로젝트를 혼자 맡게 된다 .• 1. 프로젝트 상황 : 프로젝트는 기간이 짧으며 또한 예산도 제한되어 있다 . • 2. 개발자 상황 : 현재 갖춘 개발자는 4 명이며 개발자 D를 제외한 나머지 개발자 A,B,C 는 각자 UI 만 만들줄 아는 사람 , 업무 흐름만 아는 사람 , 그리고 SQL 과

JDBC 를 통해 database 처리만 할 줄 아는 사람이 있다 . • 다행히 개발자 D 는 각 분야에 대해서 어느 정도 지식을 가지고 있지만 그렇다고 개발자 D 혼자서 시스템을 다 만들 수는 없다 . 기간이 제한 되어 있기 때문이다 . 

Page 15: 객체지향프로그래밍 특강

작전이 필요해• 방법은 분업 즉 , 각자의 분야해서 전문성을 가진 개발 부분만을 분리해서 개발하는 분업이 필요하다 . • 개발자 D 는 다년간의 개발 경험을 바탕으로 다음의 3 개 base class 를 만들어 분업을 할 수 있는 골격 클래스를 만들었다 . 

Page 16: 객체지향프로그래밍 특강

UI 관점public class Presentation{     BusinessLogic businessLogic;      public Presentation(BusinessLogic bl){         businessLogic = bl;     }     public BusinessLogic getBusinessLogic(){        return businessLogic;     }     public void doPresentation(){        // 비워둠     }} 

Page 17: 객체지향프로그래밍 특강

Business Logic 관점• public class BusinessLogic{ •     Database database; •  •     public BusinessLogic(Database db){ •         database = db; •     } •  •     public Database  getDatabase(){ return database; } •  •     public void doBusinessLogic(){ // 비워둠 } • }•  

Page 18: 객체지향프로그래밍 특강

Data 관점• public class Database{ •     public void save(){ •         // 비워둠 •     } •  •     public void load(){•         // 비워둠 •     } • } •  

Page 19: 객체지향프로그래밍 특강

전체 관점• public class Application { •     public static void main(String args[]){ •         Presentation presentation = •             new Presentation(•                 new BusinessLogic( •                      new Database() •                 ) •             ); •  •          presentation.doPresentation(); •     } • } 

개발자 D 는 이렇게 했을때 시스템이 원활하게 돌아가는지 확인해보기 위해 다음의 prototype 클래스를 만들어 각 클래스들이 유기적으로 잘 동작하는지 확인해보았다 .

Page 20: 객체지향프로그래밍 특강

• 해보니까 잘 돌아가더라 .. 그래서 이렇게 해놓고 똘똘하면서 잡다하게 많이 아는 개발자 D 는 자기 분야에서 묵묵히 일하는 개발자 A,B,C 를 불러모아 놓고 각 개발자들이 준수해야할 위의 3 가지 클래스들을 넘겨주었다 . • 1 주일후 개발자 A,B,C 는 각각 다음의

derived class 들을 만들어왔다 . 

Page 21: 객체지향프로그래밍 특강

개발자 A /* System.out.println() 밖에 모르는 개발자 */ 

• public class AddressBookPresentation extends Presentation{ •     public AddressBookPresentation(BusinessLogic businessLogic){ •         super(businessLogic); •     } •  •     public void doPresentation(){•         System.out.println(" 결과값은 : " +

getBusinessLogic().doBusinessLogic() + " 입니다 ."); •     } • } 

Page 22: 객체지향프로그래밍 특강

개발자 B /* 업무 흐름 밖에 모르는 개발자 */  

• public class AddressBookBusinessLogic extends BusinessLogic{ •     public AddressBookBusinessLogic(Database database){ •         super(database); •     } •  •     public void doBusinessLogic(Database database){ •         getDatabase().save(); •         getDatabase().load(); •     } • } •  

Page 23: 객체지향프로그래밍 특강

개발자 C /* JDBC 밖에 모르는 개발자 */  

• public class AddressBookDatabase extends Database{ •     public void save(){ •         sql.query("insert into addressBook values(???)"); •     } •  •     public void load(){ •         sql.query("select ??? from addressBook"); •     } • } 

Page 24: 객체지향프로그래밍 특강

• 그 사이에 개발자 D 는 시스템 전반에 발생할 수 있는 여러가지 문제들을 고민하고 필요할때 마다 개발자 A, B, C 와 협의 했다 . • 자신은 전체 시스템을 동작할 Application

class 를 만드는 막중한 업무가 있다고 하면서 사실은 줄곧 놀았다 . • 개발자 D 가 작성한 코드는 다음과 같이 처음에 만든것에 클래스명만 몇개 바꿨다 . •  

Page 25: 객체지향프로그래밍 특강

개발자 D /* 세부기술 관심없고 전체흐름만 아는 설계자 */   

• public class AddressBookApplication { •     public static void main(String args[]){ •         Presentation presentation = new AddressBookPresentation( •             new AddressBookBusinessLogic( •                  new AddressBookDatabase() •             ) •         );•  •         presentation.doPresentation(); •     } • } 

Page 26: 객체지향프로그래밍 특강

• 그렇게 4 개의 클래스는 미리 각자의 영역에 대한 메서드 관계를 미리 정의 했기때문에 서로 연결되어 바로 동작했다 . • 개발자 A,B,C 는 개발자 D 가 무슨 요술을 부린게 아닌가 의심했다 . • 각자의 영역에서만 개발을 했기 때문에 일은 아주 빠르게 진행되었다 .

Separation of Concerns

Page 27: 객체지향프로그래밍 특강

• 또한 경험 많은 개발자 D 가 작성해준 base class 들은 각자의 개발자가 참조할 다른 영역의 필요한 왠만한 메서드 들이 거의 다 갖추고 있었기 때문에 서로 타협해야 할 부분이 적었다 .

• 또한 이렇게 해놓고 나니 다음과 같은 상황에서도 개발자 D 는 유연히 대처했다 . 

Page 28: 객체지향프로그래밍 특강

상황 1. 고객이 시스템 UI 를 Window version 으로 변경을 요구함 • Presentation 개발자인 개발자 A 를 불러 • AddressBookWindowPresentation 을 만들어오라고 주문

Page 29: 객체지향프로그래밍 특강

개발자 A

• public class AddressBookWindowPresentation extends AddressBookP-resentation{ 

•     public AddressBookWindowPresentation(BusinessLogic business-Logic){ 

•         super(businessLogic); •     } •  •     public void doPresentation(){ •         Frame frame = new Frame(); •         frame.add( new Label (" 결과값은 : "+

getBusinessLogic().doBusinessLogic() + " 입니다 .")); •         frame.show();•     } • } 

Page 30: 객체지향프로그래밍 특강

그리고 다음과 같이 Application을 살짝 바꾼후 • public class AddressBookWindowApplication { •     public static void main(String args[]){ •          Presentation presentation = new AddressBookWindowPresenta-

tion( //•             new AddressBookBusinessLogic( •                  new AddressBookDatabase() •             ) •         ); •  •         presentation.doPresentation(); •     } • } 

• 고객에게 갖다줌 .

Page 31: 객체지향프로그래밍 특강

상황 2.

• 기존에 Oracle 만 썼는데 , 고객사의 지점에서는 SQL server 2000 을 주로 사용하고 있어 시스템의 변경버전을 요구함• 개발자 C 를 불러서 SQL Server 2000 용

SQL 문으로 구성된 AddressBookDatabaseSQL2000 작성을 요구함 마찬가지로 했음

Page 32: 객체지향프로그래밍 특강

* 각각의 상황에서 변경은• 이외의 클래스들은 영향 받지 않고 다른 부분의 개발자들이 참여할 필요도 없었다 . • 어찌 된것인지 고객측이 어떤 천진난만한 요구를 해와도 개발자 D 는 항상 여유로왔다

• Polymorphism• Inversion of Control

Page 33: 객체지향프로그래밍 특강

그리하야 개발자들은…• 프로젝트를 기간보다 빨리 완수하여 … .

Page 34: 객체지향프로그래밍 특강

Terminology 정리• SoC

Separation of Concerns• IoC

Inversion of Control• Polymorphism

Page 35: 객체지향프로그래밍 특강

2 부• 개발자 D..• 그는 지난번에 경험한 프로젝트의 교훈을 가지고 여기저기 다른 프로젝트에도 이전의 경험을 적용하고자 노력하였다 .• 사람이 앉으면 눕고 싶고 , 누우면 자고싶다고 했던가 ?• 점점 갈수록 이젠 개발자들에게 매번 어디를 "채워와라 " 라고 하는 말 자체를 하는것도 귀찮은 것이다 .

Page 36: 객체지향프로그래밍 특강

이것도 어렵고 귀찮다…때때로 , 개발자들은 " 여기를 채워오세요 " 라고 한 부분을 제대로 채워 오지 않는 경우도 또한 종종 있었던 것이다 . 개발자들이 잊지 않고 해당 빈 부분을 정확히 채워서 오도록하고 , 그것을 정확하게 검증할 방법이 없을까 ?

• public class Presentation{ •     BusinessLogic businessLogic; 

•     public Presentation(BusinessLogic bl){ •         businessLogic = bl; •     }•  •     public BusinessLogic getBusinessLogic(){•         return businessLogic; •     }•  •     public void doPresentation(){ •        // 여기를 채워서 오세요 ... •     }• } •  

Page 37: 객체지향프로그래밍 특강

고심한 개발자 D 는• 객체지향 대가 교수님에게 찾아가 해당 문제를 이야기하였다 ... 그 문제를 듣고 • 도사 교수님은 고개를 끄덕이며 .. "ab-

stract!!" 라고 외치며 홀연히 사라졌다 .. • 개발자 D 는 " 그렇지 , abstract... 키워드라는 것이 있구나 , 채워야 할 부분에 대하여 abstract 키워드를 붙이자 .. 그러면 컴파일러 레벨에서 구현여부를 검증해주지 않겠느냐 ...

Page 38: 객체지향프로그래밍 특강

Abstract Presentation• public abstract class Presentation{ •     BusinessLogic businessLogic; •  •  •     public Presentation(BusinessLogic bl){ •         businessLogic = bl; •     }•  •     public BusinessLogic getBusinessLogic(){•         return businessLogic; •     }•  •     public abstract void doPresentation();• } 

Page 39: 객체지향프로그래밍 특강

• 이렇게 바꾸고 나니 , 해당 클래스의 필수구현 부위가 정확히 드러나 이를 구현하지 않았을때는 정확히 컴파일러가 오류를 내도록 가이드가 되었다 . 개발자 D는 일일이 잔소리 하는 수고조차도 귀찮았던 것이다 .

Page 40: 객체지향프로그래밍 특강

• 그렇게 abstract 키워드는 개발자 D 에겐 정말 마음에 드는 키워드였기에 여기저기 막막 사용하였다 .. 그러던 중에 ....• 지금까지는 어플리케이션 로직을 아래와 같이 작성해서 클래스명을 교체하는 방식으로 구현해왔지만 , 이젠 이것 조차도 누구한테 시켜서 할 수 없을까 ... 하는 생각이 드는것이다 .. 

Page 41: 객체지향프로그래밍 특강

Abstract Application

• public abstract class Application{

•     public void run(){•          Presentation presentation = getPresentation();•          BusinessLogic businessLogic = getBusinessLogic();•          Database database = getDatabase();•          businessLogic.setDatabase(database);•          presentation.setBusinessLogic(businessLogic);•  •          presentation.doPresentation();•    }•  •    abstract Presentation getPresentation();•    abstract BusinessLogic getBusinessLogic();•    abstract Database getDatabase();•  •  }

Page 42: 객체지향프로그래밍 특강

• 이렇게 abstract class 를 만든후 , UI 의 조합 , 로직의 조합 , DB 제품별 조합의 다양한 조합된 어플리케이션들을 다른 초급 개발자한테 막막 시켜서 고객사별로 만들어내어도 내부 로직 (run 메서드 ) 의 흐름을 깨트리지 않고 양산이 가능해졌다 .

Page 43: 객체지향프로그래밍 특강

ABC 고객사용 애플리케이션• public ABCCompanyApplication extends Application{•  •     Presentation getPresentation(){•        return new WindowsPresentation();•     }•  •     BusinessLogic getBusinessLogic(){•        return new AddressBookBusinessLogic();•     }•  •     Database getDatabase(){•        return new MSSQLDatabase();•     }• }

Page 44: 객체지향프로그래밍 특강

Application 구조 자체의 개선• Application 구조 자체의 변화가 발생한 경우 개발자 D 는 어떻게 ? 

Page 45: 객체지향프로그래밍 특강

시뮬레이션일 때는 데이터를 남기지 않도록 개선•  public void run(){•          Presentation presentation = getPresentation();•          BusinessLogic businessLogic = getBusinessLogic();•  •          if(simulationMode){•                database = new SimulationDatabase();•          }else{•                database = getDatabase();•          }•  •          businessLogic.setDatabase(database);•          presentation.setBusinessLogic(businessLogic);

•          presentation.doPresentation();•    }

Page 46: 객체지향프로그래밍 특강

• 개발자 D 의 개선사항은 (Abstract Appli-cation 의 변화 ) 모든 고객사의 제품에 바로 반영됨• 상위객체의 개선은 곧 하위객체에 영향을 주기 때문 .

Page 47: 객체지향프로그래밍 특강

목차• 객체지향프로그래밍 (OOP) 이란 ?• OOP 기초 실습 ( 인피니티 북스 )• OOP 와 개발 조직• OOP 와 클라우드 컴퓨팅 구현

Page 48: 객체지향프로그래밍 특강
Page 49: 객체지향프로그래밍 특강
Page 50: 객체지향프로그래밍 특강
Page 51: 객체지향프로그래밍 특강
Page 52: 객체지향프로그래밍 특강
Page 53: 객체지향프로그래밍 특강
Page 54: 객체지향프로그래밍 특강
Page 55: 객체지향프로그래밍 특강

객체지향은 추상화 기법이다• 문제의 복잡성을 ‘클래스’로 단순화함• 즉 , 클래스는 문제의 복잡성을 ‘은닉’해야 하는 의무가 있음 .

• 상속의 다른 의미• public / protected / private keyword 의 존재• 별도 jar파일로 분리

• 추상화의 대상• 정보구조• 생각의 단위• 수행전략 ( 로직 )• SW 의 틀 (디자인 / 구조 )

Page 56: 객체지향프로그래밍 특강

복잡성을 은닉하는 OOP 키워드들• Extends: 상속이라 배우고 , 다음이라 해석한다 :

• Inheritance: 상위객체의 멤버 데이터와 메서드의 ‘구조’를 계승함• Extends:상위객체를 확장하여 새로운 ‘기능’과 ‘구조’를 추가함• Specialize:상위객체를 특정한 목적으로 특성화 시킴• Limit:상위객체를 제약하여 단순화 시킴

Page 57: 객체지향프로그래밍 특강

Class Hierarchy• Interface• Abstract class• Default class• Derived class

• 위로 갈수록 추상적• 밑으로 갈수록 구체적• 위로 갈수록 경력이 오래된 분 , Generalist 들이 작성• 밑으로 갈수록 전문가나 초급자 , Specialist 들이 작성

Page 58: 객체지향프로그래밍 특강

추상화의 대상• 기본 :

• 생각의 덩어리 : 데이터 구조와 기능• 중수 :

• 로직• 커맨드

• 고수 :• 소프트웨어 동작의 구조 자체

Page 59: 객체지향프로그래밍 특강

중수문제• 다음의 For 구문을 객체지향언어를 사용하여 구현하시오 :• For lister = new For(){

public void logic(Object target){System.out.println(target);

}};

Vector vt = new Vector();vt.add("1");vt.add("2");vt.add("3");vt.add("4");vt.add("5");

lister.run(vt);

Page 60: 객체지향프로그래밍 특강
Page 61: 객체지향프로그래밍 특강
Page 62: 객체지향프로그래밍 특강
Page 63: 객체지향프로그래밍 특강
Page 64: 객체지향프로그래밍 특강
Page 65: 객체지향프로그래밍 특강
Page 66: 객체지향프로그래밍 특강
Page 67: 객체지향프로그래밍 특강
Page 68: 객체지향프로그래밍 특강
Page 69: 객체지향프로그래밍 특강
Page 70: 객체지향프로그래밍 특강

캐스팅 ( 바인딩 )

• 어떤 배우를 역할로 Casting 하다 .• 다형성에 의하여 동적인 캐스팅이 가능

Animal me = new Human();if(drunk){ me = new Dog();}me.speak();

Page 71: 객체지향프로그래밍 특강

입력 값으로 동적 캐스팅 (1)

if (“dog”.equlas(args[0]))me = new Dog();

else if (“cat”.equals(args[0])) me = new Cat();else if …else if ……

Page 72: 객체지향프로그래밍 특강

입력 값으로 동적 캐스팅 (2)

Java Reflection API (Class.forName) 을 사용한 동적 바인딩me = (Animal)Class.forName(args[0])

Page 73: 객체지향프로그래밍 특강

동적 캐스팅 – 예제 적용BusinessLogic businessLogic = (BusinessLogic)Class.forName(companyName + “BusinessLogic”);

회사명이 ABC 면 , ABCBusinessLogic.java 가 BusinessLogic 으로 사용됨 .네이밍 일관성 , 소스코드 찾기의 용이성컴포넌트 자산 체계화에 대거 활용

Page 74: 객체지향프로그래밍 특강

구현 예제문제자동차 모델명을 입력하세요 :> BMW원하는 동작을 입력하세요 :1) 가속 2) 모델변경> 1속도 : 10, 연비 : 90> 1속도 : 20, 연비 : 80> 2자동차 모델명을 입력하세요 :> Benz> 1속도 : 20, 연비 : 80> 1속도 : 40, 연비 : 40

Page 75: 객체지향프로그래밍 특강
Page 76: 객체지향프로그래밍 특강
Page 77: 객체지향프로그래밍 특강
Page 78: 객체지향프로그래밍 특강
Page 79: 객체지향프로그래밍 특강
Page 80: 객체지향프로그래밍 특강
Page 81: 객체지향프로그래밍 특강
Page 82: 객체지향프로그래밍 특강
Page 83: 객체지향프로그래밍 특강
Page 84: 객체지향프로그래밍 특강
Page 85: 객체지향프로그래밍 특강
Page 86: 객체지향프로그래밍 특강
Page 87: 객체지향프로그래밍 특강
Page 88: 객체지향프로그래밍 특강
Page 89: 객체지향프로그래밍 특강
Page 90: 객체지향프로그래밍 특강
Page 91: 객체지향프로그래밍 특강
Page 92: 객체지향프로그래밍 특강
Page 93: 객체지향프로그래밍 특강
Page 94: 객체지향프로그래밍 특강
Page 95: 객체지향프로그래밍 특강
Page 96: 객체지향프로그래밍 특강
Page 97: 객체지향프로그래밍 특강
Page 98: 객체지향프로그래밍 특강
Page 99: 객체지향프로그래밍 특강
Page 100: 객체지향프로그래밍 특강
Page 101: 객체지향프로그래밍 특강
Page 102: 객체지향프로그래밍 특강
Page 103: 객체지향프로그래밍 특강
Page 104: 객체지향프로그래밍 특강
Page 105: 객체지향프로그래밍 특강
Page 106: 객체지향프로그래밍 특강
Page 107: 객체지향프로그래밍 특강
Page 108: 객체지향프로그래밍 특강
Page 109: 객체지향프로그래밍 특강
Page 110: 객체지향프로그래밍 특강
Page 111: 객체지향프로그래밍 특강
Page 112: 객체지향프로그래밍 특강
Page 113: 객체지향프로그래밍 특강
Page 114: 객체지향프로그래밍 특강
Page 115: 객체지향프로그래밍 특강
Page 116: 객체지향프로그래밍 특강
Page 117: 객체지향프로그래밍 특강
Page 118: 객체지향프로그래밍 특강

[Tip] 감각적으로 OOP 하기• 어떠한 프로그램의 잘못된 구조를 감각적으로 파악• 자신의 프로그래밍을 하는 과정에서 더욱 강화• 즉 , 잘된 특성과 잘못된 특성을 감정으로 기억하는 것을 강화하는 훈련

Page 119: 객체지향프로그래밍 특강

객체지향답게…란 ?• 응집도는 높고

• 하나의 객체가 다루는 데이터와 기능이 하나로 존재할 때 순도 ( 일관성 ) 가 높다 . • 결합도는 낮게…

• 다른 객체와 메시지를 전달하는 과정에서 다른 객체에 많은 의존성을 가진다 .

Page 120: 객체지향프로그래밍 특강

응집도와 결합도 예시상황• 다른 사람은 놀고 있는데 , 혼자서 바쁜 관리자가 존재하는 경우 ==> 각 담당자가 자기주도적이지 못하거나 팀장이 위임을 못하는 경우 .

• 내 업무의 성격을 넘어선 남의 업무에 간섭을 많이 해야 하는 경우 ==> 업무 분장을 응집도 있게 분배하지 못한 경우 .

Page 121: 객체지향프로그래밍 특강

리팩토링이란 ?• 객체지향스럽게 .. 기존 코드를 재수정하는 것 .• 주로 많은 경험적 노하우와 시간이 필요 .

Page 122: 객체지향프로그래밍 특강

감각으로 리팩토링 하는 법 코드내에 if ~ then ~ else 와 멤버변수 값을 참조하는 “ .” 이 발견되면 이들은 오래된 채권 혹은 불량식품으로 기억하자 .

• if ~ then ~ else• 이들이 보이면 응집도를 높힐 기회가 있다 .

• 메서드 내에 “ .” 들• 이들이 많으면 결합도가 높다는 뜻이다 .

Page 123: 객체지향프로그래밍 특강

목차• 객체지향프로그래밍 (OOP) 이란 ?• OOP 기초 실습 ( 인피니티 북스 )• OOP 와 개발 조직• OOP 와 클라우드 컴퓨팅 구현

Page 124: 객체지향프로그래밍 특강

웹과 클라우드 컴퓨팅의 역사

Page 125: 객체지향프로그래밍 특강

클라우드 컴퓨팅 유래 2006 년 9 월 당시 구글 직원인 크리스토프

비시글리아란 직원이 당시 CEO 인 에렉 슈미츠와의 회의에서 처음 제안

“ 이 구상이 현실화하면 기업과 개인은 별도의 서버나 PC 를 살 필요가 없어집니다 . 소프트웨어든 데이터든 , 온라인에 저장해 놓고 인터넷을 통해 그때그때 빌려 쓰면 되니까요 . ”

클라우드 (cloud) 라는 명칭은 IT 아키텍처 다이어그램에서 인터넷을 구름으로 표현하던 것에서 유래

즉 클라우드 (cloud) 는 인터넷을 의미하고 , 인터넷에 연결된 서비스 제공자의 데이터센터에 접속하여 서비스를 사용하는 것이 클라우드 컴퓨팅 *; cloud = the Internet

-> 서비스 제공자의 대규모 데이터센터

서비스는 컴퓨팅 파워나 스토리지 같은 시스템 리소스 ,플랫폼 , 애플리케이션 등 다양한 것이 될 수 있음

사용자는 웹 브라우저만 사용할 수 있으면 기기 종류에 상관없이 클라우드에 접속하여 원하는 서비스를 필요한 만큼 사용할 수 있고 , 사용량에 따라 비용을 지불함

출처 : Cisco, http://www.itworld.co.kr/news/54623

Page 126: 객체지향프로그래밍 특강

개념 클라우드 컴퓨팅과의 관계GridComputing

높은 컴퓨팅 리소스를 필요로 하는 작업의 수행을 위해 인터넷상의 분산된 다양한 시스템과 자원들을 공유하여 가상의 슈퍼 컴퓨터와 같이 활용하는 방식( 분산 컴퓨팅 아키텍쳐 )

Grid 방식의 분산 컴퓨팅과 Utility 개념의 과금 모형을 혼합한 컴퓨팅 방식- 그리드 : 인터넷상의 모든 컴퓨터 리소스- 클라우드 : 서비스 제공 사업자의 사유 서버 네트워크Utility

Computing컴퓨팅 리소스를 구매 하거나 소유하지 않고 , 가스 전기 등과 같이 유틸리티로 필요할 때마다 사용하는 방식( 사용량기반 과금 모형 )

Server Based Com-puting

서버에 어플리케이션과 데이터를 두고 필요할 때마다 접속해서 사용하는 방식( 클라이언트는 입출만 처리 , 모든 작업은100% 서버가 처리 -Thin Client 방식 )

클라우드 컴퓨팅은 가상화된 분산 컴퓨팅에 , SBC 는 특정 기업의 서버에 중심을 둔다는 차원에서 개념적 으로 구분 , 그러나 SBC 가 발전으로 점차 구분이 모호해짐

NetworkComputing

SBC 와 비슷 하나 , 어플리케이션을 서버에 로드 하여 로컬에서 수행하는 형태( 이용자의 CPU 를 사용하여 동작 )

이용자의 컴퓨팅 리소스 보다는 클라우드 상의 IT 리소스를 사용하므로 개념적으로 구분됨

SaaS 서비스 제공자의 서버에 저장된 SW 를 인터넷을 통해 서비스로 이용하는 SW 딜리버리 모형

클라우드 컴퓨팅은 모든 IT 자원을 서비스로 활용 한다는 차원에서 보다 SaaS 를 포함하는 포괄적인 개념

클라우드 컴퓨팅과 다른 컴퓨팅과의 관계

Page 127: 객체지향프로그래밍 특강

Joseph Pine, “ 경험경제” 1999

경험경제 – 경제적 가치의 변화

원자재

제품

경험가치 가격가치

산업화된 경험

Page 128: 객체지향프로그래밍 특강

격렬한 IT 시장의 변화상 – 왜 ?

혁신의 본질은 기술이 아니다 • 경험의 경제를 간파한자

• 파레토가 아닌 롱테일• 감성과 심미적인 가치

Page 129: 객체지향프로그래밍 특강
Page 130: 객체지향프로그래밍 특강

Cost: Cloud Economy

Page 131: 객체지향프로그래밍 특강

• Cloud Software as a Service (SaaS)• 다수의 사용자에게 온디맨드로 제공되는 애플리케이션 서비스• 예 : Salesforce.com, Google e-mail

• Cloud Platform as a Service (PaaS)• 개발용 플랫폼 또는 애플리케이션 실행에 필요한 소프트웨어 스택• 예 : Google AppEngine

• Cloud Infrastructure as a Service (IaaS)• 서버 또는 스토리지 등을 사용자에게 서비스 형태로 제공• 예 : Amazon AWS

클라우드 컴퓨팅 – 3 가지 서비스 모델

출처 : NIST

Page 132: 객체지향프로그래밍 특강

개발자가 할일 .

1. 아이디어 창출2. 예산확보3. 하드웨어 구입요청4. 하드웨어 취득5. 하드웨어 공간 확보 및 정돈6. OS 설치7. OS 패치 및 패키지 설치8. 계정 생성9. 프레임워크 디플로이10. 미들웨어 디플로이11. 테스팅 툴 디플로이12. 테스팅 툴 테스트13. 코딩14. 멀티태넌시 처리15. 서버 환경 설정 ( 필요한 시

추가구매 )16. 생산완료17. 런칭18. 서버 추가구매 요청19. 승인 응답 대기20. 새로운 서버 디플로이 etc.

1. 아이디어 창출2. 예산확보3. VM 요청4. 프레임워크 디플로이5. 미들웨어 디플로이6. 테스팅 툴 디플로이7. 테스팅 툴 테스트8. 코딩9. 멀티태넌시 처리10. VM 서버 환경 설정11. 생산완료12. 런칭13. VM 서버 추가구매 요청14. 승인 응답 대기15. 새로운 VM 서버에 디플로이 etc.

1. 아이디어 창출2. 예산확보3. 코딩4. 테스트5. 런칭

2000 TODO 2010 TODO 2013 TODO

물리적 환경 .

By IaaS

By PaaS

Page 133: 객체지향프로그래밍 특강

클라우드 컴퓨팅 아키텍쳐

Page 134: 객체지향프로그래밍 특강

클라우드 컴퓨팅의 서비스 구성도

출처 : ETRI

Page 135: 객체지향프로그래밍 특강

Source: upcoming research, Cloud Computing: Not Ready For The Enterprise...Yet.

클라우드 컴퓨팅 아키텍쳐 기본

Page 136: 객체지향프로그래밍 특강

Source: upcoming research, Cloud Computing: Not Ready For The Enterprise...Yet.

클라우드 컴퓨팅 아키텍처 – Workload 관리

Page 137: 객체지향프로그래밍 특강

클라우드 컴퓨팅 구성요소 구현• 네트워킹 서버 구현• 웹서버 (HTTP/Servlet) 구현• 웹기반 분산객체서버 (SOAP/REST) 구현

Page 138: 객체지향프로그래밍 특강

세상에서 가장 짧은 웹서버public abstract class AbstractServer {

public void openServer(int thePort) throws Exception {

ServerSocket server = new ServerSocket(thePort);

while (true) { Socket socket = server.accept();

final InputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream())); final OutputStream out = new BufferedOutputStream(socket.getOutputStream());

Thread sessionHandlingThread = new Thread() {

public void run() { handleSession(in, out); }

};

sessionHandlingThread.start(); } }

public abstract void handleSession(InputStream in, OutputStream out);}

Page 139: 객체지향프로그래밍 특강

세상에서 가장 짧은 웹서버public class HttpServer extends AbstractServer{ @Override public void handleSession(InputStream in, OutputStream out) { PrintWriter pw = new PrintWriter(out); pw.println("HTTP/1.1 200 OK"); pw.println("Date: Fri, 31 Dec 1999 23:59:59 GMT"); pw.println("Content-Type: text/html"); pw.println("Content-Length: 3"); pw.println(""); pw.println("ABC"); pw.flush(); }

public static void main(String... args) throws Exception { new HttpServer().openServer(8080); }}

Page 140: 객체지향프로그래밍 특강

서블릿 서버 만들기• 서블릿서버는 HttpServlet 스펙을 준수해야 한다 .• HttpServlet 스펙은 JSR 에서 관리한다 .• 관리된 스펙은 interface 묶음의 jar 로 인터넷상에 배포된다 .• 이를 준수하는 구현은 서블릿 서버 벤더

( 예 : Jboss, Tomcat, IBM websphere) 가 구현한다 .

Page 141: 객체지향프로그래밍 특강

서블릿 스펙 준수하기

Page 142: 객체지향프로그래밍 특강

서블릿서버의 구현

Page 143: 객체지향프로그래밍 특강

분산객체서버 만들기사용 사니라오 :

public class BankingService implements IBank{ static long balance = 0;  public long getBalance() {   return balance; }  public void deposit(Long amount) {   balance = balance + amount.longValue();   System.out.println(" Server Deposit was called..."); }  public void withdraw(Long amount) {   balance = balance - amount.longValue();   System.out.println(" Server withdraw was called..."); }  public static void main(String[] args) throws Exception{   ApplicationServer applicationServer = new ApplicationServer(null, null);   System.out.println("Application Server has been started up....");    applicationServer.registerServiceObject("Banking Service", new BankingService());   applicationServer.openServer(8080);  } }    이를 다음의 클라이언트로 호출할 수 있는 ApplicationServer.java (extends AbstractServer) 를 개발하라 . package com.uenginesolutions.samples.banking; import com.uenginesolutions.net.ApplicationServer; public class BankingClient {  public static void main(String[] args) throws Exception{   IBank remoteBank = (IBank)ApplicationServer.getRemoteObject("127.0.0.1", "Banking Service", IBank.class);   remoteBank.deposit(new Long(100));   System.out.println(" Client called Deposit...");   remoteBank.withdraw(new Long(10));   System.out.println(" Client called withdraw...");   System.out.println(remoteBank.getBalance()); }}

Page 144: 객체지향프로그래밍 특강

분산객체서버 만들기  이를 다음의 클라이언트로 호출할 수 있는 ApplicationServer.java (extends AbstractServer) 를 개발하라 . package com.uenginesolutions.samples.banking; import com.uenginesolutions.net.ApplicationServer; public class BankingClient {  public static void main(String[] args) throws Exception{   IBank remoteBank = (IBank)ApplicationServer.getRemoteObject("127.0.0.1", "Banking Service", IBank.class);   remoteBank.deposit(new Long(100));   System.out.println(" Client called Deposit...");   remoteBank.withdraw(new Long(10));   System.out.println(" Client called withdraw...");   System.out.println(remoteBank.getBalance()); }}