SlideShare a Scribd company logo
객체지향프로그래밍
장진영 uEngine.org 대표이사
목차
• 객체지향프로그래밍(OOP) 이란?
• OOP 기초 실습 (인피니티 북스)
• OOP 와 개발 조직
• OOP 와 클라우드 컴퓨팅 구현
목차
• 객체지향프로그래밍(OOP) 이란?
• OOP 기초 실습 (인피니티 북스)
• OOP 와 개발 조직
• OOP 와 클라우드 컴퓨팅 구현
프로그램이란?
• 컴퓨터에서 동작하는 현실세계의 시뮬
레이션
• 모든 종류의 컴퓨터에 동작할 수 있어야
함
• 프로그래밍에는 현실세계를 표현 하기
위한 일종의 패러다임이 필요
컴퓨터란?
컴퓨터란?
• 생각하는 기계
• 생각은 왜 하는가?
• 미래를 예측하기 위하여
• 현실세계를 시뮬레이션 하는 것
패러다임이란?
• 사고의 방식 체계
• 일관성과 완전성을 갖춤
• 프로그래밍 패러다임의 여러 종류
• 절차적 프로그래밍 vs 선언형 프로그래밍
• 객체 지향 프로그래밍
• 관점 지향 프로그래밍
• 함수형 프로그래밍
객체지향 프로그래밍 패러다임
• 컴퓨팅 성능 중심  개발 인건비 중심
• 인간의 사고체계와 가장 유사
• 뉴런(데이터와 함수)
• 시냅스(메시지)
• 여러 사람이 함께 개발하기 좋은
• 분업과 집중
• 여러 컴퓨터가 함께 동작하기 좋은
• 대규모 분산 시스템  클라우드 컴퓨팅
그래서, OOP가 내 인생에 무슨
관계?
• 세계 일류 소프트웨어 회사들 - 구글, 인
포시스 등 – 의 입사시에 핵심 검증사항
• 숙련된 소프트웨어 개발자와 비숙련자
와의 개발 성능 차이는 40배, 숙련된 설
계자는 개발 비용 차이를 100이상 차이
나게 함.
• 객체지향설계와 프로그래밍은 SW기업
의 경쟁력에 매우 지대한 영향을 미침.
그래도, OOP가 왜 필요한지 모
르겠다구요?
• OOP는 생각 자체를 하는 도구(패러다임)
는 아님
• 생각을 쪼개고 나누어 해결하는 도구
• 초인지를 활용하는 학생과 아닌 학생
• 학습과 성장에 소요되는 시간을 단축
목차
• 객체지향프로그래밍(OOP) 이란?
• OOP 기초 실습 (인피니티 북스)
• OOP 와 개발 조직
• OOP 와 클라우드 컴퓨팅 구현
OOP의 효과
• 분업과 협업
• In Build-time
• SW 개발 팀간의
• Product Vendor와 Third-party Vendor간
• In Run-time
• SW 모듈간
• 컴퓨터간
여러 사람이 일을 하려면?
• 관심사의 분리
• 구조적 관심 (설계관점)
• 세부적 관심 (구현관점)
• 표준화
• 메시지 규격
• 인터페이스
소설 : 개발자D
• 개발자 D는 이제 중급 개발자 5년 차이다. 게으르고,
잔머리를 잘 쓴다. 어느 날 본의 아니게 큰 프로젝트를
혼자 맡게 된다.
• 1. 프로젝트 상황: 프로젝트는 기간이 짧으며 또한 예
산도 제한되어 있다.
• 2. 개발자 상황: 현재 갖춘 개발자는 4명이며 개발자 D
를 제외한 나머지 개발자 A,B,C는 각자 UI만 만들줄
아는 사람, 업무 흐름만 아는 사람, 그리고 SQL과
JDBC를 통해 database 처리만 할 줄 아는 사람이 있
다.
• 다행히 개발자 D는 각 분야에 대해서 어느 정도 지식을 가지
고 있지만 그렇다고 개발자 D혼자서 시스템을 다 만들 수는
없다. 기간이 제한 되어 있기 때문이다.
작전이 필요해
• 방법은 분업 즉, 각자의 분야해서 전문성
을 가진 개발 부분만을 분리해서 개발하
는 분업이 필요하다.
• 개발자 D는 다년간의 개발 경험을 바탕
으로 다음의 3개 base class를 만들어 분
업을 할 수 있는 골격 클래스를 만들었
다.
UI 관점
public class Presentation{
BusinessLogic businessLogic;
public Presentation(BusinessLogic bl){
businessLogic = bl;
}
public BusinessLogic getBusinessLogic(){
return businessLogic;
}
public void doPresentation(){
//비워둠
}
}
Business Logic 관점
• public class BusinessLogic{
• Database database;
•
• public BusinessLogic(Database db){
• database = db;
• }
•
• public Database getDatabase(){ return database; }
•
• public void doBusinessLogic(){ //비워둠 }
• }
•
Data 관점
• public class Database{
• public void save(){
• //비워둠
• }
•
• public void load(){
• //비워둠
• }
• }
•
전체 관점
• public class Application {
• public static void main(String args[]){
• Presentation presentation =
• new Presentation(
• new BusinessLogic(
• new Database()
• )
• );
•
• presentation.doPresentation();
• }
• }
개발자 D는 이렇게 했을때 시스템이 원활하게 돌아가는지 확인해보기
위해 다음의 prototype클래스를 만들어 각 클래스들이 유기적으로 잘
동작하는지 확인해보았다.
• 해보니까 잘 돌아가더라.. 그래서 이렇게
해놓고 똘똘하면서 잡다하게 많이 아는
개발자 D는 자기 분야에서 묵묵히 일하
는 개발자 A,B,C를 불러모아 놓고 각 개
발자들이 준수해야할 위의 3가지 클래스
들을 넘겨주었다.
• 1주일후 개발자 A,B,C는 각각 다음의
derived class들을 만들어왔다.
개발자 A
/* System.out.println() 밖에 모르는 개발자 */
• public class AddressBookPresentation extends Presentation{
• public AddressBookPresentation(BusinessLogic businessLogic){
• super(businessLogic);
• }
•
• public void doPresentation(){
• System.out.println("결과값은: " +
getBusinessLogic().doBusinessLogic() + " 입니다.");
• }
• }
개발자 B
/* 업무 흐름 밖에 모르는 개발자 */
• public class AddressBookBusinessLogic extends BusinessLogic{
• public AddressBookBusinessLogic(Database database){
• super(database);
• }
•
• public void doBusinessLogic(Database database){
• getDatabase().save();
• getDatabase().load();
• }
• }
•
개발자 C
/* JDBC 밖에 모르는 개발자 */
• public class AddressBookDatabase extends Database{
• public void save(){
• sql.query("insert into addressBook values(???)");
• }
•
• public void load(){
• sql.query("select ??? from addressBook");
• }
• }
• 그 사이에 개발자 D는 시스템 전반에 발
생할 수 있는 여러가지 문제들을 고민하
고 필요할때 마다 개발자 A, B, C와 협의
했다.
• 자신은 전체 시스템을 동작할
Application class를 만드는 막중한 업무
가 있다고 하면서 사실은 줄곧 놀았다.
• 개발자 D가 작성한 코드는 다음과 같이
처음에 만든것에 클래스명만 몇개 바꿨
다.
•
개발자 D
/* 세부기술 관심없고 전체흐름만 아는 설계자
*/
• public class AddressBookApplication {
• public static void main(String args[]){
• Presentation presentation = new AddressBookPresentation(
• new AddressBookBusinessLogic(
• new AddressBookDatabase()
• )
• );
•
• presentation.doPresentation();
• }
• }
• 그렇게 4개의 클래스는 미리 각자의 영
역에 대한 메서드 관계를 미리 정의 했기
때문에 서로 연결되어 바로 동작했다.
• 개발자 A,B,C는 개발자 D가 무슨 요술을
부린게 아닌가 의심했다.
• 각자의 영역에서만 개발을 했기 때문에
일은 아주 빠르게 진행되었다.
 Separation of Concerns
• 또한 경험 많은 개발자 D가 작성해준
base class들은 각자의 개발자가 참조할
다른 영역의 필요한 왠만한 메서드 들이
거의 다 갖추고 있었기 때문에 서로 타협
해야 할 부분이 적었다.
• 또한 이렇게 해놓고 나니 다음과 같은 상
황에서도 개발자 D는 유연히 대처했다.
상황 1.
고객이 시스템 UI를
Window version으로 변경을 요구함
• Presentation 개발자인 개발자 A를 불러
• AddressBookWindowPresentation을 만
들어오라고 주문
개발자 A
• public class AddressBookWindowPresentation extends
AddressBookPresentation{
• public AddressBookWindowPresentation(BusinessLogic
businessLogic){
• super(businessLogic);
• }
•
• public void doPresentation(){
• Frame frame = new Frame();
• frame.add( new Label ("결과값은: "+
getBusinessLogic().doBusinessLogic() + " 입니다."));
• frame.show();
• }
• }
그리고 다음과 같이 Application
을 살짝 바꾼후
• public class AddressBookWindowApplication {
• public static void main(String args[]){
• Presentation presentation = new
AddressBookWindowPresentation( //
• new AddressBookBusinessLogic(
• new AddressBookDatabase()
• )
• );
•
• presentation.doPresentation();
• }
• }
• 고객에게 갖다줌.
상황 2.
• 기존에 Oracle만 썼는데, 고객사의 지점
에서는 SQL server 2000을 주로 사용하
고 있어 시스템의 변경버전을 요구함
• 개발자 C를 불러서 SQL Server 2000용
SQL문으로 구성
된 AddressBookDatabaseSQL2000 작
성을 요구함 마찬가지로 했음
* 각각의 상황에서 변경은
• 이외의 클래스들은 영향 받지 않고 다른
부분의 개발자들이 참여할 필요도 없었
다.
• 어찌 된것인지 고객측이 어떤 천진난만
한 요구를 해와도 개발자 D는 항상 여유
로왔다
• Polymorphism
• Inversion of Control
그리하야 개발자들은…
• 프로젝트를 기간보다 빨리 완수하여 ….
Terminology 정리
• SoC
Separation of Concerns
• IoC
Inversion of Control
• Polymorphism
2부
• 개발자D..
• 그는 지난번에 경험한 프로젝트의 교훈
을 가지고 여기저기 다른 프로젝트에도
이전의 경험을 적용하고자 노력하였다.
• 사람이 앉으면 눕고 싶고, 누우면 자고싶
다고 했던가?
• 점점 갈수록 이젠 개발자들에게 매번 어
디를 "채워와라"라고 하는 말 자체를 하
는것도 귀찮은 것이다.
이것도 어렵고 귀찮다…
때때로, 개발자들은 "여기를 채워오세요"라고 한 부분을 제대로 채워 오지 않는 경우
도 또한 종종 있었던 것이다. 개발자들이 잊지 않고 해당 빈 부분을 정확히 채워서 오
도록하고, 그것을 정확하게 검증할 방법이 없을까?
• public class Presentation{
• BusinessLogic businessLogic;
• public Presentation(BusinessLogic bl){
• businessLogic = bl;
• }
•
• public BusinessLogic getBusinessLogic(){
• return businessLogic;
• }
•
• public void doPresentation(){
• //여기를 채워서 오세요...
• }
• }
고심한 개발자D는
• 객체지향 대가 교수님에게 찾아가 해당
문제를 이야기하였다... 그 문제를 듣고
• 도사 교수님은 고개를 끄덕이며..
"abstract!!" 라고 외치며 홀연히 사라졌
다..
• 개발자 D는 "그렇지, abstract... 키워드
라는 것이 있구나, 채워야 할 부분에 대
하여 abstract 키워드를 붙이자.. 그러면
컴파일러 레벨에서 구현여부를 검증해
주지 않겠느냐...
Abstract Presentation
• public abstract class Presentation{
• BusinessLogic businessLogic;
•
•
• public Presentation(BusinessLogic bl){
• businessLogic = bl;
• }
•
• public BusinessLogic getBusinessLogic(){
• return businessLogic;
• }
•
• public abstract void doPresentation();
• }
•
• 이렇게 바꾸고 나니, 해당 클래스의 필수
구현 부위가 정확히 드러나 이를 구현하
지 않았을때는 정확히 컴파일러가 오류
를 내도록 가이드가 되었다. 개발자D는
일일이 잔소리 하는 수고조차도 귀찮았
던 것이다.
• 그렇게 abstract 키워드는 개발자 D에겐
정말 마음에 드는 키워드였기에 여기저
기 막막 사용하였다.. 그러던 중에....
• 지금까지는 어플리케이션 로직을 아래
와 같이 작성해서 클래스명을 교체하는
방식으로 구현해왔지만, 이젠 이것 조차
도 누구한테 시켜서 할 수 없을까 ... 하는
생각이 드는것이다..
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();
•
• }
• 이렇게 abstract class를 만든후, UI의 조
합, 로직의 조합, DB제품별 조합의 다양
한 조합된 어플리케이션들을 다른 초급
개발자한테 막막 시켜서 고객사별로 만
들어내어도 내부 로직 (run 메서드) 의 흐
름을 깨트리지 않고 양산이 가능해졌다.
ABC 고객사용 애플리케이션
• public ABCCompanyApplication extends Application{
•
• Presentation getPresentation(){
• return new WindowsPresentation();
• }
•
• BusinessLogic getBusinessLogic(){
• return new AddressBookBusinessLogic();
• }
•
• Database getDatabase(){
• return new MSSQLDatabase();
• }
• }
Application 구조 자체의 개선
• Application 구조 자체의 변화가 발생한
경우 개발자 D는 어떻게?
시뮬레이션일 때는 데이터를
남기지 않도록 개선
• 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();
• }
• 개발자 D의 개선사항은 (Abstract
Application의 변화) 모든 고객사의 제품
에 바로 반영됨
• 상위객체의 개선은 곧 하위객체에 영향을
주기 때문.
목차
• 객체지향프로그래밍(OOP) 이란?
• OOP 기초 실습 (인피니티 북스)
• OOP 와 개발 조직
• OOP 와 클라우드 컴퓨팅 구현
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향은 추상화 기법이다
• 문제의 복잡성을 ‘클래스’로 단순화함
• 즉, 클래스는 문제의 복잡성을 ‘은닉’해야 하는
의무가 있음.
• 상속의 다른 의미
• public / protected / private keyword 의 존재
• 별도 jar파일로 분리
• 추상화의 대상
• 정보구조
• 생각의 단위
• 수행전략 (로직)
• SW의 틀 (디자인/구조)
복잡성을 은닉하는 OOP 키워
드들
• Extends: 상속이라 배우고, 다음이라 해석한다:
• Inheritance:
상위객체의 멤버 데이터와 메서드의 ‘구조’를 계승함
• Extends:
상위객체를 확장하여 새로운 ‘기능’과 ‘구조’를 추가함
• Specialize:
상위객체를 특정한 목적으로 특성화 시킴
• Limit:
상위객체를 제약하여 단순화 시킴
Class Hierarchy
• Interface
• Abstract class
• Default class
• Derived class
• 위로 갈수록 추상적
• 밑으로 갈수록 구체적
• 위로 갈수록 경력이 오래된 분, Generalist 들이 작성
• 밑으로 갈수록 전문가나 초급자, Specialist 들이 작성
추상화의 대상
• 기본:
• 생각의 덩어리 : 데이터 구조와 기능
• 중수:
• 로직
• 커맨드
• 고수:
• 소프트웨어 동작의 구조 자체
중수문제
• 다음의 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);
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
캐스팅 (바인딩)
• 어떤 배우를 역할로 Casting 하다.
• 다형성에 의하여 동적인 캐스팅이 가능
Animal me = new Human();
if(drunk){
me = new Dog();
}
me.speak();
입력 값으로 동적 캐스팅 (1)
if (“dog”.equlas(args[0]))
me = new Dog();
else if (“cat”.equals(args[0]))
me = new Cat();
else if …
else if …
…
입력 값으로 동적 캐스팅 (2)
Java Reflection API (Class.forName)을
사용한 동적 바인딩
me = (Animal)Class.forName(args[0])
동적 캐스팅 – 예제 적용
BusinessLogic businessLogic =
(BusinessLogic)Class.forName(company
Name + “BusinessLogic”);
회사명이 ABC면, ABCBusinessLogic.java
가 BusinessLogic으로 사용됨.
네이밍 일관성, 소스코드 찾기의 용이성
컴포넌트 자산 체계화에 대거 활용
구현 예제문제
자동차 모델명을 입력하세요:
> BMW
원하는 동작을 입력하세요:
1) 가속 2) 모델변경
> 1
속도: 10, 연비: 90
> 1
속도: 20, 연비: 80
> 2
자동차 모델명을 입력하세요:
> Benz
> 1
속도: 20, 연비: 80
> 1
속도: 40, 연비: 40
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
객체지향프로그래밍 특강
[Tip] 감각적으로 OOP하기
• 어떠한 프로그램의 잘못된 구조를 감각
적으로 파악
• 자신의 프로그래밍을 하는 과정에서 더
욱 강화
• 즉, 잘된 특성과 잘못된 특성을 감정으로
기억하는 것을 강화하는 훈련
객체지향답게…란?
• 응집도는 높고
• 하나의 객체가 다루는 데이터와 기능이 하
나로 존재할 때 순도(일관성)가 높다.
• 결합도는 낮게…
• 다른 객체와 메시지를 전달하는 과정에서
다른 객체에 많은 의존성을 가진다.
응집도와 결합도 예시상황
• 다른 사람은 놀고 있는데, 혼자서 바쁜
관리자가 존재하는 경우 ==> 각 담당자
가 자기주도적이지 못하거나 팀장이 위
임을 못하는 경우.
• 내 업무의 성격을 넘어선 남의 업무에 간
섭을 많이 해야 하는 경우 ==> 업무 분장
을 응집도 있게 분배하지 못한 경우.
리팩토링이란?
• 객체지향스럽게.. 기존 코드를 재수정하
는 것.
• 주로 많은 경험적 노하우와 시간이 필요.
감각으로 리팩토링 하는 법
코드내에 if ~ then ~ else 와 멤버변수 값을 참조하는 “.” 이 발견되면
이들은 오래된 채권 혹은 불량식품으로 기억하자.
• if ~ then ~ else
• 이들이 보이면 응집도를 높힐 기회가 있다.
• 메서드 내에 “.” 들
• 이들이 많으면 결합도가 높다는 뜻이다.
목차
• 객체지향프로그래밍(OOP) 이란?
• OOP 기초 실습 (인피니티 북스)
• OOP 와 개발 조직
• OOP 와 클라우드 컴퓨팅 구현
웹과 클라우드 컴퓨팅의 역사
클라우드 컴퓨팅 유래
 2006년 9월 당시 구글 직원인 크리스토프
비시글리아란 직원이 당시 CEO인 에렉 슈미츠와의
회의에서 처음 제안
 “이 구상이 현실화하면 기업과 개인은 별도의 서버나
PC를 살 필요가 없어집니다. 소프트웨어든 데이터든,
온라인에 저장해 놓고 인터넷을 통해 그때그때 빌려
쓰면 되니까요. ”
 클라우드(cloud)라는 명칭은 IT 아키텍처
다이어그램에서 인터넷을 구름으로 표현하던 것에서
유래
 즉 클라우드(cloud)는 인터넷을 의미하고, 인터넷에
연결된 서비스 제공자의 데이터센터에 접속하여
서비스를 사용하는 것이 클라우드 컴퓨팅*; cloud = the
Internet
-> 서비스 제공자의 대규모 데이터센터
 서비스는 컴퓨팅 파워나 스토리지 같은 시스템
리소스,플랫폼, 애플리케이션 등 다양한 것이 될 수
있음
출처 : Cisco, http://www.itworld.co.kr/news/54623
개념 클라우드 컴퓨팅과의 관계
Grid
Computing
높은 컴퓨팅 리소스를 필요로 하는 작업
의 수행을 위해 인터넷상의 분산된 다양
한 시스템과 자원들을 공유하여 가상의
슈퍼 컴퓨터와 같이 활용하는 방식
(분산 컴퓨팅 아키텍쳐)
Grid 방식의 분산 컴퓨팅과 Utility 개념의 과
금 모형을 혼합한 컴퓨팅 방식
- 그리드: 인터넷상의 모든 컴퓨터 리소스
- 클라우드: 서비스 제공 사업자의 사유 서버
네트워크
Utility
Computing
컴퓨팅 리소스를 구매 하거나 소유하지
않고, 가스 전기 등과 같이 유틸리티로
필요할 때마다 사용하는 방식
(사용량기반 과금 모형)
Server
Based
Computing
서버에 어플리케이션과 데이터를 두고
필요할 때마다 접속해서 사용하는 방식
(클라이언트는 입출만 처리, 모든 작업
은100% 서버가 처리-Thin Client 방식)
클라우드 컴퓨팅은 가상화된 분산 컴퓨팅에,
SBC는 특정 기업의 서버에 중심을 둔다는
차원에서 개념적 으로 구분, 그러나 SBC가
발전으로 점차 구분이 모호해짐
Network
Computing
SBC와 비슷 하나, 어플리케이션을 서버
에 로드 하여 로컬에서 수행하는 형태
(이용자의 CPU를 사용하여 동작)
이용자의 컴퓨팅 리소스 보다는 클라우드 상
의 IT 리소스를 사용하므로 개념적으로 구분
됨
SaaS 서비스 제공자의 서버에 저장된 SW를
인터넷을 통해 서비스로 이용하는 SW
딜리버리 모형
클라우드 컴퓨팅은 모든 IT자원을 서비스로
활용 한다는 차원에서 보다 SaaS를 포함하
는 포괄적인 개념
클라우드 컴퓨팅과 다른 컴퓨팅과의 관계
Joseph Pine, “경험경제” 1999
원자재
제품
경험가치 가격가치
산업화된 경험
혁신의 본질은 기술이 아니다
• 경험의 경제를 간파한자
• 파레토가 아닌 롱테일
• 감성과 심미적인 가치
객체지향프로그래밍 특강
Cost: Cloud Economy
• 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
개발자가 할일.
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
클라우드 컴퓨팅 아키
텍쳐
클라우드 컴퓨팅의 서비스 구성도
출처 : ETRI
Source: upcoming research, Cloud Computing: Not Ready For The Enterprise...Yet.
클라우드 컴퓨팅 아키텍쳐 기본
Source: upcoming research, Cloud Computing: Not Ready For The Enterprise...Yet.
클라우드 컴퓨팅 아키텍처 – Workload 관리
클라우드 컴퓨팅 구성요소 구
현
• 네트워킹 서버 구현
• 웹서버 (HTTP/Servlet) 구현
• 웹기반 분산객체서버 (SOAP/REST) 구
현
세상에서 가장 짧은 웹서버
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);
}
세상에서 가장 짧은 웹서버
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);
}
}
서블릿 서버 만들기
• 서블릿서버는 HttpServlet 스펙을 준수해
야 한다.
• HttpServlet 스펙은 JSR에서 관리한다.
• 관리된 스펙은 interface 묶음의 jar로 인
터넷상에 배포된다.
• 이를 준수하는 구현은 서블릿 서버 벤더
(예: Jboss, Tomcat, IBM websphere) 가
구현한다.
서블릿 스펙 준수하기
서블릿서버의 구현
분산객체서버 만들기
사용 사니라오:
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());
}
}

More Related Content

What's hot

Open Cloud Engine PaaS Snapshots
Open Cloud Engine PaaS SnapshotsOpen Cloud Engine PaaS Snapshots
Open Cloud Engine PaaS Snapshots
uEngine Solutions
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱
NAVER D2
 
Spring boot와 docker를 이용한 msa
Spring boot와 docker를 이용한 msaSpring boot와 docker를 이용한 msa
Spring boot와 docker를 이용한 msa
흥래 김
 
iOS9 소개
iOS9 소개iOS9 소개
iOS9 소개
Jae Sung Park
 
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
uEngine Solutions
 
Universal Rendering
Universal RenderingUniversal Rendering
Universal Rendering
Taegon Kim
 
목적에 맞게 Angular, React, Vue
목적에 맞게 Angular, React, Vue목적에 맞게 Angular, React, Vue
목적에 맞게 Angular, React, Vue
Gunhee Lee
 
Front end dev 2016 & beyond
Front end dev 2016 & beyondFront end dev 2016 & beyond
Front end dev 2016 & beyond
Jae Sung Park
 
GitLab Premium 라이선스 기능소개 - 인포그랩
GitLab Premium 라이선스 기능소개 - 인포그랩GitLab Premium 라이선스 기능소개 - 인포그랩
GitLab Premium 라이선스 기능소개 - 인포그랩
InfoGrab LC
 
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
Terry Cho
 
[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?
[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?
[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?
NAVER Engineering
 
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
중선 곽
 
Micro Service Architecture(MSA) 탐방기
Micro Service Architecture(MSA) 탐방기Micro Service Architecture(MSA) 탐방기
Micro Service Architecture(MSA) 탐방기
jbugkorea
 
[24]안드로이드 웹뷰의 모든것
[24]안드로이드 웹뷰의 모든것[24]안드로이드 웹뷰의 모든것
[24]안드로이드 웹뷰의 모든것
NAVER Engineering
 
마이크로서비스 개요
마이크로서비스 개요마이크로서비스 개요
마이크로서비스 개요
Younghun Yun
 
야, 너두 짤수있어 - IaC Basic(210131 김성익)
야, 너두 짤수있어 - IaC Basic(210131 김성익)야, 너두 짤수있어 - IaC Basic(210131 김성익)
야, 너두 짤수있어 - IaC Basic(210131 김성익)
SeongIkKim2
 
Tomcat monitoring using_javamelody
Tomcat monitoring using_javamelodyTomcat monitoring using_javamelody
Tomcat monitoring using_javamelody
중선 곽
 
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
VMware Tanzu Korea
 
01.모바일 프레임워크 이론
01.모바일 프레임워크 이론01.모바일 프레임워크 이론
01.모바일 프레임워크 이론
Hankyo
 
모바일 Rpg 게임서버 제작
모바일 Rpg 게임서버 제작모바일 Rpg 게임서버 제작
모바일 Rpg 게임서버 제작
기환 천
 

What's hot (20)

Open Cloud Engine PaaS Snapshots
Open Cloud Engine PaaS SnapshotsOpen Cloud Engine PaaS Snapshots
Open Cloud Engine PaaS Snapshots
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱
 
Spring boot와 docker를 이용한 msa
Spring boot와 docker를 이용한 msaSpring boot와 docker를 이용한 msa
Spring boot와 docker를 이용한 msa
 
iOS9 소개
iOS9 소개iOS9 소개
iOS9 소개
 
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
클라우드 서비스운영 플랫폼 가루다 Open cloudengine_패스트캣_cto 송상욱
 
Universal Rendering
Universal RenderingUniversal Rendering
Universal Rendering
 
목적에 맞게 Angular, React, Vue
목적에 맞게 Angular, React, Vue목적에 맞게 Angular, React, Vue
목적에 맞게 Angular, React, Vue
 
Front end dev 2016 & beyond
Front end dev 2016 & beyondFront end dev 2016 & beyond
Front end dev 2016 & beyond
 
GitLab Premium 라이선스 기능소개 - 인포그랩
GitLab Premium 라이선스 기능소개 - 인포그랩GitLab Premium 라이선스 기능소개 - 인포그랩
GitLab Premium 라이선스 기능소개 - 인포그랩
 
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
 
[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?
[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?
[21]변화의 시대 : 안드로이드 앱 어떻게 개발할 것인가?
 
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
 
Micro Service Architecture(MSA) 탐방기
Micro Service Architecture(MSA) 탐방기Micro Service Architecture(MSA) 탐방기
Micro Service Architecture(MSA) 탐방기
 
[24]안드로이드 웹뷰의 모든것
[24]안드로이드 웹뷰의 모든것[24]안드로이드 웹뷰의 모든것
[24]안드로이드 웹뷰의 모든것
 
마이크로서비스 개요
마이크로서비스 개요마이크로서비스 개요
마이크로서비스 개요
 
야, 너두 짤수있어 - IaC Basic(210131 김성익)
야, 너두 짤수있어 - IaC Basic(210131 김성익)야, 너두 짤수있어 - IaC Basic(210131 김성익)
야, 너두 짤수있어 - IaC Basic(210131 김성익)
 
Tomcat monitoring using_javamelody
Tomcat monitoring using_javamelodyTomcat monitoring using_javamelody
Tomcat monitoring using_javamelody
 
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
숨겨진 마이크로서비스: 초고속 응답과 고가용성을 위한 캐시 서비스 디자인
 
01.모바일 프레임워크 이론
01.모바일 프레임워크 이론01.모바일 프레임워크 이론
01.모바일 프레임워크 이론
 
모바일 Rpg 게임서버 제작
모바일 Rpg 게임서버 제작모바일 Rpg 게임서버 제작
모바일 Rpg 게임서버 제작
 

Similar to 객체지향프로그래밍 특강

도메인주도설계
도메인주도설계도메인주도설계
도메인주도설계
Wonjun Hwang
 
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
NAVER D2
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
devCAT Studio, NEXON
 
모바일, 클라우드, 웹 환경에 필요한 DB관리 II
모바일, 클라우드, 웹 환경에 필요한 DB관리 II모바일, 클라우드, 웹 환경에 필요한 DB관리 II
모바일, 클라우드, 웹 환경에 필요한 DB관리 II
mosaicnet
 
VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리
Gyuwon Yi
 
개발 생산성 향상 기법 V1.2
개발 생산성 향상 기법 V1.2개발 생산성 향상 기법 V1.2
개발 생산성 향상 기법 V1.2
Daniel Lim
 
좋은 개발자 되기
좋은 개발자 되기좋은 개발자 되기
좋은 개발자 되기
Sunghyouk Bae
 
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Sa-ryong Kang
 
프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들
Lee Geonhee
 
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
Hee Jae Lee
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
Chris Ohk
 
커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님
NAVER D2
 
좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON
Younghan Kim
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
devCAT Studio, NEXON
 
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가? Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
정민 안
 
H사 개인화 Approach
H사 개인화 ApproachH사 개인화 Approach
H사 개인화 Approach
ssuser9a50211
 
Approach
ApproachApproach
Approach
ssuser9a50211
 
DDD 그게 뭔데 (개념 찍먹편)
DDD 그게 뭔데 (개념 찍먹편)DDD 그게 뭔데 (개념 찍먹편)
DDD 그게 뭔데 (개념 찍먹편)
명석 고
 
격변하는 프로그래밍 언어, 이제는 Let it go
격변하는 프로그래밍 언어, 이제는 Let it go격변하는 프로그래밍 언어, 이제는 Let it go
격변하는 프로그래밍 언어, 이제는 Let it go
Chris Ohk
 
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
Amazon Web Services Korea
 

Similar to 객체지향프로그래밍 특강 (20)

도메인주도설계
도메인주도설계도메인주도설계
도메인주도설계
 
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
[네이버오픈소스세미나] egjs-view360 개발기 - 김희재
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
 
모바일, 클라우드, 웹 환경에 필요한 DB관리 II
모바일, 클라우드, 웹 환경에 필요한 DB관리 II모바일, 클라우드, 웹 환경에 필요한 DB관리 II
모바일, 클라우드, 웹 환경에 필요한 DB관리 II
 
VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리
 
개발 생산성 향상 기법 V1.2
개발 생산성 향상 기법 V1.2개발 생산성 향상 기법 V1.2
개발 생산성 향상 기법 V1.2
 
좋은 개발자 되기
좋은 개발자 되기좋은 개발자 되기
좋은 개발자 되기
 
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
 
프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들
 
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
 
커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님
 
좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가? Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
 
H사 개인화 Approach
H사 개인화 ApproachH사 개인화 Approach
H사 개인화 Approach
 
Approach
ApproachApproach
Approach
 
DDD 그게 뭔데 (개념 찍먹편)
DDD 그게 뭔데 (개념 찍먹편)DDD 그게 뭔데 (개념 찍먹편)
DDD 그게 뭔데 (개념 찍먹편)
 
격변하는 프로그래밍 언어, 이제는 Let it go
격변하는 프로그래밍 언어, 이제는 Let it go격변하는 프로그래밍 언어, 이제는 Let it go
격변하는 프로그래밍 언어, 이제는 Let it go
 
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
 

More from uEngine Solutions

이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
uEngine Solutions
 
비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
uEngine Solutions
 
Event storming based msa training commerce example add_handson_v3
Event storming based msa training commerce example add_handson_v3Event storming based msa training commerce example add_handson_v3
Event storming based msa training commerce example add_handson_v3
uEngine Solutions
 
Event storming based msa training commerce example v2
Event storming based msa training commerce example v2Event storming based msa training commerce example v2
Event storming based msa training commerce example v2
uEngine Solutions
 
Event storming based msa training commerce example
Event storming based msa training commerce exampleEvent storming based msa training commerce example
Event storming based msa training commerce example
uEngine Solutions
 
Event Storming and Implementation Workshop
Event Storming and Implementation WorkshopEvent Storming and Implementation Workshop
Event Storming and Implementation Workshop
uEngine Solutions
 
designing, implementing and delivering microservices with event storming, spr...
designing, implementing and delivering microservices with event storming, spr...designing, implementing and delivering microservices with event storming, spr...
designing, implementing and delivering microservices with event storming, spr...
uEngine Solutions
 
Microservice coding guide
Microservice coding guideMicroservice coding guide
Microservice coding guide
uEngine Solutions
 
Safe cloud native transformation approaches
Safe cloud native transformation approachesSafe cloud native transformation approaches
Safe cloud native transformation approaches
uEngine Solutions
 
microservice architecture public education v2
microservice architecture public education v2microservice architecture public education v2
microservice architecture public education v2
uEngine Solutions
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementation
uEngine Solutions
 
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
uEngine Solutions
 
Distributed transanction in microservices
Distributed transanction in microservicesDistributed transanction in microservices
Distributed transanction in microservices
uEngine Solutions
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementation
uEngine Solutions
 
Micro service architecture
Micro service architectureMicro service architecture
Micro service architecture
uEngine Solutions
 
Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례
uEngine Solutions
 
Building multi tenancy enterprise applications - quick
Building multi tenancy enterprise applications - quickBuilding multi tenancy enterprise applications - quick
Building multi tenancy enterprise applications - quick
uEngine Solutions
 
Building multi tenancy enterprise applications
Building multi tenancy enterprise applicationsBuilding multi tenancy enterprise applications
Building multi tenancy enterprise applications
uEngine Solutions
 
Metaworks4 intro
Metaworks4 introMetaworks4 intro
Metaworks4 intro
uEngine Solutions
 
성공적인 서비스로의 플랫폼 선택
성공적인 서비스로의 플랫폼 선택성공적인 서비스로의 플랫폼 선택
성공적인 서비스로의 플랫폼 선택
uEngine Solutions
 

More from uEngine Solutions (20)

이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
이벤트스토밍과 BDD 를 혼합하여 소프트웨어 디자인과 테스트 자동화하기
 
비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
비대면 MSA / CNA 강의 - Contactless Microservices Architecture Learning
 
Event storming based msa training commerce example add_handson_v3
Event storming based msa training commerce example add_handson_v3Event storming based msa training commerce example add_handson_v3
Event storming based msa training commerce example add_handson_v3
 
Event storming based msa training commerce example v2
Event storming based msa training commerce example v2Event storming based msa training commerce example v2
Event storming based msa training commerce example v2
 
Event storming based msa training commerce example
Event storming based msa training commerce exampleEvent storming based msa training commerce example
Event storming based msa training commerce example
 
Event Storming and Implementation Workshop
Event Storming and Implementation WorkshopEvent Storming and Implementation Workshop
Event Storming and Implementation Workshop
 
designing, implementing and delivering microservices with event storming, spr...
designing, implementing and delivering microservices with event storming, spr...designing, implementing and delivering microservices with event storming, spr...
designing, implementing and delivering microservices with event storming, spr...
 
Microservice coding guide
Microservice coding guideMicroservice coding guide
Microservice coding guide
 
Safe cloud native transformation approaches
Safe cloud native transformation approachesSafe cloud native transformation approaches
Safe cloud native transformation approaches
 
microservice architecture public education v2
microservice architecture public education v2microservice architecture public education v2
microservice architecture public education v2
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementation
 
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
유엔진 오픈소스 클라우드 플랫폼 (uEngine Microservice architecture Platform)
 
Distributed transanction in microservices
Distributed transanction in microservicesDistributed transanction in microservices
Distributed transanction in microservices
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementation
 
Micro service architecture
Micro service architectureMicro service architecture
Micro service architecture
 
Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례Bluemix paas 기반 saas 개발 사례
Bluemix paas 기반 saas 개발 사례
 
Building multi tenancy enterprise applications - quick
Building multi tenancy enterprise applications - quickBuilding multi tenancy enterprise applications - quick
Building multi tenancy enterprise applications - quick
 
Building multi tenancy enterprise applications
Building multi tenancy enterprise applicationsBuilding multi tenancy enterprise applications
Building multi tenancy enterprise applications
 
Metaworks4 intro
Metaworks4 introMetaworks4 intro
Metaworks4 intro
 
성공적인 서비스로의 플랫폼 선택
성공적인 서비스로의 플랫폼 선택성공적인 서비스로의 플랫폼 선택
성공적인 서비스로의 플랫폼 선택
 

객체지향프로그래밍 특강

  • 2. 목차 • 객체지향프로그래밍(OOP) 이란? • OOP 기초 실습 (인피니티 북스) • OOP 와 개발 조직 • OOP 와 클라우드 컴퓨팅 구현
  • 3. 목차 • 객체지향프로그래밍(OOP) 이란? • OOP 기초 실습 (인피니티 북스) • OOP 와 개발 조직 • OOP 와 클라우드 컴퓨팅 구현
  • 4. 프로그램이란? • 컴퓨터에서 동작하는 현실세계의 시뮬 레이션 • 모든 종류의 컴퓨터에 동작할 수 있어야 함 • 프로그래밍에는 현실세계를 표현 하기 위한 일종의 패러다임이 필요
  • 6. 컴퓨터란? • 생각하는 기계 • 생각은 왜 하는가? • 미래를 예측하기 위하여 • 현실세계를 시뮬레이션 하는 것
  • 7. 패러다임이란? • 사고의 방식 체계 • 일관성과 완전성을 갖춤 • 프로그래밍 패러다임의 여러 종류 • 절차적 프로그래밍 vs 선언형 프로그래밍 • 객체 지향 프로그래밍 • 관점 지향 프로그래밍 • 함수형 프로그래밍
  • 8. 객체지향 프로그래밍 패러다임 • 컴퓨팅 성능 중심  개발 인건비 중심 • 인간의 사고체계와 가장 유사 • 뉴런(데이터와 함수) • 시냅스(메시지) • 여러 사람이 함께 개발하기 좋은 • 분업과 집중 • 여러 컴퓨터가 함께 동작하기 좋은 • 대규모 분산 시스템  클라우드 컴퓨팅
  • 9. 그래서, OOP가 내 인생에 무슨 관계? • 세계 일류 소프트웨어 회사들 - 구글, 인 포시스 등 – 의 입사시에 핵심 검증사항 • 숙련된 소프트웨어 개발자와 비숙련자 와의 개발 성능 차이는 40배, 숙련된 설 계자는 개발 비용 차이를 100이상 차이 나게 함. • 객체지향설계와 프로그래밍은 SW기업 의 경쟁력에 매우 지대한 영향을 미침.
  • 10. 그래도, OOP가 왜 필요한지 모 르겠다구요? • OOP는 생각 자체를 하는 도구(패러다임) 는 아님 • 생각을 쪼개고 나누어 해결하는 도구 • 초인지를 활용하는 학생과 아닌 학생 • 학습과 성장에 소요되는 시간을 단축
  • 11. 목차 • 객체지향프로그래밍(OOP) 이란? • OOP 기초 실습 (인피니티 북스) • OOP 와 개발 조직 • OOP 와 클라우드 컴퓨팅 구현
  • 12. OOP의 효과 • 분업과 협업 • In Build-time • SW 개발 팀간의 • Product Vendor와 Third-party Vendor간 • In Run-time • SW 모듈간 • 컴퓨터간
  • 13. 여러 사람이 일을 하려면? • 관심사의 분리 • 구조적 관심 (설계관점) • 세부적 관심 (구현관점) • 표준화 • 메시지 규격 • 인터페이스
  • 14. 소설 : 개발자D • 개발자 D는 이제 중급 개발자 5년 차이다. 게으르고, 잔머리를 잘 쓴다. 어느 날 본의 아니게 큰 프로젝트를 혼자 맡게 된다. • 1. 프로젝트 상황: 프로젝트는 기간이 짧으며 또한 예 산도 제한되어 있다. • 2. 개발자 상황: 현재 갖춘 개발자는 4명이며 개발자 D 를 제외한 나머지 개발자 A,B,C는 각자 UI만 만들줄 아는 사람, 업무 흐름만 아는 사람, 그리고 SQL과 JDBC를 통해 database 처리만 할 줄 아는 사람이 있 다. • 다행히 개발자 D는 각 분야에 대해서 어느 정도 지식을 가지 고 있지만 그렇다고 개발자 D혼자서 시스템을 다 만들 수는 없다. 기간이 제한 되어 있기 때문이다.
  • 15. 작전이 필요해 • 방법은 분업 즉, 각자의 분야해서 전문성 을 가진 개발 부분만을 분리해서 개발하 는 분업이 필요하다. • 개발자 D는 다년간의 개발 경험을 바탕 으로 다음의 3개 base class를 만들어 분 업을 할 수 있는 골격 클래스를 만들었 다.
  • 16. UI 관점 public class Presentation{ BusinessLogic businessLogic; public Presentation(BusinessLogic bl){ businessLogic = bl; } public BusinessLogic getBusinessLogic(){ return businessLogic; } public void doPresentation(){ //비워둠 } }
  • 17. Business Logic 관점 • public class BusinessLogic{ • Database database; • • public BusinessLogic(Database db){ • database = db; • } • • public Database getDatabase(){ return database; } • • public void doBusinessLogic(){ //비워둠 } • } •
  • 18. Data 관점 • public class Database{ • public void save(){ • //비워둠 • } • • public void load(){ • //비워둠 • } • } •
  • 19. 전체 관점 • public class Application { • public static void main(String args[]){ • Presentation presentation = • new Presentation( • new BusinessLogic( • new Database() • ) • ); • • presentation.doPresentation(); • } • } 개발자 D는 이렇게 했을때 시스템이 원활하게 돌아가는지 확인해보기 위해 다음의 prototype클래스를 만들어 각 클래스들이 유기적으로 잘 동작하는지 확인해보았다.
  • 20. • 해보니까 잘 돌아가더라.. 그래서 이렇게 해놓고 똘똘하면서 잡다하게 많이 아는 개발자 D는 자기 분야에서 묵묵히 일하 는 개발자 A,B,C를 불러모아 놓고 각 개 발자들이 준수해야할 위의 3가지 클래스 들을 넘겨주었다. • 1주일후 개발자 A,B,C는 각각 다음의 derived class들을 만들어왔다.
  • 21. 개발자 A /* System.out.println() 밖에 모르는 개발자 */ • public class AddressBookPresentation extends Presentation{ • public AddressBookPresentation(BusinessLogic businessLogic){ • super(businessLogic); • } • • public void doPresentation(){ • System.out.println("결과값은: " + getBusinessLogic().doBusinessLogic() + " 입니다."); • } • }
  • 22. 개발자 B /* 업무 흐름 밖에 모르는 개발자 */ • public class AddressBookBusinessLogic extends BusinessLogic{ • public AddressBookBusinessLogic(Database database){ • super(database); • } • • public void doBusinessLogic(Database database){ • getDatabase().save(); • getDatabase().load(); • } • } •
  • 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"); • } • }
  • 24. • 그 사이에 개발자 D는 시스템 전반에 발 생할 수 있는 여러가지 문제들을 고민하 고 필요할때 마다 개발자 A, B, C와 협의 했다. • 자신은 전체 시스템을 동작할 Application class를 만드는 막중한 업무 가 있다고 하면서 사실은 줄곧 놀았다. • 개발자 D가 작성한 코드는 다음과 같이 처음에 만든것에 클래스명만 몇개 바꿨 다. •
  • 25. 개발자 D /* 세부기술 관심없고 전체흐름만 아는 설계자 */ • public class AddressBookApplication { • public static void main(String args[]){ • Presentation presentation = new AddressBookPresentation( • new AddressBookBusinessLogic( • new AddressBookDatabase() • ) • ); • • presentation.doPresentation(); • } • }
  • 26. • 그렇게 4개의 클래스는 미리 각자의 영 역에 대한 메서드 관계를 미리 정의 했기 때문에 서로 연결되어 바로 동작했다. • 개발자 A,B,C는 개발자 D가 무슨 요술을 부린게 아닌가 의심했다. • 각자의 영역에서만 개발을 했기 때문에 일은 아주 빠르게 진행되었다.  Separation of Concerns
  • 27. • 또한 경험 많은 개발자 D가 작성해준 base class들은 각자의 개발자가 참조할 다른 영역의 필요한 왠만한 메서드 들이 거의 다 갖추고 있었기 때문에 서로 타협 해야 할 부분이 적었다. • 또한 이렇게 해놓고 나니 다음과 같은 상 황에서도 개발자 D는 유연히 대처했다.
  • 28. 상황 1. 고객이 시스템 UI를 Window version으로 변경을 요구함 • Presentation 개발자인 개발자 A를 불러 • AddressBookWindowPresentation을 만 들어오라고 주문
  • 29. 개발자 A • public class AddressBookWindowPresentation extends AddressBookPresentation{ • public AddressBookWindowPresentation(BusinessLogic businessLogic){ • super(businessLogic); • } • • public void doPresentation(){ • Frame frame = new Frame(); • frame.add( new Label ("결과값은: "+ getBusinessLogic().doBusinessLogic() + " 입니다.")); • frame.show(); • } • }
  • 30. 그리고 다음과 같이 Application 을 살짝 바꾼후 • public class AddressBookWindowApplication { • public static void main(String args[]){ • Presentation presentation = new AddressBookWindowPresentation( // • new AddressBookBusinessLogic( • new AddressBookDatabase() • ) • ); • • presentation.doPresentation(); • } • } • 고객에게 갖다줌.
  • 31. 상황 2. • 기존에 Oracle만 썼는데, 고객사의 지점 에서는 SQL server 2000을 주로 사용하 고 있어 시스템의 변경버전을 요구함 • 개발자 C를 불러서 SQL Server 2000용 SQL문으로 구성 된 AddressBookDatabaseSQL2000 작 성을 요구함 마찬가지로 했음
  • 32. * 각각의 상황에서 변경은 • 이외의 클래스들은 영향 받지 않고 다른 부분의 개발자들이 참여할 필요도 없었 다. • 어찌 된것인지 고객측이 어떤 천진난만 한 요구를 해와도 개발자 D는 항상 여유 로왔다 • Polymorphism • Inversion of Control
  • 33. 그리하야 개발자들은… • 프로젝트를 기간보다 빨리 완수하여 ….
  • 34. Terminology 정리 • SoC Separation of Concerns • IoC Inversion of Control • Polymorphism
  • 35. 2부 • 개발자D.. • 그는 지난번에 경험한 프로젝트의 교훈 을 가지고 여기저기 다른 프로젝트에도 이전의 경험을 적용하고자 노력하였다. • 사람이 앉으면 눕고 싶고, 누우면 자고싶 다고 했던가? • 점점 갈수록 이젠 개발자들에게 매번 어 디를 "채워와라"라고 하는 말 자체를 하 는것도 귀찮은 것이다.
  • 36. 이것도 어렵고 귀찮다… 때때로, 개발자들은 "여기를 채워오세요"라고 한 부분을 제대로 채워 오지 않는 경우 도 또한 종종 있었던 것이다. 개발자들이 잊지 않고 해당 빈 부분을 정확히 채워서 오 도록하고, 그것을 정확하게 검증할 방법이 없을까? • public class Presentation{ • BusinessLogic businessLogic; • public Presentation(BusinessLogic bl){ • businessLogic = bl; • } • • public BusinessLogic getBusinessLogic(){ • return businessLogic; • } • • public void doPresentation(){ • //여기를 채워서 오세요... • } • }
  • 37. 고심한 개발자D는 • 객체지향 대가 교수님에게 찾아가 해당 문제를 이야기하였다... 그 문제를 듣고 • 도사 교수님은 고개를 끄덕이며.. "abstract!!" 라고 외치며 홀연히 사라졌 다.. • 개발자 D는 "그렇지, abstract... 키워드 라는 것이 있구나, 채워야 할 부분에 대 하여 abstract 키워드를 붙이자.. 그러면 컴파일러 레벨에서 구현여부를 검증해 주지 않겠느냐...
  • 38. Abstract Presentation • public abstract class Presentation{ • BusinessLogic businessLogic; • • • public Presentation(BusinessLogic bl){ • businessLogic = bl; • } • • public BusinessLogic getBusinessLogic(){ • return businessLogic; • } • • public abstract void doPresentation(); • } •
  • 39. • 이렇게 바꾸고 나니, 해당 클래스의 필수 구현 부위가 정확히 드러나 이를 구현하 지 않았을때는 정확히 컴파일러가 오류 를 내도록 가이드가 되었다. 개발자D는 일일이 잔소리 하는 수고조차도 귀찮았 던 것이다.
  • 40. • 그렇게 abstract 키워드는 개발자 D에겐 정말 마음에 드는 키워드였기에 여기저 기 막막 사용하였다.. 그러던 중에.... • 지금까지는 어플리케이션 로직을 아래 와 같이 작성해서 클래스명을 교체하는 방식으로 구현해왔지만, 이젠 이것 조차 도 누구한테 시켜서 할 수 없을까 ... 하는 생각이 드는것이다..
  • 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(); • • }
  • 42. • 이렇게 abstract class를 만든후, UI의 조 합, 로직의 조합, DB제품별 조합의 다양 한 조합된 어플리케이션들을 다른 초급 개발자한테 막막 시켜서 고객사별로 만 들어내어도 내부 로직 (run 메서드) 의 흐 름을 깨트리지 않고 양산이 가능해졌다.
  • 43. ABC 고객사용 애플리케이션 • public ABCCompanyApplication extends Application{ • • Presentation getPresentation(){ • return new WindowsPresentation(); • } • • BusinessLogic getBusinessLogic(){ • return new AddressBookBusinessLogic(); • } • • Database getDatabase(){ • return new MSSQLDatabase(); • } • }
  • 44. Application 구조 자체의 개선 • Application 구조 자체의 변화가 발생한 경우 개발자 D는 어떻게?
  • 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(); • }
  • 46. • 개발자 D의 개선사항은 (Abstract Application의 변화) 모든 고객사의 제품 에 바로 반영됨 • 상위객체의 개선은 곧 하위객체에 영향을 주기 때문.
  • 47. 목차 • 객체지향프로그래밍(OOP) 이란? • OOP 기초 실습 (인피니티 북스) • OOP 와 개발 조직 • OOP 와 클라우드 컴퓨팅 구현
  • 55. 객체지향은 추상화 기법이다 • 문제의 복잡성을 ‘클래스’로 단순화함 • 즉, 클래스는 문제의 복잡성을 ‘은닉’해야 하는 의무가 있음. • 상속의 다른 의미 • public / protected / private keyword 의 존재 • 별도 jar파일로 분리 • 추상화의 대상 • 정보구조 • 생각의 단위 • 수행전략 (로직) • SW의 틀 (디자인/구조)
  • 56. 복잡성을 은닉하는 OOP 키워 드들 • Extends: 상속이라 배우고, 다음이라 해석한다: • Inheritance: 상위객체의 멤버 데이터와 메서드의 ‘구조’를 계승함 • Extends: 상위객체를 확장하여 새로운 ‘기능’과 ‘구조’를 추가함 • Specialize: 상위객체를 특정한 목적으로 특성화 시킴 • Limit: 상위객체를 제약하여 단순화 시킴
  • 57. Class Hierarchy • Interface • Abstract class • Default class • Derived class • 위로 갈수록 추상적 • 밑으로 갈수록 구체적 • 위로 갈수록 경력이 오래된 분, Generalist 들이 작성 • 밑으로 갈수록 전문가나 초급자, Specialist 들이 작성
  • 58. 추상화의 대상 • 기본: • 생각의 덩어리 : 데이터 구조와 기능 • 중수: • 로직 • 커맨드 • 고수: • 소프트웨어 동작의 구조 자체
  • 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);
  • 70. 캐스팅 (바인딩) • 어떤 배우를 역할로 Casting 하다. • 다형성에 의하여 동적인 캐스팅이 가능 Animal me = new Human(); if(drunk){ me = new Dog(); } me.speak();
  • 71. 입력 값으로 동적 캐스팅 (1) if (“dog”.equlas(args[0])) me = new Dog(); else if (“cat”.equals(args[0])) me = new Cat(); else if … else if … …
  • 72. 입력 값으로 동적 캐스팅 (2) Java Reflection API (Class.forName)을 사용한 동적 바인딩 me = (Animal)Class.forName(args[0])
  • 73. 동적 캐스팅 – 예제 적용 BusinessLogic businessLogic = (BusinessLogic)Class.forName(company Name + “BusinessLogic”); 회사명이 ABC면, ABCBusinessLogic.java 가 BusinessLogic으로 사용됨. 네이밍 일관성, 소스코드 찾기의 용이성 컴포넌트 자산 체계화에 대거 활용
  • 74. 구현 예제문제 자동차 모델명을 입력하세요: > BMW 원하는 동작을 입력하세요: 1) 가속 2) 모델변경 > 1 속도: 10, 연비: 90 > 1 속도: 20, 연비: 80 > 2 자동차 모델명을 입력하세요: > Benz > 1 속도: 20, 연비: 80 > 1 속도: 40, 연비: 40
  • 118. [Tip] 감각적으로 OOP하기 • 어떠한 프로그램의 잘못된 구조를 감각 적으로 파악 • 자신의 프로그래밍을 하는 과정에서 더 욱 강화 • 즉, 잘된 특성과 잘못된 특성을 감정으로 기억하는 것을 강화하는 훈련
  • 119. 객체지향답게…란? • 응집도는 높고 • 하나의 객체가 다루는 데이터와 기능이 하 나로 존재할 때 순도(일관성)가 높다. • 결합도는 낮게… • 다른 객체와 메시지를 전달하는 과정에서 다른 객체에 많은 의존성을 가진다.
  • 120. 응집도와 결합도 예시상황 • 다른 사람은 놀고 있는데, 혼자서 바쁜 관리자가 존재하는 경우 ==> 각 담당자 가 자기주도적이지 못하거나 팀장이 위 임을 못하는 경우. • 내 업무의 성격을 넘어선 남의 업무에 간 섭을 많이 해야 하는 경우 ==> 업무 분장 을 응집도 있게 분배하지 못한 경우.
  • 121. 리팩토링이란? • 객체지향스럽게.. 기존 코드를 재수정하 는 것. • 주로 많은 경험적 노하우와 시간이 필요.
  • 122. 감각으로 리팩토링 하는 법 코드내에 if ~ then ~ else 와 멤버변수 값을 참조하는 “.” 이 발견되면 이들은 오래된 채권 혹은 불량식품으로 기억하자. • if ~ then ~ else • 이들이 보이면 응집도를 높힐 기회가 있다. • 메서드 내에 “.” 들 • 이들이 많으면 결합도가 높다는 뜻이다.
  • 123. 목차 • 객체지향프로그래밍(OOP) 이란? • OOP 기초 실습 (인피니티 북스) • OOP 와 개발 조직 • OOP 와 클라우드 컴퓨팅 구현
  • 125. 클라우드 컴퓨팅 유래  2006년 9월 당시 구글 직원인 크리스토프 비시글리아란 직원이 당시 CEO인 에렉 슈미츠와의 회의에서 처음 제안  “이 구상이 현실화하면 기업과 개인은 별도의 서버나 PC를 살 필요가 없어집니다. 소프트웨어든 데이터든, 온라인에 저장해 놓고 인터넷을 통해 그때그때 빌려 쓰면 되니까요. ”  클라우드(cloud)라는 명칭은 IT 아키텍처 다이어그램에서 인터넷을 구름으로 표현하던 것에서 유래  즉 클라우드(cloud)는 인터넷을 의미하고, 인터넷에 연결된 서비스 제공자의 데이터센터에 접속하여 서비스를 사용하는 것이 클라우드 컴퓨팅*; cloud = the Internet -> 서비스 제공자의 대규모 데이터센터  서비스는 컴퓨팅 파워나 스토리지 같은 시스템 리소스,플랫폼, 애플리케이션 등 다양한 것이 될 수 있음 출처 : Cisco, http://www.itworld.co.kr/news/54623
  • 126. 개념 클라우드 컴퓨팅과의 관계 Grid Computing 높은 컴퓨팅 리소스를 필요로 하는 작업 의 수행을 위해 인터넷상의 분산된 다양 한 시스템과 자원들을 공유하여 가상의 슈퍼 컴퓨터와 같이 활용하는 방식 (분산 컴퓨팅 아키텍쳐) Grid 방식의 분산 컴퓨팅과 Utility 개념의 과 금 모형을 혼합한 컴퓨팅 방식 - 그리드: 인터넷상의 모든 컴퓨터 리소스 - 클라우드: 서비스 제공 사업자의 사유 서버 네트워크 Utility Computing 컴퓨팅 리소스를 구매 하거나 소유하지 않고, 가스 전기 등과 같이 유틸리티로 필요할 때마다 사용하는 방식 (사용량기반 과금 모형) Server Based Computing 서버에 어플리케이션과 데이터를 두고 필요할 때마다 접속해서 사용하는 방식 (클라이언트는 입출만 처리, 모든 작업 은100% 서버가 처리-Thin Client 방식) 클라우드 컴퓨팅은 가상화된 분산 컴퓨팅에, SBC는 특정 기업의 서버에 중심을 둔다는 차원에서 개념적 으로 구분, 그러나 SBC가 발전으로 점차 구분이 모호해짐 Network Computing SBC와 비슷 하나, 어플리케이션을 서버 에 로드 하여 로컬에서 수행하는 형태 (이용자의 CPU를 사용하여 동작) 이용자의 컴퓨팅 리소스 보다는 클라우드 상 의 IT 리소스를 사용하므로 개념적으로 구분 됨 SaaS 서비스 제공자의 서버에 저장된 SW를 인터넷을 통해 서비스로 이용하는 SW 딜리버리 모형 클라우드 컴퓨팅은 모든 IT자원을 서비스로 활용 한다는 차원에서 보다 SaaS를 포함하 는 포괄적인 개념 클라우드 컴퓨팅과 다른 컴퓨팅과의 관계
  • 127. Joseph Pine, “경험경제” 1999 원자재 제품 경험가치 가격가치 산업화된 경험
  • 128. 혁신의 본질은 기술이 아니다 • 경험의 경제를 간파한자 • 파레토가 아닌 롱테일 • 감성과 심미적인 가치
  • 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
  • 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
  • 134. 클라우드 컴퓨팅의 서비스 구성도 출처 : ETRI
  • 135. Source: upcoming research, Cloud Computing: Not Ready For The Enterprise...Yet. 클라우드 컴퓨팅 아키텍쳐 기본
  • 136. Source: upcoming research, Cloud Computing: Not Ready For The Enterprise...Yet. 클라우드 컴퓨팅 아키텍처 – Workload 관리
  • 137. 클라우드 컴퓨팅 구성요소 구 현 • 네트워킹 서버 구현 • 웹서버 (HTTP/Servlet) 구현 • 웹기반 분산객체서버 (SOAP/REST) 구 현
  • 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); }
  • 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); } }
  • 140. 서블릿 서버 만들기 • 서블릿서버는 HttpServlet 스펙을 준수해 야 한다. • HttpServlet 스펙은 JSR에서 관리한다. • 관리된 스펙은 interface 묶음의 jar로 인 터넷상에 배포된다. • 이를 준수하는 구현은 서블릿 서버 벤더 (예: Jboss, Tomcat, IBM websphere) 가 구현한다.
  • 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); } }
  • 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()); } }

Editor's Notes

  1. 2004년 12월 구글에서 맵 리듀스 알고리즘 발표(GFS), http://labs.google.com/papers/mapreduce.html 2005년 Doug Cutting(Lucene & Nutch 개발자)에 의해 시작 -> 하둡 프레임웍 “모교인 워싱턴대의 후배들이 좀 더 많은 정보를 접할 수 있는 방법이 없을까 고민하다가 클라우드 컴퓨팅을 생각하게 됐다”고 밝혔습니다. 하루가 다르게 새로운 정보들이 쏟아지지만 대학 등은 이를 따라가지 못하고 있어 안타까웠다는 것. 해결 방안으로 서버 등 비싼 IT 인프라를 갖추지 않고도 수퍼컴퓨터 급의 컴퓨팅 능력을 낼 수 있는 방법을 창안한 것이다. 슈미츠 구글 CEO는 “처음엔 비시글리아 씨가 온라인 캠퍼스를 이야기하는 줄 알았다. 그런데 곰곰이 생각해 보니 정보기술 패러다임을 바꿀 수 있는 엄청난 구상이었다”고 말했습니다.