2013년 8월 2일 금요일

[2일차] 2013.08.02 계산기prog with 형상관리, java메모리구조

# 계산기 프로그램

1. 기능별로 묶는다.[+, -, *, /, 입력,출력] - 관리 쉽게.==> function (== procedure@cobol)
2. 역할, 책임 - Role, Responsibility 별로 나눠 ==> 향후 확장성 위해.
   ==> class : 향후 확장성 위해.(객체지향-function을 역할 별로 다시 묶어(group화) )
          - 객체지향 등장한 이유 - H/W 성능 좋아지면서 program복잡성 높아져
             향후 확장성,관리편이를 위해 메소드를 다시 한 번 묶어 줌.(단, 속도는 느려짐)
             ====> 유지보수 관리편이를 위해 속도 포기. tradeoff
                      (쪼갤수록 재사용성 높아짐.)
      ex) 계산기 : view(입출력),계산(+, -, *, /) : 기능별 grouping.


// import 문장 선언 시 *를 사용하기 보다는 가능한 정확하게 선언
// - 컴파일 속도를 조금이라도 빠르게 할 수 있다.
// - 코드의 가독성을 높인다.
// - 컴파일 시에 참고하는 용도 -> 컴파일 하고 난 후에는 버려짐.


---------------------------------
CalculratorView.java
Calculrator.java --> step02
---------------------------------

3. Refactoring(리팩토링) - 코드를 관리하기 좋게 구조개선 (기능추가x,클래스별 코드량 줄고,가독성 높아짐)
// Refactoring: replace temp with query
// - 한 번 밖에 사용되지 않는 임시 변수는 직접 메서드 호출로 대체한다.



4. 계산기 프로그램 - 중간계산 결과 개별 관리 필요.
여러 계산을 동시에 수행하려면 중간 계산 결과를 개별적으로 관리하기 방안 필요! ==> 역할을 수행하는 동안 사용되는 값을 개별화 시키는 기법 ==> 인스턴스화!!! ==> 개별적으로 관리되어야 할 값은 인스턴스 변수에 저장해야 한다. ==> 인스턴스 변수 만들기? static 을 빼라! Calculator의 인스턴스 변수를 두 개 준비한다. stack 메모리 영역 - 메서드에서 만드는 로컬 변수를 저장 - 메서드 호출이 끝나면 그 메서드를 위해 만들었던 모든 변수를 삭제. Heap 메모리 영역 - 인스턴스 변수를 저장 Calculator c1 = new Calculator(); /* JVM에게 명령, Calculator 클래스를 확인하여 인스턴스 변수가 있다면 해당 변수를 Heap 영역에 준비하라! => 인스턴스 생성! => 인스턴스 변수가 시작되는 바이트의 주소를 리턴 c1 변수는 인스턴스의 시작 주소를 저장하는 주소 변수. 포인터 변수. */


[java 프로그램 실행순서]
1. java -classpath .... net.bitacademy.java41.step05.CalcTest
2. CalcTest.class 파일을 Method Area 영역에 로딩.
  * 클래스 로딩
1) 클래스 파일이 유효한지 검사
2) static 변수 준비
3) static 블럭 수행
3. main() 메서드 호출
4. Stack 영역에 main() 메서드의 로컬 변수를 준비
5. main() 메서드의 명령어 실행 중 Calculator.init() 호출문을 만나는 순간, Calculator 클래스 로딩.

[메모리 구조]

  1. 클래스 로딩(main() 메소드 호출) => Method Area
  2. class의 static 변수 준비 => Static Area
  3. static block 사용하여 수행 준비 => Method Area
  4. 인스턴스 변수 저장 => Heap
  5. 로컬변수 저장 => Stack 
    1. 메소드 호출이 끝나면 stack 메모리는 비워짐.

    메모리구조 설명참고
    => http://blog.naver.com/PostView.nhn?blogId=gabriel125&logNo=20016636425


# 형상관리
 - S/W의 변경을 관리.(대상 : who, when, what)
 - source변경을 관리.(실행파일 관리가 아님)
 - sw 규모가 커지면서 관리의 필요성 부각.
 - 1인 -> 다인 개발로 바뀌면서 부각.
 - Configuration Management  CM
 - Software Configuration Management  SCM
 - Version Control System  VCS

 - 형상관리도구
   무료 - CVS,SVN,GIT
   유료 - ClearCase, SourseSafe(MS), Starteam

  • CVS : 형상관리 서버에 관리대상 전체를 올리고 내림.
  • SVN : 변경된 것만 올리고 내림.(용량 속도면에서 효율적)

    • eclipse에 SVN 플러그인 추가.
    • eclipse help>marketplace > svn검색 후 → subversive SVN Team Provider 선택 /설치.
    • SVN Repository 에서 파일 가져오기
      • eclipse > window > show view - Other : SVN 검색
      • SVN Repositories 선택
      • 오른클릭 > NEW : Repository Location 선택.
        • http://svn.eomjinyoung.com/repos/lecture 추가.
      • Repository 의 파일 내려 받기.( checkout as 선택 > Test01_T 로 저장함)
    • 관련용어
      • checkout - SVN은 특정한 '저장소(Repository)'에 기록된 정보들을 통해 소스 코드의 버전을 관리합니다. 이 체크아웃이라는 것은 이러한 '저장소'에 접근해 소스 코드와 버전관리를 위한 파일들을 받아 오는 행위를 의미합니다.
      • commit - 파일 수정 후 리파지토리로 업로드 하는 것.
      • update - 리파지토리의 수정된 파일을 받아오는것.
      • conflict - 이미 업데이트 된 파일을 구버전 파일을 수정하여 commit 할 때 발생.
      • merge - 충돌(conflict)가 발생한 경우 수행. 서로 다른 부분이 수정되었다면 merge로 해결. 같은 부분이라면 최신 버전으로 다운받아 나중에 수정한 사람이 수정하면 해결됨.
    • SVN 사용법 참고

==============================================================================
// * 참고 : 용어정리
// Calculator → 클래스 이름
// net.bitacademy.java41.step03.Calculator
//     → 패키지명 + 클래스명 = fully-qualified name = QName
  • forName

    public static Class<?> forName(String className)
                            throws ClassNotFoundException
    Returns the Class object associated with the class or interface with the given string name. Invoking this method is equivalent to:
    Class.forName(className, true, currentLoader)
    where currentLoader denotes the defining class loader of the current class.For example, the following code fragment returns the runtime Class descriptor for the class named java.lang.Thread:
    Class t = Class.forName("java.lang.Thread")
    A call to forName("X") causes the class named X to be initialized.
    Parameters:
    className - the fully qualified name of the desired class.→ javadoc등 문서 볼때 유용.
    Returns:
    the Class object for the class with the specified name.
    Throws:
    LinkageError - if the linkage fails
    ExceptionInInitializerError - if the initialization provoked by this method fails
    ClassNotFoundException - if the class cannot be located

    ----------------------------------------------------------------------------------------------------
    * [책 참고] 리팩토링 : 코드 품질을 개선하는 객체지향 사고법 
    마틴 파울러 저/김지원 역 | 한빛미디어 | 원서 : Refactoring (Addison-Wesley Professional; 1 edition, 1999)  
    http://www.yes24.com/24/Goods/7951038?Acode=101
     @MM man month : 건설업에서 온 개념. 업무주도적인 개발자가 되자~
     @노력하는자 < 즐기는자 < 습관(자기주도)

2013년 8월 1일 목요일

[1일차] 2013.08.01 java 그리고 개발환경 준비

A. java 
1.java SE, EE ,ME, JRE 차이.

JRE(Java RuntimeEnvironment)
자바 런타임 환경 : 자바가 실행되는데 필요한 기본 환경을 뜻함.
프로그래밍된 자바 클래스를 실행할 수 있는 기본 실행환경.

JDK(Java Deveopment Kit)
자바 개발 키트(Javac 포함)
자바 프로그램은 자바 바이트 코드 인터프리터(Java Complier)인 javac 컴파일러를 통해서  class 파일로 변환된다. class 파일은 플랫폼과 무관한 코드이기 때문에 바이트 코드(ByteCode)라고도 한다. 바이트 코드는 각 플랫폼에 있는 자바 가상 머신의 자바 바이트 코드 인터프리터를 통해 실행된다. 자바 가상 머신의 바이트 코드 인터프리터는 실제적으로는 java 명령어나 웹 브라우저에 포함되어 있다.
 - javac ( 컴파일러 ) : 자바 컴파일러
 - java (인터프리터) : 자바 인터프리터는 디폴트로 JIT(Just In Time) 컴파일러를 사용한다. 클래스가 로드되면 JIT은 클래스의 바이트 코드를 기계어로 변환한다. JIT을 사용하는 경우에 일반적으로 클래스 로드하는 시간이 오래 걸리지만 전체적인 시스템 성능은 높아진다. 
 - appletviewer ( 애플릿 실행기 ) : 애플릿을 실행시켜주는 브라우저이다.
 - javah ( 헤더 파일 생성기 ) : C언어를 위한 헤더 파일을 생성한다.
 - jar ( Java 용 압축프로그램, 배포용 ) : 자바 압축 파일을 만들고 압축을 풀어준다.
 - javap ( 역어셈블러 ) : 클래스 파일을 역어셈블(기계어 형태로 번역)한다




2. java application 구동방식






B. 개발환경 설정
1.JDK 설치
    - 파일 다운로드 및 설치
       http://www.oracle.com/technetwork/java/javase/downloads/index.html
    -  환경변수 설정
           JDK도구들의 경로 => OS 환경에 등록 => PATH 환경변수에 등록
           => JDK도구가 있는 폴더가 아니더라도 어디서든 해당프로그램 실행가능.
           => jdk 설치경로를 JAVA_HOME 환경변수로 추가하여
                여러 변수에서 jdk위치를 참조할 경우 JAVA_HOME 변수만 수정하면 되도록 처리.







2. 작업폴더 준비
           C:\javaide => 작업폴더
           C:\javaide\test\src => 소스폴더
           C:\javaide\test\bin => class폴더
           C:\javaide\test\workspace => 이클립스 workspace폴더

    # 1개의 public class => 1개의 .java 파일만 생성됨.

    # public class가 아니면, 파일 이름은 상관없음.

    # 컴파일하면, 파일안에 있는 모든 클래스가 각각의 .class 파일로 생성됨.
         퍼블릭으로 선언된 클래스는 독립적으로 저장되어야 한다.
                         (위 Hello.java를 컴파일하면 아래 처럼 2개 클래스 생성.)


    # 패키지에 소속된 클래스는 반드시 해당 패키지명에 해당하는 위치에 저장 되어야 한다.

    # 패키지로 생성된 클래스는 반드시 패키지명을 root패키지가 있는 폴더명까지만 명시.
         C:\javaide\test> java -classpath .\bin net.bitacademy.java41.Hello



3. 이클립스 설치
   - 이클립스 다운로드 http://www.eclipse.org/downloads/
   (빨간 사각형 안의 Eclipse IDE for Java EE Developers 를 다운 받는다)
   - 다운로드 받은 zip파일을 C:\javaide\eclipse 아래에 풀면 끝.(install 불필요)



4. 이클립스 문자셋 수정 (MS949 ==> UTF-8)
    - Workspace,


  - MS949 = euc-kr(국제표준) + 알파(표준아님) >>> 표준이 아닌 문자일때 깨짐 발생.ex-똠,햏



5.이클립스가 꺼지거나 Could not researve enough space for object heap 발생시
(컴퓨터 사양 부족)


=> eclipse.ini 열어 제일 아랫줄 수정.
. . .
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms40m
-Xmx512m  →  Xmx368m

==> eclipse.ini 다시 수정(제일 하단 2줄 추가)
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.200.v20130521-0416
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms40m
-Xmx368m
-vm

C:\Program Files\Java\jdk1.7.0_25\bin\javaw.exe




6. 이클립스 자동컴파일 설정
    Project 메뉴 > Build Authmatically 를 선택하면 된다.(저장하면 바로 컴파일 OK)