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 : 건설업에서 온 개념. 업무주도적인 개발자가 되자~
     @노력하는자 < 즐기는자 < 습관(자기주도)

댓글 없음:

댓글 쓰기