2013년 8월 8일 목요일

java 상속과다형성

1. 상속
* 클래스 뒤에 extends 키워드를 이용 상속할 클래스 이름을 기술한다.
ex) public class A extends B{..}
* 상속된 클래스 A는 B 의 모든 생성자를 포함한 멤버변수와 메소드를 상속받는다.
  단 private 으로 선언된 메소드나 변수는 상속을 받지 않는다.
각각 public 과 private 변수 와 메소드를 준비


상속은 받은 객체 ex 생성하고 각각 변수에 접근했으나 private 로 선언된 변수와
메소드는 접근할수 가 없다

  *생성자는 상속가능하다 단 부모클래스에 생성자가 먼저 실행된다.


Java 예외처리

1.Throwable 클래스.

  모든 예외의 슈퍼클래스이다.
  Exception 과 Error 클래스로 나누어진다.
  Error 클래스의 정의된 예외는 기본적으로 Runtime 때 jvm에의해 감지되며
  개발자는 컴파일타임에 발생되는 Exception에 대해서 예외처리를 해주어야한다.

2. 예외처리의 목적
  프로그램은 예외가 발생하면 그로부터 다음 명령을 실행하지 않는다.
  따라서 프로그램이 강제 종료되는 문제가 발생되는데. error 는 컴파일시에
  컴파일러가 감지 하지 않기때문에 전적으로 JVM에 의해 발견되지만 Exception이 발생
  할수있는 부분이 컴파일러에 의해 감지되면 아얘 컴파일이 되지 않기때문에 발생가능
  한 예외는 개발자의 핸들링을 필요로 한다.

3. Exception 예외처리 방법
  1. Exception 클래스의 sub 클래스로 정의된 여러 가지 다양한 Exception 이 있는데
     첫번째 방법으로 직접 try catch finally 구문을 이용한 처리 방법이 있다.
   
컴파일러가 FIleNotFoundException 을 감지하였다.
위에 소스를 보면 aaa.txt파일에 입력을 하기위한 객체를 
연결했지만 aaa.txt파일이 없을경우에 대한 예외를 감지한내용이다.

try catch 블럭을 이용 예외발생지점을 try구문에 넣고 예외가 발생하면
해당 예외클래스에 대한 객체나 catch 영역에 파라미터로 전달되는데
printStackTrace() 메소드,즉 발생원인을 콘솔창에 출력해주는
기능을 하진 메소드를 해당 객체에서 호출하였다.
만약 예외가 발생되지 않는다면 catch 블럭은 수행하지않는다.
catch 블럭다음 finally 블럭이 올시 예외처리에 상관없이 finally 블럭은
무조건적으로 수행한다.

   2. Throws 를 이용 예외발생 블럭 메소드를 호출한영역으로 예외 클래스의 객체를
      파라미터로 전달한다.
throws (던지기) 를 이용 예외발생지점을 호출한 곳으로 발생클래스
객체를 파라미터로 전달한다. 지금 현재 main메소드에서 발생
했으므로 jvm에 객체가 전달됨.
만약 다른 메소드나 클래스에서 받게되고 예외처리를 해당 지역에서
해주었다면 전달되는 객체를 받아 개발자의 방법에 따라
처리 할수 있게된다.

   3. 1번방법과 2번방법을 합한 것이 세번째 방법인데 방법은 똑같다 다만 개발자 본인이
       예외를 처리하여 프로그램 종료를 막고 예외처리 블록을 호출한곳에 예외가 발생했
       다는 메세지를 전달하고자 할때 사용한다.

Java IO패키지에 중요 클래스 정리와 Straming programing.

1. IO패키지의 중요 클래스
     java.io 패키지에 보면 화면을 입출력을 담당하는 클래스들의 집합으로 기본적인
    데이터를 입출력하는 중요 클래스를 표로 정리해보겟다.
 일반적으로 InputStream, OuPutStream 은 이용한 입출력에는 문서나 문자 등을 제외한 동 영상 또는 사진을 입출력하며 문자 문자열 문서등 의 데이터는 Reader Writer 계열 클래스를
이용한다. 기본적인 추상메소드를 바탕으로 기능의 확장을 통한 상속구조를 이용해 각종
데이터를 입출력하는 원리이다.





2. Streaming programing 구조및 배경


오래전 각각의 드라이버장치는 각각의 cpu에 각 제품별 다른 명령어를 사용 프로그램 
구조가 다르고 변수 메소드등이 모두 달랏기때문에 소프트웨어 개발자들은 어플리캐이션에
서 1:1구조로 직접 드라이버에 접근하여 프로그래밍을 하는 비생산적인 방법을 하였으나.
MS 사의 노력으로 각각의 운영체제에 맞는 드라이버를 각각의 드라이버 창지별로 맞춰 
개발을 시작하게되었다. 소프트웨어 개발자들은 드라이버 장치에 정해진 변수와 메소드
구조를 개발하면 되도록 되었지만 여전히 각각의 드라이버와 소프트웨어가 호환을 이룰려면
여전히 불편함이 없지 않았다. 
요즘은 드라이버장치시 자동으로 해당 드라이버도 같이 설치하고 파일까지 자동 마운트 기능이 되어 바이너리 코드로 각각의 드라이버와 스트리밍을 하기 때문에 소프트웨어는 각각의 드라이버와 바이너리 코드로 통신을 하게되어 개발의 편의성과 생산성을 늘리게 되었다.
위 그림이 현재 스트리밍 프로그램의 통신구조이다.

2013년 8월 6일 화요일

회원관리 프로그램(게시판)만들기 콘솔버전

이클립스 에서 copy&paste 했기때문에 소스가 깔끔하지 않을수도 있지만 주석으로 
설명하겟다.
package net.bitacademy.java41.step07;

import java.util.ArrayList;     //Member class 에서 초기화된 객체의 주소값을 저장할
import java.util.Date;           //가변적인 배열 LIst를 위한 Import 작업
import java.util.Scanner;

public class RedApp {
protected Scanner scanner;
protected ArrayList<Member> list = new ArrayList<Member>(); //list선언
private int no;                   //데이터 삭제와 업데이트시 메소드에 list에 인덱스번호
                                       //를 전달할 변수
// * 생성자
// - 인스턴스가 사용되기 전에 역할을 수행하는데 필요한 
//   최소한의 것을 준비하는 메서드
// * default constructor
// - 파라미터가 없는 생성자.
// - 클래스에 명시적으로 선언된 생성자가 없다면,
//   컴파일러가 자동으로 기본 생성자를 추가한다.
// public RedApp() {}

public RedApp() {
scanner = new Scanner(System.in);  //스캐너 객체를 생성자를 통해 생성
list.add(new Member()    //어려워 보일수 있지만 Member 클래스에 set메소드의
.setName("홍길동")  //리턴타입을 그 객체에 주소값으로
.setPhone("111-2222")  //하였기때문에 타입이Member인 list
.setEmail("hong@test.com") //에 담을수 있다.
.setBlog("hong.blogspot.com")
.setAge(20)
.setRegDate(new Date()));
list.add(new Member()                      //add메소드를 이용 list에 각각의 Member
.setName("임꺽정")  //객체 를 추가
.setPhone("111-3333")
.setEmail("leem@test.com")
.setBlog("leem.blogspot.com")
.setAge(30)
.setRegDate(new Date()));
list.add(new Member()                      //add메소드는 사이즈를 자동증가
.setName("일지매")  //각각의 인덱스에 객체를 담는다.
.setPhone("111-4444")
.setEmail("ill@test.com")
.setBlog("ill.blogspot.com")
.setAge(40)
.setRegDate(new Date())); //위와같이 생성자를 만들어주는 이유는 입력은 사용자로부 
                                            //입력 받지만 중간 테스트를 위해서 매번 데이터를 입력해야
                                            //하는 불편함을 없애기 위해 만들었다.
}
private void add(){  //데이터를 추가하기위한 메소드
Member m = new Member(); //Member 객체 생성후 그 객체의 인스턴스변수를
System.out.print("이름 : ");  //사용자로부터 입력받아 초기화한후 
m.setName(scanner.nextLine());
System.out.print("전화번호 : ");
m.setPhone(scanner.nextLine());
System.out.print("이메일 : ");
m.setEmail(scanner.nextLine());
System.out.print("블로그 : ");
m.setBlog(scanner.nextLine());
System.out.print("나이 : ");
m.setAge( Integer.parseInt( scanner.nextLine() ) );//나이변수는 타입이 인트이
                //이기때문에 Integer.parseInt 를이용 정수를 반환하여 초기화한다.
System.out.print("등록하시겠습니까?(y/n)"); //사용자의 선택을 통해
if(scanner.nextLine().toLowerCase().equals("y")){
m.setRegDate(new Date()); //Date객체는 생성자로 현재시간을 반환
list.add(m);                                        //list에 추가한다.
System.out.println("등록되었습니다!");
} else {
System.out.println("등록 취소하였습니다!");//list.add를 하지 않으면 
}                                                                     //등록이 되지 않음
}
private void list() {
System.out.printf("%1$3s %2$10s %3$15s %4$30s\n",  //printf메소드를 이용
"번호", "이름", "전화", "이메일"); //간편 문자열처리 %1은 문자열순서
/*                                                //$3은 표현할 문자의 최대글자수 s는 String
                                                                  //타입의 변수를 뜻한다.
for(int i = 0; i < list.size(); i++) {
Member m = list.get(i); //for루프를 이용 list에 get메소드를 이용할수있지
}                                        //인스턴스에 접근하려면 코드가 길어지고 지저분
*/                                       //하기 때문에. 밑에방식을 쓰겟다.
// 위의 for문 보다 간결한 표현식
int no = 1;
for(Member m : list) { //list 배열의 사이즈만큼 Member 객체 에서 인스턴스변수
System.out.printf("%1$3d %2$10s %3$15s %4$30s\n",  //를 화면에 출력
no++, m.getName(), m.getPhone(), m.getEmail()); // 반복이아니라
}                                                                        //인덱스를 이동하면서!!
}                                               //선언된 no변수는 no++로 출력되는데 회원번호를
                                                         //의미한다.
public void execute() { //메인메소드에서 처음 호출되는 메소드로 사용자입력에따라
while(true) {         //각각의 메소드를 호출한다.
System.out.print("명령>");
String command = scanner.nextLine();
if (command.equals("add")) { //문자열은 equals메소드를 이용해비교
no = 0;            //no 변수를 주는 이유는 밑에서 설명하겟다.
add();             //add();호출 추가기능
} else if (command.equals("list")) {
no = 0;            //출력기능 역시 no변수를 0으로 초기화 하고있다.
list();               //도대체 왜!!!!!!!
} else if (command.startsWith("view")) {//startsWith메소는는 파라미터로 
                                //전달된 "view"같을경우 조건을 만족한다.
//명령>view 2 //<<이런식으로 입력을 받게되는데 
String[] values = command.split(" ");//split메소드를 이용 " "공백을 기                                 //기준으로 String 값을 반환하기때문에 두개의 view와숫자하나를
                                //모두 String 값으로 반환하게된다. 따라서!!! String 에 배열에
                                //순차적으로 들어가게된다.
no = Integer.parseInt(values[1]);// 드디어 나왔다 왜 no 변수가 
view( no );     //각각의 추가,조회 모드에선 0으로 초기화되고
                                                    //view메소드에서만 입력된 값을 받는지.....
                                    //이유인 즉슨!! 업데이트와 삭제기능을 게시물을 보고있는
                                    //상태에서만 기능을 수행하고 list의 위치값을 전달하기위한것이다
                                    
} else if (command.equals("update")) {
if (no > 0) {                                    //이부분 ! view를 호출하지
update();              //않으면 업데이트와 삭제를 할수 없다.!
} else {               //왜 
System.out.println("먼저 멤버를 조회하세요!");
}
} else if (command.equals("delete")) {
if (no > 0) {                  //view를 메소드가 호출되다면 조건을 만족
detele();               //업데이트와 삭제 메소드 호출된다.
} else {
System.out.println("먼저 멤버를 조회하세요!");
}
} else if (command.equals("quit")) {
System.out.println("안녕!"); //프로그램 종료부분
break;
}
}
}
private void detele() {
list.remove(no - 1);  //-1을 해준이유!! 글번호는 3번이라면 list에 위치는 0
no = 0;                    //부터 시작하기 때문에 -1해줘야한다. 역시 다시 0으로~
System.out.println("삭제되었습니다!");
}

private void update() {
Member m = list.get(no - 1); //일단 입력받은 위치에 인덱스에 접근. 역시-1
Member copy = m.clone(); //변경을 취소할수도 있기때문에 일단 객체의 카피본생성
System.out.printf("번호(%1$d):", no); //no값은 직접세팅! 입력을 받지 않기때문에.
System.out.printf("이름(%1$s):", m.getName());//Member 클래스에 정의된 clone메소드
String value = scanner.nextLine();  //를이용 다른 Member객체를 생성 인스턴스변수를
if (value.length() > 0) {  //list에 no에 위치객체에 접근 인스턴스를 복사한다.
copy.setName(value);  //수정할 데이타가 없다면 변경하지 않는다.
}
System.out.printf("전화(%1$s):", m.getPhone());
value = scanner.nextLine();
if (value.length() > 0) { // 위와동일
copy.setPhone(value);
}
System.out.printf("이메일(%1$s):", m.getEmail());
value = scanner.nextLine();
if (value.length() > 0) { // 역시 동일
copy.setEmail(value);
}
System.out.printf("블로그(%1$s):", m.getBlog());
value = scanner.nextLine();
if (value.length() > 0) { // 또 동일
copy.setBlog(value);
}
System.out.printf("나이(%1$d):", m.getAge());
value = scanner.nextLine();
if (value.length() > 0) { //인트타입 마춰주는거빼고 동일
copy.setAge( Integer.parseInt(value) );
}
System.out.print("변경하시겠습니까?(y/n)");
if(scanner.nextLine().toLowerCase().equals("y")){ //역시 대소문자를 가리지않게 
copy.setRegDate(new Date());                            //셋팅하고 Date객체정보도 가져온다
list.set(no-1, copy);                                           //set메소드를 원레 위치값에 복사된
System.out.println("변경되었습니다!");                 //인스턴스의 주소값을 전달(copy)
} else {
System.out.println("변경 취소하였습니다!");   //취소할경우 복사된 객체는 메소드가 
}                                                                 //끝남과동시에 소멸 list에 Member 타입의
}                                                                  //배열의 요소는 변하지 않는다.
                                                                     //역시 no = 0;초기화를 해주어야한다.
                                                                     //(소스엔 빠짐)

private void view(int no) {                                //list에 담긴 객체정보를 전부 출력하는
if (no > 0 && no <= list.size()) {                      //메소드
Member m = list.get(no - 1);                          //굳이 Member 객체를 선언하지 않아도 
System.out.println("번호:" + no);                    //되지만 소스의 간결함과 가독성을 위해
System.out.println("이름:" + m.getName());     //객체 m 을 생성 접근하였다.
System.out.println("전화:" + m.getPhone());
System.out.println("이메일:" + m.getEmail());
System.out.println("블로그:" + m.getBlog());
System.out.println("나이:" + m.getAge());
System.out.printf("등록일:%1$tY-%1$tm-%1$td \n", m.getRegDate());
} else {                                                        //Date 인스턴스에 접근하고 출력시
                                                                     //printf메소드를 사용 (API)참조
System.out.println("존재하지 않는 멤버의 번호입니다.");
}
}

public static void main(String[] args) {
// * 인스턴스 생성
// - 개별적으로 값을 다루기 위해, 클래스에 선언된
//   인스턴스 변수를 준비
// - 인스턴스가 사용되기 전에 필요한 작업을 수행하도록
//   생성자 메서드를 호출한다.
RedApp app = new RedApp();
app.execute();
}
}
                                                     (1)RedApp class

 메인메소드를 포함한 RedApp 클래스 밑의 Member 클래스와의 
관계를 눈여겨보라.

package net.bitacademy.java41.step07;

import java.util.Date;

// * Value Object = Data Transfer Object
// - 여러 속성의 값을 관련된 것 끼리 하나로 묶어서 다루는 클래스
// - 예) Member, Project, Task
public class Member {
private String name;
private String phone; //InCapsulation(캡슐화) 접근제한자가 private 
private String email;   // 다른 클래스에선 직접 엑세스가 불가능하다.
private String blog;
private int age;
private Date regDate;

//getter and setter 를 통한 인스턴트 접근
public String getName() {
return name;
}
public Member setName(String name) {
this.name = name;
return this; //this 키워드는 현재 객체의 주고값 즉 Member class 에 주소값을 뜻한다.
}
public String getPhone() {
return phone;
}
public Member setPhone(String phone) {
this.phone = phone;
return this; //왜 모든 setter메소드가 현재객체를 반환하고 있을까?
}
public String getEmail() {
return email;
}
public Member setEmail(String email) {
this.email = email;
return this; // 위에서 언급했듯이 미리 데이타를 입력하기위해 현재 객체를 반환 
                  // RedApp 클래스 생성자를통한 인스턴스 변수의 셋팅을 위함이다.
                  //프로그램 취지상 않해도 되긴하지만 test 할때 매번 데이타를 직접 입력
                  //해야하는 번거로움을 없애기위해서!!!
}
public String getBlog() {
return blog;
}
public Member setBlog(String blog) {
this.blog = blog;
return this;
}
public int getAge() {
return age;
}
public Member setAge(int age) {
if (age > 0 && age < 120) { //혹시라도 말도 안되는 나이값이 설정되지 않기위한 조건
this.age = age;                 //나이가 중요시되는 병원 기타등등 데이터의 오류입력을 
}                                      //원천봉쇄 하고자함.
return this;
}
public Date getRegDate() {
return regDate;
}
public Member setRegDate(Date regDate) {
this.regDate = regDate;
return this;
}
public Member clone() {      //RedApp클래스에 update 때문에 만들어진 메소드
Member m = new Member();// 새로운 멤버 객체를 만들고 그객체에 현재 객체의
m.name = this.name;          //인스턴스변수 값을 복사하고
m.phone = this.phone;        //복사된 인스턴스 변수값을 가지고있는 새로운 m객체를
m.email = this.email;           //반환 RedApp 에서 명령에따라 list에 set 하게된다.
m.blog = this.blog;
m.age = this.age;
m.regDate = this.regDate;
return m; // 이부분 
}
}
각각의 데이터 초기화를 위한 Value Object 클래스 

자, 그렇다면 결과물을 확인할때다.
1.사용자 입력은 생략하겟다 생성자로 셋팅했기때문에.
2.list 입력시 현제 저장된 데이터가 출력된다. 물론 프로그램종료시 다 날라감...
3.add 입력시 데이터를 입력받는다. 단 한글입력시 콘솔창에서 깨지는 현상이
  나타나는데 일단은 데이터의 이동에 집중 하자 편집도 엉망이지만...
4다시 list 입력시 추가된 4번 리스트를 확인할수있다. 단 등록확인란에서 꼭y를
  입력해야한다 n 입력시 등록이 되지 않는다.
5.view 2 를 입력하면 번호 2번에 데이터가 출력된다.임꺽정이네.
6.2번데이터 출력과 동시에 2-1한 값이 RedApp 클래스에 전역변수에 값이 들어감으로
7.delete 메소드를 호출할수 있다. delete 메소드는 전역변수에 값이 0보다커야만 호출되
  므로....
8 역시 아직 delete 메소드는 호출 하지 않았기 때문에 전역변수 no의 값은 1을 가지고 있
  어서 update가 가능 하다 update 부터 하겟다.
9.update 입력을 하면 view 명령어로 볼수있던 임꺽정의 정보가 올라오고
  : 옆에 새로운 데이터를 입력할수있다.xxx로 통일했음.
10.y를 입력하여 변경을 완료한후 다시 list를 입력하면 기존에 임꺽정은 없어지고
    xxx가 입력된걸 확인할수 있다.
11.다시 xxx를 지우기 위해 view 2를 입력하여 열람한후 delete 명령어를 입력하면
    삭제되었습니다. 는 문구가 나온다.
12.다시 list를 입력해서 확인해보면 xxx 의 데이타는 없어졌다. 이로인해 모든기능완성!!
여기까지 봐주신분이 계시다면 쌩유..












2013년 8월 5일 월요일

java 실행흐름 과 기본 자료형

1.실행흐름에 따른 메모리 구조

1. 메인메소드가 위치한 클래스 정보를 Method Area 에 로팅(유효검사)

2. Static 으로 정의된 변수를 준비하고 static 블록을 실행한다.

3. main메소드가 호출 되고 메인메소드내에 선언된 local 변수를 stack 영역에 생성

4. main 메소드내에 호출되고 있는 클래스에 대한 정보가 Method Area에 로딩 되며

       2,3단계를 똑같이 실행한다.

5. main메소드에서 객체를 생성시 레퍼런스변수에 해당 클래스에 인스턴스 변수에

           주소값이할당되고 인스턴스변수는 0, 또는 null로 초기화된다.

6. Method Area에 로딩 된 해당클래스에 각 각 객체의 주소값과 인스턴스 변수를 파라

           미터로 전달

7. 각각의 메소드의 local변수에 그값을 초기화하고 블록을 수행후 리턴한 값을 생성된          
           인스턴스변수에 초기화 한다.(각 각의 객체마다 다른값을 가지게 됨)

8. stack 영역에 main메소드에서 호출한 클래스정보가 모두 삭제되고 6,7,8을 반복.
   
           프로그램이 종료되면 모두 소멸한다.

2.기본 자료형과 유니코드.

정수형 : byte,short,int,long
실수형 : double, float
문자형 : char
부울린형 : boolean

1. 데이터 타입의 표현 범위
8bit -> 1byte
각비트별 0과1을 사용 이진 법으로 표기
n바이트의 표현범위
-2에n-1승~ 2n-1승 -1(-1이 되는 이유는 0의 표현범위를 할당하기 때문)
마지막비트는 부호비트로 0은 양수를 표현 1은 음수를 표현
char은 문자 타입으로 음수의 표현이 필요 없기때문에
표현 범위는 2에n승-1 가지로 표현 되고 문자데이터는 유니코드로 변환
16진법으로 저장 2byte(16비트)

ex) 0xAC1f (10~15는 a~f로 표현)

컴파일시 작은 데이터를 큰데이터를 담는것은 묵시적 형변환을 통해 가능하지만
큰데이터를 작은데이터에 넣게 될 경우 컴파일 오류가 발생하며 형변환을 해도
데이터 훼손될수 있다.

2. byte :  1바이트(8비트) 메모리 공간을 할당하며 8자리수 2진법으로 표현된다

-128 ~ 127

3. short :  2바이트(16비트)메모리에 공간을 할당하며 16자리수 2진법으로 표현된다

-32768 ~ 32767

4. int : 4바이트(32비트)메모리에 공간을 할당하며 java에 기본적인 정수 표현
            데이타이다.

-2147483638 ~ 2147483637

5. long 8바이트(64비트) 메모리에 공간을 할당하며 아주큰 정수값의 표현에 쓰인다.

-아주큰값 ~ 아주큰값

6. float 4바이트(32비트) 실수를 저장 하는 자료형으로 소수점 자리를 포함 일곱번째까지

           정확한 값을저장할수 있으나 그를넘어선 범위내에선 약간에 오차가 발생할수 있다.

           때문에 부동 소수점 이라고 불리운다. 변수 선언시 데이타입력 마지막에 소문자 f

           또는 대문자 F를 입력해야한다.

ex) float f = 1.5F;

7. double 8바이트(64비트) 실수를 저장 하는 자료형으로 소수점 자리를 포함

     열다섯번째자리까지 정확한 값을 저장 할 수 있으나 역시 넘어선 범위에선 오차가 발생

     할수 있다. 역시 부동 소수점이라 불리고 데이타마지막에 소문자l또는 대문자L 을

     입력해야한다.

8. char 문자형 데이터저장의 자료형으로 2바이트(16비트) 의 데이터 크기를 갖고

           총 65534 가지 문자를 표현할수 있다. 대입연산자를 통한 데이타 저장시''(어퍼스트

           로피)가 필수적으로 사용되야하는데 char 형은 16진법 숫자를 데이터 저장되어

           저장된 숫자에 따른 유니코드를 참고하여 문자데이터를 저장하기때문에 직접 유니

           코드를 입력할수도 있지만 '' 명령어 안에 있는 문자데이터에 유니코드를 반환해주

           기 때문에 이를 이용하는것이 효율적이다. char 형 데이타를 저장하는 방법은

           여러가지가 있다.

            ex)
   
           char 문자0 = '가';
           char 문자1 = '\uAC00';  =  유니코드값 지정
           char 문자2 = 0xAC00;     =  16진수 값 지정
           char 문자3 = 44032;        =  10진수 값 지정
           char 문자4 = 0126000;     =  8진수 값 지정


9. boolean : true 또는 false 를 반환하는 타입으로 jvm에 따라 다른 데이터 범위를
         
            갖는다. 반복문 조건문등에 많이 쓰이는 데이터 타입.
     




 


2013년 8월 2일 금요일

JAVA 메모리 영역

1. 메모리 영역
   1.Method Area
     .class 파일을 로딩한 메타데이터를 가지고 있는 공간.
     프로그램 실행시 컴파일타임을 통한 소스에 안정성을 확인하고
     static 변수를 static 영역에 준비하고 static 메소드 호출을 한다.
       

   2.Heap Area
     new 키워드 통한 객체생성시 생성되는 인스턴스변수가 실제적인 메모리에 올라오게
     되는 공간으로 클래스 로딩후 stack 영역에 로딩된 클래스 메소드와 레퍼런스 변수를
     통한 접근이 가능.
   3.Static Area
     static 으로 선언된 변수 또는 메소드의 정보가 있는 공간으로 접근제한자를 public 으로 
     열어둘시 어떤 클래스에서든지 클래스이름.변수,메소드 이름으로 접근이 가능하고
     같은의미로는 각 객체마다 데이터밑 메소드가 공유되는 공간이다.

   4.Stack Area
     프로그램 시작점인 메인메소드가 호출 되는 공간이며 클래스 파일 로딩시
     static으로 선언되지 않은 메소드가 준비 되는 공간이다. 메인메소드 내에서
     클래스 객체 생성시 로딩을 통한 멤버변수 메소드 정보를 갖게 되며 레퍼런스 변수를통
    메소드에 접근 힙영역에 실체화된 인스턴스 변수에 데이타를 전달 한다.


ex)
Num클래스에 멤버변수에 인스턴스 변수와 Static 변수(클래스 변수)를 선언
각 각 멤버 변수의 값을 1씩 증가시키는 increseNum() 선언
Count 클래스에서 main메소드를 호출 하고 각 Num클래스의 객체 n1,n2를 생성
각각 의 객체에서 increseNum()를 호출 하고 있다

각 객체에 num값과 static 변수에 num2 에 접근 출력한결과 
각 객체에 num값은 1이출력되었지만 static 변수 num2 의 값은 2가 되었다.
결국 static 변수는 static 영역에 존재하며 각각의 객체에서 데이타가 공유 되는것을 알수
있다. 고로 Static 변수는 별도의 객체 생성없이 클래스 이름만으로 접근이 가능하다(단,public으로 열려있어야함)

*.java파일을 컴파일하면 메소드 실행가능여부를 검사후 메소드 영역에 메타데이터로 로딩
  (static 변수나 메소드는 static 영역에 준비된다)
*JVM에 의해서 런타임시 생성되는 객체의 클래스 정보를 참조 메소드가 Stack영역에 
 로딩 되고 각 객체는 힙영역에 생성되는 인스턴스 변수에 주소 값을 갖는다.




SVN 이클립스 연동

1. Help-> Eclipse Marketplace 선택
2.Find  창에 SVN 또는 subversion 을 검색 go 를 누르면 TeamProvider 검색된다. 
   가차 없이 인스톨 버튼을 눌러라
3.설치할 항목 체크하라고 하는건대 모르면 다체크 초보개발자는 밑에서
  세번째 항목 체크 다음
4.동의 후 finish
4.인스톨 화면
6.이클립스를 다시 실행할꺼냐는 메세지가 나오면 yes
7. 이클립스가 재실행되면 SVN 클라이언트 설치가 완료 된것임.
   connector 를 설치하기 위한 화면 1.7 선택
8.넥스트
9.또 넥스트
10.동의후 finish
11.어떤 경고가 나오지만 무시하고 ok



11.계속 ok 동의 넥스트 화면을 넘기다보면 설치가 완료된다 windows->preferences->Team->SVN에 설치완료된 화면을 확인 !! 끝