사용자 삽입 이미지

★ 자바프로그래밍 전문가 과정

 

- 매달초 일반과정 개강

- 환급교육가능 / 교육비 할인

- SCJP 본원시험 / 취득률 90%이상 / 할인바우쳐제공

- 본원 전임강사진 실무위주 교육진행


* 교육 담당 & 관리자 : 김 윤 석 대리
* 교육 문의 & 예약 접수 : 02) 6255 - 8066
* 홈페이지  http://www.itmoya.com/prom/java_main.htm


<교육대상>
- 자바 기초 문법 배양
- 중급 문법을 배우고 네트웍관련 어플리케이션 개발
- 자바를 이용하여 실무 웹 어플리케이션 개발
- JSP/ Servlet를 이용한 웹 어플리케이션 개발
- SUN의 J2EE 표준 플랫폼인 J2EE의 사용법과 EJB 기반 기술 습득
- Weblogic를 이용하여 EJB Application 구현 및 운영 시스템 설계
- 썬사의 공인 라이센스인 SCJP, SCWCD, SCBCD 인증을 취득하고자 하는자


<교육목표>
- 기초 수준의 문법 및 프로그래머 교육
- 자바 중급 수준의 문법을 교육
- 자바를 이용하여 웹 어플리케이션을 개발 교육
- JSP / Servlet를 이용한 웹 어플리케이션을 개발 교육
- Weblogic를 이용하여 EJB Application 구현 및 운영 시스템 설계 교육
- SUN의 J2EE 표준 플랫폼인 J2EE의 사용법과 EJB 기반 기술 교육


<본원 수강생 혜택>
* 일반인,학생,미취업자 대상:교육비 최대 50%지원(자체지원과정)
* 고용보험 직장인 대상 : 납입 교육비의 50~80% 환급가능(노동부지원)
* 무료 재수강, 국제공인자격증 시험센터 운영
* 협력업체를 통한 취업지원 (취업정보실운영)

 

<교육 개강안내>
* 교육시간 : 주 5일(월~금) 일일 2시간30분 교육 /주말반(토,일)
* 평일반/주말반개강 : 매달초 개강
-모든 교육과정의 일정은 수강생의 소양에 따라서 선택적 수강이 가능합니다.
-복수수강과 일정조절을 통하여 교육기간을 단축할 수 있습니다.

 

1개월 JAVA(Thread, Network, Swing, Rational Rose, Eclipse, MySQL) 과정
- 자바의 소개와 자바의 현황 및 SCJP소개
- JDK 설치 밀 기본코드 소개
- 자바 환경과 자바 프로그램
- 변수 / 데이터형, 연산자
- if문 , switch , for , while , do~while , break/continue , 1/2차원 배열
- OOP소개
- 클래스 만들기
- this키워드 , 생산자 , 인스턴스와 변수 , 접근제한자
- static , final
- 상속 , Object클래스 , this와 super , 패키지
- 추상클래스와 interface
- 오버로딩과 오버라이딩 정리
- 예외처리방법
- String과 StringBuffer , StringTokenizer , WrapperClass
- Math와 Random , Calendar , Vector와 Hashtable , Thread소개 , MultiThread
- char/byte Stream , Stream / ..Reader..Writer , 파일입출력 , 객체직렬화 , copy명령 Swing
- TCP/UDP , Socket / ServerSocket
- Network 응용 Application
- My-sql 설치
- My-sql Connector설치 , JDBC란 , DB연동하여 데이터 처리

 

2개월 JSP Model 1(Servlet, Connection Pool, Transaction, JSP 응용 Application) 과정
- JSP Container설치 , HelloServlet 기본코드작성
- GET/POST , 구동원리 , Servlet Life Cycle
- 서버프로그램의 예외를 처리하는 서블릿의 설계와 개발
- page Directive, include Directive , Action Tag
- request , response , out
- application , pageContext생성자
- JDBC RDBMS Connection , Connection Pool
- Beans 만들기
- Beans를 이용한 회원 가입양식 만들기
- Session , Cookie
- 회원가입 , 중복 아이디 검사 , 우편번호 검색
- 회원 정보 보기 , 회원 정보 수정
- 회원탈퇴 , 로그인 로그아웃
- 메일전송 , 각종 이미지 , HTML메일의 발송
- 답변형 게시판의 원리 이해, 쓰기페이지, 읽기, 삭제 페이지의 구현
- Subquery를 이용한 글 목록 출력
- Paging(페이징)의 원리
- 답변의 원리 및 답변페이지의 구현
- 파일 업로드의 구현
- 각종 파일 자료실의 구현

 

3개월 JSP Model 2(MVC, Ajax) 과정
- JSP Model2 (MVC)의 이해 및 원리
- Model2 (MVC : Model view Controller)의 이해, MVC 개발순서
- MVC의 구현 (Manager , Action)
- MVC의 구현 (Controller , config , web xml)
- MVC의 구현 (Template , View 구현)
- 각종 MVC Oracle Web Application의 제작실습

- Web 2.0의이해, 개발 및 사용자 환경의 변화
- 자바스크립트 데이터 타입, 제어문, 함수 구현
- DOM(Document Object Model), 자바스크립트 내장 객체 - JSON(JavaScript Object Notation)
- Ajax + JSP + Servlet + Oracle 기반 프로젝트
 

4개월 OJT Project 과정(CBD(Component Based Development) 기반 프로젝트)
- 업무 분석, DB Modeling, CBD 기반 콤포넌트 설계, CVS

- JDK 1.4 2_08이상 , Tomcat , WTP , Oracle 설정
- CBD (Component Based Development) 개요
- 정규화 , 제약조건 (PK,FK)
- 제약 조건 (PK,FK) 실습
- Requirements (use case model , use case specification)
- DB Modeling , 개념적 , 논리적 DB 모델링
- 물리적 데이터베이스 모델링 , 스키마 생성 , DB초기화
- Application에서 사용될 Query의 생성
- 설계 객체 모델 제작 (Interface , DTO , DAO , Manager Pattern)
- 설계 유스케이스 실현 모델 제작
- 콤포넌트의 제작 (표준 Interface , 표준 Interface 구현 Class , Utillity Class , DB Connetion Pool)
- 공통 css , JSP Action TAG를 이용한 Template 페이지 제작
- 전자결재 (LG Dacom)
- SMS (Short Message Service)
- CVS (Concurrent Version System)
- CVS의 이해 및 셋팅
- CVS & Eclipse 연동을 통한 Team Project작업하기

Posted by 김윤석

사용자 삽입 이미지

★ 자바프로그래밍 전문가 과정


- 5월 6일 / 9일 개강

- 환급교육가능 / 교육비 할인

- SCJP 본원시험 / 취득률 90%이상 / 할인바우쳐제공

- 본원 전임강사진 실무위주 교육진행


* 교육 담당 & 관리자 : 김 윤 석 대리
* 교육 문의 & 예약 접수 : 02) 6255 - 8066
* 홈페이지  http://www.itmoya.com/prom/java_main.htm


<교육대상>
- 자바 기초 문법 배양
- 중급 문법을 배우고 네트웍관련 어플리케이션 개발
- 자바를 이용하여 실무 웹 어플리케이션 개발
- JSP/ Servlet를 이용한 웹 어플리케이션 개발
- SUN의 J2EE 표준 플랫폼인 J2EE의 사용법과 EJB 기반 기술 습득
- Weblogic를 이용하여 EJB Application 구현 및 운영 시스템 설계
- 썬사의 공인 라이센스인 SCJP, SCWCD, SCBCD 인증을 취득하고자 하는자


<교육목표>
- 기초 수준의 문법 및 프로그래머 교육
- 자바 중급 수준의 문법을 교육
- 자바를 이용하여 웹 어플리케이션을 개발 교육
- JSP / Servlet를 이용한 웹 어플리케이션을 개발 교육
- Weblogic를 이용하여 EJB Application 구현 및 운영 시스템 설계 교육
- SUN의 J2EE 표준 플랫폼인 J2EE의 사용법과 EJB 기반 기술 교육


<본원 수강생 혜택>
* 일반인,학생,미취업자 대상:교육비 최대 50%지원(자체지원과정)
* 고용보험 직장인 대상 : 납입 교육비의 50~80% 환급가능(노동부지원)
* 무료 재수강, 국제공인자격증 시험센터 운영
* 협력업체를 통한 취업지원 (취업정보실운영)


<교육 개강안내>
* 교육시간 : 주 5일(월~금) 일일 3시간 교육 /주말반(토,일) 각각 7시간교육
* 평일반/주말반개강 : 매달초 개강
-모든 교육과정의 일정은 수강생의 소양에 따라서 선택적 수강이 가능합니다.
-복수수강과 일정조절을 통하여 교육기간을 단축할 수 있습니다.


1개월 JAVA(Thread, Network, Swing, Rational Rose, Eclipse, MySQL) 과정
- 자바의 소개와 자바의 현황 및 SCJP소개
- JDK 설치 밀 기본코드 소개
- 자바 환경과 자바 프로그램
- 변수 / 데이터형, 연산자
- if문 , switch , for , while , do~while , break/continue , 1/2차원 배열
- OOP소개
- 클래스 만들기
- this키워드 , 생산자 , 인스턴스와 변수 , 접근제한자
- static , final
- 상속 , Object클래스 , this와 super , 패키지
- 추상클래스와 interface
- 오버로딩과 오버라이딩 정리
- 예외처리방법
- String과 StringBuffer , StringTokenizer , WrapperClass
- Math와 Random , Calendar , Vector와 Hashtable , Thread소개 , MultiThread
- char/byte Stream , Stream / ..Reader..Writer , 파일입출력 , 객체직렬화 , copy명령 Swing
- TCP/UDP , Socket / ServerSocket
- Network 응용 Application
- My-sql 설치
- My-sql Connector설치 , JDBC란 , DB연동하여 데이터 처리


2개월 JSP Model 1(Servlet, Connection Pool, Transaction, JSP 응용 Application) 과정
- JSP Container설치 , HelloServlet 기본코드작성
- GET/POST , 구동원리 , Servlet Life Cycle
- 서버프로그램의 예외를 처리하는 서블릿의 설계와 개발
- page Directive, include Directive , Action Tag
- request , response , out
- application , pageContext생성자
- JDBC RDBMS Connection , Connection Pool
- Beans 만들기
- Beans를 이용한 회원 가입양식 만들기
- Session , Cookie
- 회원가입 , 중복 아이디 검사 , 우편번호 검색
- 회원 정보 보기 , 회원 정보 수정
- 회원탈퇴 , 로그인 로그아웃
- 메일전송 , 각종 이미지 , HTML메일의 발송
- 답변형 게시판의 원리 이해, 쓰기페이지, 읽기, 삭제 페이지의 구현
- Subquery를 이용한 글 목록 출력
- Paging(페이징)의 원리
- 답변의 원리 및 답변페이지의 구현
- 파일 업로드의 구현
- 각종 파일 자료실의 구현


3개월 JSP Model 2(MVC, Struts) 과정
- JSP Model2 (MVC)의 이해 및 원리
- Model2 (MVC : Model view Controller)의 이해, MVC 개발순서
- MVC의 구현 (Manager , Action)
- MVC의 구현 (Controller , config , web xml)
- MVC의 구현 (Template , View 구현)
- 각종 MVC Oracle Web Application의 제작실습
- Struts Framework의 설치 , Struts Framework의 구조
- Struts Controller의 이해 (ActionServlet , RequestProcessor)
- Struts Controller의 이해 (Action , ActjonForm)
- Struts Model의 이해 및 제작 실습
- 다양한 Struts Oracle Web Application의 제작 실습


4개월 OJT Project 과정(CBD(Component Based Development) 기반 프로젝트)
- 업무 분석, DB Modeling, CBD 기반 콤포넌트 설계, CVS

- JDK 1.4 2_08이상 , Tomcat , WTP , Oracle 설정
- CBD (Component Based Development) 개요
- 정규화 , 제약조건 (PK,FK)
- 제약 조건 (PK,FK) 실습
- Requirements (use case model , use case specification)
- DB Modeling , 개념적 , 논리적 DB 모델링
- 물리적 데이터베이스 모델링 , 스키마 생성 , DB초기화
- Application에서 사용될 Query의 생성
- 설계 객체 모델 제작 (Interface , DTO , DAO , Manager Pattern)
- 설계 유스케이스 실현 모델 제작
- 콤포넌트의 제작 (표준 Interface , 표준 Interface 구현 Class , Utillity Class , DB Connetion Pool)
- 공통 css , JSP Action TAG를 이용한 Template 페이지 제작
- 전자결재 (LG Dacom)
- SMS (Short Message Service)
- CVS (Concurrent Version System)
- CVS의 이해 및 셋팅
- CVS & Eclipse 연동을 통한 Team Project작업하기


Posted by 김윤석

★ 자바전문가 100%취업지원 교육강좌(취업보장교육)

- 10기 교육생 모집중

- 오라클공인교육인증 (OCP 10g취득가능)


현재 IT업계에서 절대적으로 모자라는 자바전문 인력을 양성하여
청년 실업문제를 해결하기 위하여 사전에 자바 개발 관련 회사의 수요조사를 실시한 후
실무에서 개발할 수 있는 기술을 습득하기 위한 맞춤 과정으로 자바 CBD Developer
취업 강좌(제 10기)를 개설하였습니다.


* 교육 담당 & 관리자 : 김 윤 석 대리
* 교육 문의 & 예약 접수 : 02) 6255 - 8066
* 홈페이지  http://www.itmoya.com/expert/cbd.htm


<교육목적>
JAVA CBD Developer 10기 과정은 5개월 단기과정으로써 국내 현업(실무)에서 취업해 활동할 수
있는 자바 CBD 개발자 양성을 목적으로 기획되었습니다.

1. 실무에서 바로 사용할 수 있는 JSP 개발 환경과 예제
2. 자바 콤포넌트의 설계 원리와 편리하고 빠른 EJB 콤포넌트의 제작
3. 실무에 바로 적응 할 수 있는 프리랜서 수준의 프로젝트 제작 능력 배양
4. 취업을 위해 자바 CBD 개발자 양성

※ 실무업무 투입 전 필요한 직무교육을 실시 하며, 양성된 인력은 취업 계약된 협력사에 배정


<교육내용>
1. JAVA (Thread, Network, Swing, Rational Rose, Eclipse) 과정
2. Oracle (SQL, PL/SQL, Oracle 10g, ERwin 4.1, Toad 8.1) 과정
3. JSP (Servlet, Connection Pool, Transaction, WTP, ANT, JUnit) 과정
4. EJB (Desing Pattern, Weblogic, 제우스) 과정
5. Framework(MVC, Model2, Struts) 과정
6. Ajax - WEB 2.0
7. Flex - X-Internet
8. Security - WebApplication 보안
9. OJT Project (Component Based Development) 기반 프로젝트)
   - 업무 분석, DB Modeling, CBD J2EE 콤포넌트 설계, CVS
   - Junit 테스트, ANT 배포,
   - template 페이지 작성, UI 설계
   - Linux & JAVA Server 환경 설정


<교육기간 및 시간>
- 5개월
- 14시 00분 ~ 19시 00분 (월~금, 총 500시간)
 

<교육인원 및 대상자>
- 교육인원 : 20명
- 대상자 : 만 30세 미만의 전문대이상 졸업예정자 및 졸업자 (고졸이상 지원가능, 단 열심히 하셔야 합니다.)


<접수서류>
- 지원서, 서약서
- 자기소개서, 이력서(자유양식, 사진 필히 첨부할 것)
 

<수업편성-총 500시간>

* 일일수업
- 정규기술 습득 수업 : 5시간
- 팀별 및 개인별 과제 해결 실습 : 2시간

* 월별수업
- 정규기술 습득 수업 : 100시간


CBD : Component Based Development 의 장점
이미 개발된 소프트웨어 컴포넌트를 조립하여 시스템을 개발하는 방식인 CBD는
개발 비용과 노력을 줄이고, 생산성을 높일 수 있는 방안으로 인식되고 있다.
CBD가 제공하는 장점은 다음과 같다.


① 소프트웨어 개발 시간 단축 및 비용의 절감
CBD의 가장 큰 장점은 시스템 개발 조직이 어렵고 복잡한 기능들을 매번 재개발하지 않고
이전에 개발했던 컴포넌트를 Reuse할 수 있다는 것이다. CBD 도입 초기에는 Reusable 컴포넌트를
개발하는 비용이 추가로 소요되지만, 일정 수준 이상의 컴포넌트가 축적된 이후에는 개발 시간 및
비용을 획기적으로 줄일 수 있다.


② 소프트웨어의 품질 보증
시스템 개발에 대한 고객의 요구조건이 복잡해지면서 소프트웨어의 오류는 심각한 문제로
등장하고 있다. 특히, 소프트웨어의 개발 공정이 제대로 관리되지 않는 상황에서 발생한
오류는 원인 파악이 힘들기 때문에, 최악의 경우 오류 수정을 위해 전체 시스템을 재개발하는
정도의 공수가 추가로 투입되는 사태가 발생하기도 한다.

CBD 적용을 통한 장점 중의 하나는, 이미 검증된 소프트웨어 컴포넌트의 사용으로 인해 각
기능별 품질이 보증된다는 것이다. 혹, 오류가 발생한다고 해도 각 기능이 분리되어 있기 때문에
오류의 원인을 쉽게 발견할 수 있고, 오류의 수정 또한 다른 기능에 영향을 주지 않고 가능하다.


③ 유지 보수 비용의 절감
소프트웨어와 관련된 비용 중 많은 부분은 시스템의 유지 보수 단계에서 발생한다.
시스템의 유지 보수 비용을 줄이기 위해서는 쉽게 확장이 가능해야 하고, 특정 기능의
수정 사항이 시스템의 다른 부분에 미치는 영향이 적으며, 그 영향이 예측 가능해야 한다.

컴포넌트의 조립을 통해서 개발된 시스템은 각 컴포넌트의 기능 변화가 다른 컴포넌트에
미치는 영향이 적고, 컴포넌트 명세를 통해 그 영향 정도가 예측 가능하기 때문에, CBD를 통한
시스템 개발은 유지 보수 비용을 절감할 수 있는 장점을 가지고 있다.


Posted by 김윤석

[질문]
자바(JAVA)를 배워서 취업을 하고 싶은데, 자바프로그래밍에 대해 전혀 몰라요`
자바(JAVA)쪽이 취업이 잘 된다고 해서, 이제부터 본격적으로 자바(JAVA)를
배워볼려고 하는데, 자바(JAVA)의 취업전망과 공부방법좀 알려주세요!


[답변]
일단 자바학원들의 경우 교육에 대한 내용은 거의 비슷한 것으로 알고 있습니다.
모든것이 기초자바에서부터 JSP(자바 서버 페이지) , EJB(기업자바빈) 으로 자바교육이
진행되고 있습니다.


자바프로그램이 실질적으로 어렵다는 평도 있어서, C언어를 먼저 마스터하고나서 자바를
배우시는 분들도 있지만, 그것은 개개인에 따른 차이가 있으며, 자바를 먼저 공부하는데는
전혀 무리가 없다고 볼수 있습니다.
물론 자바 같은 경우엔 공부를 하면 할수록 자바 프로그램이 어렵다 느끼고 점점 난이도면이나 확장된 개념에서는 그리 쉽지만은 언어라고 볼수 있습니다.


자바학원을 다니시는 것에 대해서는 좋은 것이라 볼수 있습니다.


물론 자바를 배우기 위해 학원을 다닌다는 것이, 과연 좋은 일인가? 또한 비용에 대한
부분이나 그 만큼의 돈과 시간을 투자할 가치와 자신이 있는지가 문제가 되겠죠!


하지만 제대로 자바쪽을 공부해서 자바쪽으로 취업을 하실려는 계획이시라면,
체계적으로 자바학원을 선택해서 공부하시는것도 좋은 생각이라 봅니다.


또한 학원을 다니기에 앞서, 어떤학원을 선택하는것이 좋은것인지도 중요하고
앞에서 말씀드린것처럼 C언어를 먼저 배운후 자바쪽을 배울지도 결정을 하셔야 합니다.


물론 학원을 선택하면, 자신의 능력에 맞추어 학원측에서 거기에 맞는 체계적인 시스템으로 교육에 대한 방향을 제시해주기 때문에 그것이 취업이나 공부를 하는데, 도움이 되시겠죠.


제 친구도 학교에서만 자바를 배웠었는데, 자바학원을 방문하여 상담 받은다음에
C언어를 거치지 않고 바로 자바 교육으로 들어가서 지금은 취업도 하게 되었습니다.


자바학원에서는 거의 같은 내용의 쿼리로써 교육이 진행되고, 그 내용만 잘 따라가시면
차후에 님에게 있어서 취업이나 자격증 취득에도 도움이 되리라 생각합니다.


자바학원을 생각하신다면, 제 친구가 다닌 학원 홈페이지를 한번 방문해서 알아보시고
자세한 안내도 받아보시구요~

추천학원(http://www.itwill.org)
자바 java 자바취업 자바학원 자바 java 자바취업 자바학원 자바 java 자바취업 자바학원 자바 java 자바취업 자바학원 자바 java 자바취업 자바학원 자바 java 자바취업 자바학원 자바 java 자바취업 자바학원 자바 java 자바취업 자바학원 자바 java 자바취업 자바학원

Posted by 김윤석
[자바/EJB]



 

JBoss JEE 5 환경에서 사용하는 JBoss 웹 애플리케이션 배포 디스크립터 입니다.

<!DOCTYPE jboss-web PUBLIC
   "-//JBoss//DTD Web Application 5.0//EN"
   "http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">
  
<jboss-web>
   <!-- Uncomment the security-domain to enable security. You will
      need to edit the htmladaptor login configuration to setup the
      login modules used to authentication users.
      <security-domain>java:/jaas/jmx-console</security-domain>
   -->
</jboss-web>

출처 : http://cafe.naver.com/jbossug.cafe


[문제1:JBoss/tomcat]
톰캣은 server.xml로 자신의 동작을 설정한다.
JBoss에는 톰캣이 서드파티 웹컨테이너로 가지고 있다는데
그렇다면 server.xml은 어디에 있는 것인가?

톰캣은 server.xml로 자신의 동작을 설정한다. JBoss에는 톰캣이 서드파티 웹컨테이너로 가지고 있다는데그렇다면 server.xml은 어디에 있는 것인가?

답:deploy/jbossweb-tomcatxx.sar



[문제2:tomcat]
tomcat 5은 servlet 버전 몇과 jsp버전 몇을 지원하고 있는가?


답:서블릿 2.4 와 JSP 2.0



[문제3:JBoss/tomcat]
JBoss가 톰캣을 MBean형태로 가지고 있는데 그 빈은 예를 들면
org.jboss.web.tomcat.tc5.Tomcat5이다. 이 빈이 가져야 하는 기능을
정의한 JBoss의 추상클래스?


답:AbstractWebContainer(org.jboss.web.AbstractWebContainer )
클래스의 서브클래스이다.



[문제4:JBoss/설정]
jboss의 AbstractWebContainer 클래스는 web.xml파일이외에 JBoss쪽의
JNDI를 사용하기 위해서 맵핑용 xml을 사용한다. 이 xml의 이름은?


답: WEB-INF/jboss-web.xml



[문제5:JBoss/설정]
jboss가 어떤 서비스를 하며, 그 설정은 어떻게 할 것인지 정의하는 xml은?


답:conf/jboss-service.xml



[문제6:JBoss/설정]
기본적으로 deploy라는 이름의 디렉토리의 것을 디플로이 한다.
이 디렉토리의 이름을 바꿀 수 있다고 하는데 어디를 고쳐야 하는가


답:conf/jboss-service.xml에서
org.jboss.deployment.scanner.URLDeploymentScanner의
URLs 속성



[문제6-1:JBoss/설정]
hot deploy를 하지 않게 하려면?

답:conf/jboss-service.xml에서
org.jboss.deployment.scanner.URLDeploymentScanner의

False


[문제6-2:JBoss/설정]
jboss-service.xml에서 어떤 것을 deploy해야 할 것인지 찾는 MBean은
org.jboss.deployment.scanner.URLDeploymentScanner 이다.
이중에서 deploy하는 순서를 정하는 URLComparator 클래스로 
기본적으로 org.jboss.deployment.DeploymentSorter를 사용하고 있다.
이 DeploymentSorter가 deploy하는 순서는?

답:
- SAR
- xxx-ds.xml
- xxx-service.xml
- RAR
- JAR
- WAR
- WSR
- EAR



[문제7:JBoss/설정]
conf/jboss-service.xml에서 DeploymentScanner로
org.jboss.deployment.scanner.PrefixDeploymentSorter를 사용할 수 있다.
이 사용방법은 -.ar 이라고 한다.
예를 들면?


답:
10-testEJB.jar
20-test-service.xml
prefix가 없는 패키지가 먼저 디플로이 되며, prefix가 있을시 작은 숫자가 먼저 디플로이됩니다.



[문제8:JBoss/설정]
deploy의 DataSource 설정파일은 이름의 형태가 기본적으로 정해져 있다. 어떻게 되어 있는가?


답:-ds.xml



[문제9:JBoss/설정]
JBoss는 DB연결을 어떤 특정한 아답터를 사용하여 RDBMS든 RDBMS가 아니든 표준화된 방법으로
호출하도록 하고 있다. DataSource와도 관계되는 이 아키텍처의 이름은?


답: JCA(J2EE Connector Architecture)



[문제10:JBoss/설정]
JBoss에서 JCA와 관련된 서비스를 설정하는 파일은?
이 파일 안에서 -ds.xml이라는 이름 형태를 변경하는 것도 가능하다.


답:jbossjca-service.xml

Thread를 사용하지 않는 경우 Thread Pool을 지울 수 있다




출처http://www.it-bank.or.kr/prom/java_main.htm

Posted by 김윤석
Posted by 김윤석
Posted by 김윤석

나. 패키지의 사용법 import

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

자바 프로그램에서는 어떤 클래스를 사용하기 위해 import 문을 사용하여 현재 프로그램에 포함해 주어야 합니다. 클래스를 포함하기 위해 import 다음에 패키지 이름과 클래스 이름을 기술해 주어야 하는데, 다음과 같이 가지 방법을 사용할 있습니다.

 

l             특정 클래스 포함하기

import 패키지이름.클래스이름;

)

import java.applet.Applet;

import java.util.Vector;

 

l             패키지 내의 모든 클래스 포함하기

import 패키지이름.*;

)

import java.awt.*;

import java.io.*;

     

위와 같이, 어떤 패키지내의 특정 클래스를 사용하기 위해 포함할 경우에는 패키지의 이름과 클래스의 이름을 모두 지정해 주면 되고, 어떤 패키지내의 모든 클래스를 사용하고자 경우에는 클래스의 이름 부분에 와일드카드 ‘*’ 사용하여 지정해 주면 됩니다. , “import java.awt.*;” 같이 사용했을 경우 java.awt 패키지에 속한 모든 클래스들은 포함하지만, java.awt 패키지의 하위패키지에 있는 클래스들은 포함하지 못합니다. 예를 들어, java.awt 패키지에 속한 하위패키지인 java.awt.event 패키지 내의 모든 클래스들을 사용하기 위해서는, 다음과 같이 주어야 합니다.

 

l             패키지(java.awt) 하위패키지(java.awt.event) 포함할 경우

import java.awt.*;

import java.awt.event.*;

 

만약, 사용하고자 하는 클래스를 포함하였을 경우에는 클래스를 사용하기 위해 클래스의 이름만을 지정해 주면 되고, 그렇지 않고 클래스를 포함하지 않았을 경우에는, 사용할 때마다 패키지 이름과 클래스 이름을 모두 지정해 주어야 하는 번거로움이 있습니다.

 

l             특정 클래스(Applet 클래스) 포함한 경우

import java.applet.Applet;

class TetrisApplet extends Applet {

   

}

l             특정 클래스(Applet 클래스) 포함하지 않은 경우

class TetrisApplet extends java.applet.Applet {

  

}

 

다음에 나오는 자바 프로그램은 패키지를 사용하는 예를 보여주고 있습니다.

 

 

import java.lang.Thread;

import java.awt.*;

import java.awt.event.KeyEvent;                         // (b)

 

class PackageTest {

   public static void main(String args[]) {

      System.out.println(new java.io.File("C:\\AUTOEXEC.BAT"));

      System.out.println(new java.lang.Thread());

      System.out.println(new Thread());

      System.out.println(KeyEvent.VK_A);                // (a)

//      System.out.println(java.awt.event.KeyEvent.VK_A);   // (c)

   }

}

 

/*

 * Results:

 

 (b) 부분을 주석처리한 경우

 D:\AIIT\JAVA\05>javac PackageTest.java

 PackageTest.java:10: Undefined variable or class name: KeyEvent

       System.out.println(KeyEvent.VK_A);               // (a)

                          ^

 1 error

 

 D:\AIIT\JAVA\05>

 

 (b) 부분의 주석을 풀거나 또는

 (a) 부분을 주석처리하고 (c) 부분의 주석을 경우

 D:\AIIT\JAVA\05>javac PackageTest.java

 

 D:\AIIT\JAVA\05>java PackageTest

 C:\AUTOEXEC.BAT

 Thread[Thread-0,5,main]

 Thread[Thread-1,5,main]

 65

 

 D:\AIIT\JAVA\05>

 

 */

 

<프로그램 1. PackageTest.java>

 

위의 자바프로그램에서 “import java.awt.*;” 같이 사용하였을 경우, java.awt 패키지 내의 모든 public 클래스들을 사용할 있지만, java.awt 패키지에 속한 하위패키지의 클래스들은 불러들이지 못합니다. 따라서, 위에서와 같이 “import java.awt.event.*;” 또는 “import java.awt.event.KeyEvent;” 문을 이용하여 하위패키지의 클래스를 직접 포함해 주거나 또는 “KeyEvent.VK_A” “java.awt.event.KeyEvent.VK_A” 같이 바꾸어주면 됩니다.

자바추천학원:
http://www.it-bank.or.kr/prom/java_main.htm

Posted by 김윤석
[자바/JAVA/SCJP/자바학원] java에서 shell 명령 실행방법


자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원


ex) 원본파일을 다른곳에 복사하는 명령임.
    String command = "cp -f " + orgDir + fname + " " + dataDir2 + fname;
    Process pc = Runtime.getRuntime().exec(command);
    Thread.sleep(1000);


자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원 자바 JAVA SCJP 자바학원


출처 : http://www.it-bank.or.kr/prom/java_main.htm

Posted by 김윤석




수정이력

2007/08/13

1. '들어가며', '마치며' 대폭 수정

2. 오타 수정  : 여러개의 메소드에서 같이 써는 코드였었습니다.==> 여러개의 메소드에서 같이 쓰는 코드였었습니다.


2007/08/09

  1. 첫 단락 소제목 변경 ( "ArrayList나 Vector에는 iterator가 성능이 더 안 좋다."에서 )

2007/08/08

  1. 소제목을 h3태그로
  2. iterator를 쓸때 고려할 점 설명에 내용 보강
  3. 반복될 필요가 없는 코드의 예 설명에서 오타수정, 문장 다듬기
  4. 바이트 코드설명 부분의 한 문장 추가, 문장 다듬기

들어가며

 저는 요즘 유지보수 프로젝트에서 일하고 있습니다. 많은 시간을 코드를 다듬는데 쓰고 있고  다른 개발자들의 코드를 많이 볼 수 있는 기회가 되고 있습니다.  그러다 보니 List의 크기만큼 반복문을 돌리는 코드에서 많은 개발자들은  루프 블럭 안에서만 쓰는 변수의 선언을 밖에다 하고 있다는 것을 발견하게 되었습니다.  이에 대해서 개발기간에 대화를 해볼 기회가 없었다는 것이 아쉽게 느껴지더군요. 그래서 그 내용과 함께 list와 loop에 관한 몇가지 이야기들을 같이 묶어서 글로 정리해 보게 되었습니다. 첫번째 소제목과 두번째 소제목 아래의 내용은 성능을 약간이라도 더 개선하고 싶을 때 도움이 될 정보들이고, 세번째 소제목에서 위에서 말한 많은 개발자들의 습관이 실제로는 성능에는 아무 영향이 없음을 설명할려고 했습니다.


ArrayList와 Vector는 RandomAccess inteface를 구현하고 있다.

List의 크기만큼 반복문을 도는 방법에는 크게 두 가지 방법이 많이 쓰이고 있죠.

1. java.util.Listsize()로 크기를 구해서 그 갯수만큼 반복문을 돌아서 get(int index)로 List안에 있는 객체를 가지고 온다.

2. iterator()java.util.Iterator 객체를 얻은 후 이 객체의 hasNext()가 true인 동안 반복문을 돌아서 next()로 List안의 객체를 가지고 온다.


그런데 그 객체가 java.util.ArrayListjava.util.Vector가 확실할 때는 1번의 방법이 더 빠르다고 합니다. 그 이유는 API문서를 보시면 확인할 수 있듯이 ArryList와 Vector는 java.util.RandomAccess interface를 구현하고 있기 때문입니다. RandomAccess의 API문서에는 아래와 같이 적혀있습니다.


Marker interface used by List implementations to indicate that they support fast (generally constant time) random access.


List의 구현체가 빠른 임의접근을 지원한다는 것을 나타내는 표시 interface라는 말입니다. 선언되어 있는 메서드도 아무것도 없지요.

API문서에는 이렇게 적혀있지만 성능이 항상 우선순위의 가치는 아니므로 RandomAccess List에는 get(int index)을 써야 한다는 법칙을 만들 수는 없을 것입니다. 가령 List와 다른 Collection 객체, 배열 등을 한꺼번에 묶어서 처리할 때는 iterator pattern이 유용합니다. (참고자료5: Head first design pattern).

하지만 성능이 중요한 코드를 짜는 경우에는  객체를 생성하는 부분에서 ArrayList나 Vector를 생성한다는 정보를 확실히 가지고 있고, 그것이 LinkedList같은 다른 객체로 변경될 가능성이 없다면 java.util.RandomAccess interface의 명세는 무시할 수만은 없을 것입니다.

List 처리  시에 성능을 극대화 시키기 위해서 RandomAccess interface를 구현했는지 검사해서  get(int index)를 쓸지 iterator()를 사용할지 결정하는 코드도 있기는 합니다. (참고자료2의 자바퍼포먼스 튜닝 중).  보통 그렇게까지 성능을 쥐어짤 경우는 흔치 않겠죠.


List의 크기를 반복해서 구할 필요가 없다.

위에서 1번으로 제시된 것처럼 get(int index) 를 쓰는 방법을 쓸 때도 아래와 같은 코드를 많이 보게 됩니다.


for( int i = 0; i < list.size(); i++){

//일하기

}


흔하게 보는 코드죠? 그런데 위 코드에도 굳이 필요없는 성능의 손실이 있습니다. 바로 list의 크기를 구하는 size() 메서드가 매번 반복해서 호출된다는 것입니다. 반복문 내에서 list의 크기가 변하는 경우가 아니라면 for문의 초기화 때 한번으로 충분합니다.

for(int i = 0, n = list.size(); i < n; i++){

//일하기

}


n을 for문 앞에서 선언하는 방법도 있지만, for block 밖에서 n이 필요한 경우가 아니라면 n이 for의 초기화 부분에 선언되고 할당되는 것이 좋습니다. 변수의 유효범위가 최소화되기 때문이죠.


Loop안에서만 사용하는 변수의 선언을 loop밖에 해야 할까?

코드의 중복을 없애라거나 적절한 API를 쓴다거나 등의 바람직한 코드를 위한 지침에는 항상 다음과 같은 이유들이 붙어다닙니다.

  • 코드의 가독성이 좋아진다.
  • 유지보수가 편해진다.
  • 오류의 발생 가능성이 줄어든다.

지역변수의 유효범위를 최소화하라는 지침에도 위의 이유들이 역시나  인용되고 있지요. (참고자료1 Effective Java, 참고자료 3 Code completed 2nd Edition). 변수의 선언과 초기화, 사용 사이에 있는 코드가 많을 수록  취약성 있는 코드가 들어갈 여지는 커집니다. 이른 시점부터 쓰이지도 않는 객체가 초기화되어서 메모리를 낭비하고 있을 가능성도 있고, 선언되고 한번도 쓰이지 않는 변수들도 눈에 잘 들어오지 않게 됩니다. (뭐 쓰이지 않는 변수는 Eclipse의 warning으로 잡아낼수 있기는 합니다만)


지역변수를 쓰기 바로 전에 초기화하고, 선언과 함께 초기화 하는 좋습니다. 즉 가능한 변수가 처음 사용되는 곳의 가장 근접한 위치에서 선언되고 초기화되어야 한다는 말이죠. 변수의 수명을 가능한 짧게 유지하라는 말로도 표현됩니다. 하지만 많은 개발자들은 메소드의 처음에서 C언어처럼 쭉 변수를 선언하고 시작하고 있습니다.


 반복문에서는 while보다는 for를 쓰는 것이 변수의 범위관리에 유리합니다.


 보통 iterator와 while이 아래와 같이 많이 쓰이고 있습니다.

Iterator i = c.iterator();

while (i.hasNext()){

 doSomething(i.next());

}


 이 것을 for문으로 쓴다면 다음과 같습니다.

for (Iterator i = c.iterator() ; i.hasNext(); ) {

 doSomething(i.next());

}


작은 차이지만 Iterator i는 for block을 벗어나는 순간  잊어버려도 되는 것이니 block 밖에서 개발자의 머리는 조금이나마 가벼워 질 수 있습니다. 이것은 캡슐화의 원칙인 class의 맴버 중 밖에서 볼 필요 없는 것들은 private으로 선언해야 하는 이유와 일맥상통합니다.


그렇다면 다음의 경우는 어떠할 까요?

 1. 루프밖에서 list에서 꺼내서 담을 변수 선언

    static int countOfIncluded(List list, String str){
        int count = 0;
        String element;
        for (int i=0,n=list.size();i<n;i++){
           element = (String) list.get(i);
            if (element.indexOf(str)!= -1 ) count++;            
        }
        return count;
    }


  2. 루프안에서 list에서 꺼내서 담을 변수 선언

    static int countOfIncluded(List list, String str){
        int count = 0;

        for (int i=0,n=list.size();i<n;i++){
           String element = (String) list.get(i);
            if (element.indexOf(str)!= -1 ) count++;            
        }
        return count;
    }


 많은 분들이 1번과 같이 코드를 작성하고 있고, 1번이 성능이 좋다는 '믿음'을 가지고 계실 것입니다. 실제로 한 번 테스트 해볼까요? 크기가 10000개인 리스트를 생성해서 100번씩 반복해서 실행시간을 찍어보는 코드를 만들어보았습니다. 1번 방법은 ListReader1.java, 2번 방법은 ListReader2.java, 시간을 찍어보는 코드는 LoopTester.java 로 첨부하였습니다. 이런 비교 시에는 실행순서에 따라서도 실행시간이 영향을 받으므로 1,2,2,2,1,1,2의 순서로 몇번씩 사이에 걸린 시간을 밀리세컨드로 출력하게했습니다. 실행결과는 다음과 같습니다.

test1:밖에 선언 2243
test2:안에 선언 2153
test2:안에 선언 2184
test1:밖에 선언 2253
test1:밖에 선언 2213
test2:안에 선언 2123


 거의 차이가 없거나 오히려 안에 선언한 쪽이 미묘하게 빠르기도 합니다.

이번에는 javap -c 를 이용해서 컴파일된 byte 코드를 분석해 보겠습니다. 결과는 첨부파일로 넣었으나 알아보기 쉽도록 diff로 비교한 화면을 캡쳐했습니다.

ListReader1ByteCode분석.txt

ListReader2ByteCode분석.txt


노란 줄이 많은 것은 라인수가 1라인 차이가 나고, local variable이 저장되는 공간의 index번호가 달라서입니다. 내용을 보시면 거의 똑같이 실행되고 있는 것을 알 수 있으실 것입니다.  루프가 도는 goto문장을 봐도 (왼쪽의 47라인과 오른쪽의 46라인) 같은 곳으로 (13라인과 12라인)으로 이동을 하기 때문에 특별히 오른쪽 예제2의 경우가 더 일을 하는 것은 없습니다. 다만 3번째 라인 istore n 이였던 것이 istore_n 으로 바뀌는 등 언더바(_)가 들어간 부분이 있습니다.


각각의 명령어의 의미는 다음 링크를 확인해 보시면 나와있습니다.

내용을 보면 istore과 istore_n은  전자가 암시적이라는 것만 빼고는 같다고 나옵니다. (Each of the istore_<n> instructions is the same as istore with an index of <n>, except that the operand <n> is implicit. ) iload의 경우도 마찬가고요.  어떤 차이가 있을까 해서 검색해 봤더니 아래와 내용을 발견했습니다.

'istore_<n>' is functionally equivalent to 'istore <n>', although it is typically more efficient and also takes fewer bytes in the bytecode

원본링크


istore_n 쪽이  오히려 효율적이라는 말이 나와 있습니다. 만약 iload_n도 마찬가지라면 goto가 찾아가는 라인에서는 iload_n이 있는 예제2가 더 효율적인 코드일 수도 있다는 것입니다. 어쨓든 이런 작은 차이를 접어둔다면 코드가 하는 일의 절차는 차이가 없습니다.


 결국 "루프 안에서 반복되는 변수 선언을 밖으로 빼는 것은 성능상에 아무런 이점이 없고 소스에서 변수의 유효범위만 늘어나게 한다. " 는 것입니다.


 여기서 이런 말을 하실 분이 계실 것 같습니다.

"원래는 변수를 loop안에 생성하는 루프가 돌 때마다 String 객체의 참조를 저장하기 위한  공간이 따로 할당되는 것인데 위의 경우는 JVM에서 최적화를 해 준 것 아니냐?   JVM에 따라서 이런 최적화가 안 되는 버전도 있을 수가 있는데 개발자는 어떤 JVM에서도 한번만 선언이 되도록 루프 밖에 변수를 선언해야 하지 않겠냐? "


그러나 Java™ Virtual Machine Specification, The, 2nd Edition 이라는 책을 보면 다음과 같은 내용이 있습니다.


The sizes of the local variable array and the operand stack are determined at compile time and are supplied along with the code for the method associated with the frame .


위의 문장은 메소드가 호출될 때 생성되는 저장공간인 frame에 대한 설명에서 인용한 것입니다. (원문링크 : http://java.sun.com/docs/books/vmspec/2nd-edition/html/Overview.doc.html#15722)

 풀이하면  메소드 안의 local variable들의 값들은 고정된 크기의 배열에 저장되고 그 배열의 크기는 compile시에 결정된다는  내용이 있습니다. 즉 한 메소드 안에서 사용할 local variable이 저장될 공간의 갯수는 이미 compile 시에 정해져 있는 것이지 동적으로 변하는 것이 아니라는 말입니다. 만약 위의 소스에서 list의 갯수에 따라서 local variable의 값이 저장되는 공간(객체가 저장되는 공간을 가리키는 말이 아닙니다.)이 달라진다면 위의 설명과 모순되는 일입니다.


 비슷한 설명과 논쟁이 인터넷의 여러 곳에서 이미 벌어졌으니 아래의 링크를 읽어보셔도 재밌을 것입니다.

  1. local variables in Java : http://rmathew.blogspot.com/2007/01/local-variables-in-java.html
  2. Myth - Defining loop variables inside the loop is bad for performance : http://livingtao.blogspot.com/2007/05/myth-defining-loop-variables-inside.html
  3. http://forum.java.sun.com/thread.jspa?threadID=707455&messageID=4098210
  4. http://weblogs.java.net/blog/ddevore/archive/2006/08/declare_variabl_1.html
  5. http://www.theserverside.com/news/thread.tss?thread_id=41857

1,2번 링크가 바이트코드 역어셈블 결과와 함께 내용을 잘 풀어서 설명하고 있습니다. 3번 링크에서 Dru Devore는 primitive type일 때는 똑같고 Object type일때는 다르다는 결론을 쓰고 있으나, 사실 그가 든 object type의 예제는 '객체를 한번 생성하느냐' 대 '반복해서 생성하느냐'의 문제이므로 경우가 다릅니다. 3번 링크의 댓글에서 다른 사람들도 그 점을 지적하고 있고 2번 링크의 글에서도 관련 설명이 있습니다. 어쨓든 루프밖에 있으나 안에 있으나 바이트코드의 실행과정은 같고 성능은 차이가 없다는 내용은 모든 페이지에 다  있군요.


이런 오해들은 전에 Java의 호출은 pass by value 에서 말했던 객체선언에 대한 오해와 어느 정도 관련이 있다고 봅니다. 객체를 생성이나 사용을 안 하더라도 선언 자체만으로 저장을 위한 큰 공간이 할당된다고 믿는 경우가 많은 것 같습니다.


전에 이런 코드를 본적이 있습니다. 클래스의 멤버 변수로 임시 객체를 생성해 놓고 그것을 여러개의 메소드에서 같이 쓰는 코드였었습니다.

Class MyClass{

String  temp;

void work(List list){

 for (int i=0; i = list.size(); i++){

temp = (String) list.get(i);

//기타...

}

}

void play(List list){

 for (int i=0; i = list.size(); i++){

temp = (String) list.get(i);

//기타...

}

}

}


이런 코드를 짰던 사람도 경력도 어느 정도 되고, 실력도 있어보이는 사람이였죠. 아마 이 개발자는 이런 구조가 temp 객체가 저장될 공간을 상당히 아꼈다는 뿌듯함을 가지고 있었을 지도 모릅니다. 그러나 객체는 Heap 메모리에 있는 것이기에 지역변수가 선언이 하나 덜 되었다고 해서 객체가 줄어든 것은 아닙니다. 그리고 여기서는 list에서 받아오지 새로 생성되는 객체는 없습니다. 더군다나 설계상 의미로도 temp는 Class의 멤버로써 아무런 의미가 없습니다. 성능측면에서 봐도  클래스 멤버 변수는 지역변수에 비해서 더 비용이 큽니다. (참고자료 2: 자바 퍼포먼스 튜닝)


한편으로는 변수의 범위를 줄인다고 해서 반복적으로 Loop 안에서 실행해줄 필요가 없는 작업까지 loop안으로 끌고 들어가서는 안되겠죠. 다음과 같은 코드를 본적이 있습니다.

for (int i=0, n=userList.size(); i<n;i++){

UserBiz biz = (UserBiz) lookup(UserBiz.ROLE); //비지니스 컴포넌트 객체를 얻어온다.

   UserVO vo = (UserVO)userList.get(i);

biz.add(vo);

 }


위의 코드에서 비지니스 컴포넌트를 얻어오는 부분은 반복적으로 수행될 필요가 없으므로 loop 밖으로 나가는 것이 맞습니다.  위의 biz 객체를 loop안에서만 쓴다고 하여도 위와 같이 해당 코드가 안으로 들어가 있다면 한번만 얻어오는 되는 객체를 얻어오는 작업이 계속 반복될 것 입니다. 사실 위의 경우는 비지니스 객체에서 List를 받아서 처리하는 메소드를 하나 더 만드는 것이 나을 것 같네요. 아키텍쳐에 따라 다르지만 비지니스 객체의 호출은 비싼 작업일 경우가 많고 그런 호출의 횟수는 최대한 줄일수록 좋겠죠.


개선된 for문

Java 5의 개선된 for문을 아시는 분이라면 아래의 방법을 많이 쓰실 것입니다.

ArrayList<Integer> list = new ArrayList<Integer>();

for (Integer i : list) { ... }

 ( J2SE 5.0 in a Nutshell 에서)

보기에도 이쁘고, 변수의 유효범위가 loop을 벗어나지도 않는 좋은 문법이네요. ^^ 프로젝트에서 Java 5 이상을 쓰시고 계신다면 변수를 loop안에 넣느냐로 논쟁하기 전에 개선된 for문을 먼저 적용해 보는것이 나을 것 같습니다.


마치며

위의 내용을 묶어서 결론을 내리자면, "loop안에서만 쓰는 변수 선언을 밖으로 빼는 것은 성능에 아무런 영향이 없으며, 굳이 성능을 개선하고 싶다면 RandomAccess 인터페이스의 고려, 반복되는 list크기 계산의 제거 등을 먼저 신경쓰라. 그리고 Java5을 쓰고 있다면 개선된 for문을 쓰라."는 것으로  정리하고 싶습니다.


사실 성능에 대한 고려는 병목이 발견될 때 필요하다면 하는 것이 바람직한 순서겠죠. 개발자는 알아보기 싶고, 관리하기 쉬운 코드를 짜는 것에 먼저 집중을 해야 할 것입니다. 그리고 고용량의 CPU가 돌아가는 환경이라면 개발자가 성능을 고려해서 짠 코드와 그렇지 않은 코드의 차이도  대부분 사람이 인지하지 못하는 정도의 미미한 것일 가능성이 높습니다. (TA팀 이상민 선임님의 테스트와 조언). 그런 점에서 본다면 이 글에서 가장 강조되어야 할 내용은 '변수의 유효범위의 최소화'라고 생각됩니다.


다른 분들이 추가로 자료를 찾는 번거로움을 덜어 드릴려고 관련 자료를 되도록 인용하고 링크를 걸었습니다. 그렇게는 했어도 혹시나 제가 잘못 이해해서 오류가 있는 부분이 있는지도 모르겠습니다.  고수분들은 그런 부분을 발견하신다면 즉각 지적해 주시기 바랍니다~ ^^

그리고 이 글은 계속적으로 갱신해서 개선을  하고 있는 중입니다. 제가 가입해 있는 커뮤니티 사이트 중 두 곳에도 이 글을 올렸는데, 거기에서 조언을 주신 많은 분들께도 감사드립니다.


참고자료

Java API문서와 링크외의 책에서 참고한 내용입니다.


  1. Effective Java , Joshua Bloch저 이해일역
    •  7장 프로그래밍 일반 - 항목29 - 지역변수의 유효범위를 최소화하라.
  2. 자바퍼포먼스 튜닝, Jack Shirazi 저 서민구 역 
    • 11장 적절한 자료구조와 알고리즘   
      • 질의 최적화 - 불필요한 반복적 메소드 호출 제거
      • RandomAccess 인터페이스
    • 6장 예외 단언, 캐스팅, 변수 - 변수
  3. Code completed 2nd Edtion, Streve McConnell 저 서우석 역  
    • 10장 변수사용시 일반적인 문제 - 10.3 변수의 초기화에 대한 지침
  4. Head First Design Pattern
    • 9장 이터레이터와 컴포지트 패턴

---------------------------------------------------------------------------------

출처 :http://www.it-bank.or.kr/prom/java_main.htm

Posted by 김윤석
이전페이지 1 2 3 4 다음페이지

카테고리

놀며즐기고 공부하기 (685)
 IT 정보 (653)
 재테크 (0)
 엔터테이먼트 (11)
 인터넷마케팅 (0)
 사이트 추천 (1)
사이드바 열기