'My work space'에 해당되는 글 113건

  1. 2008.08.14 아스키 코드표
  2. 2008.08.14 JAVA SDK API 1.5 한글번역문서
  3. 2008.08.14 Stack 메모리와 Heap메모리 개념정리(수업내용)
  4. 2008.08.14 Stack 메모리와 Heap메모리 개념정리(수업내용)- 추가
  5. 2008.08.14 Heap과Stack영역에서의 경계 체크를 통한 Buffer Overflow 공격 방지 기법에 대한 연구
  6. 2008.08.14 UML (Unified Modeling Language)
  7. 2008.08.14 Java동적내용의캐싱방지
  8. 2008.08.14 HashTable & HashMap 설명
  9. 2008.08.14 상하위 클래스에서 생성자간의 관계
  10. 2008.08.14 JVM의메모리구조
2008. 8. 14. 16:08

아스키 코드표

 
2008. 8. 14. 16:06

JAVA SDK API 1.5 한글번역문서

출처 : http://www.okjsp.pe.kr/seq/88948


강혜원님의 JAVA SDK API 1.5 한글번역문서



okjsp를 보다가 발견했음 좋으련만..

다른 JAVA 관련 카페에 있길래 링크 들어가봤답니다.

2008. 8. 14. 16:03

Stack 메모리와 Heap메모리 개념정리(수업내용)

값저장

ex) 3,  2,3,4,5, "Hello" ....

a>int num = 3;

b>배열 배열은 같은type만저장

c>Collection 객체만 저장 가능

     └--->Vector,ArrayList,Map..


Heap 메모리 :저장된데이터를 Direct로 접근(JVM에의한Gabage Collection)

Stack메모리 : 레퍼런스 거쳐서접근


heap   인스턴스변수를포함한객체(=instance)=>객체가생성될때만들어지고 객체소멸시 삭제(new해서 객체생성될때마다)

stack   local변수 메소드호출시 생성 메소드 끝나면 소멸 (메소드호출할때마다)

class area 메모리   static변수(class변수)=>프로그램실행될때 생성 프로그램종료될때 소멸(main()메소드)

┌─────────┐

│      Animal            │

├─────────┤

│+name:String         │

│+getName(n:String)│

│+Animal(n:String)   │

└─────────┘

public class Animal{

       public static name;

       public String getName(){return name;}

       public Animal(String n){name=n;}//파라메터 변수는 local변수

}



public class TestAnimal{

       public static void main(String [] args ){

       Animal a = new Animal("고양이");

       System.out.println(a.getName);

       }

}







java memory

heap 인스턴스변수(=attribute)
stack (LIFO)local변수

2008. 8. 14. 16:02

Stack 메모리와 Heap메모리 개념정리(수업내용)- 추가




  생성시점  변수명  정의  메모리  주의할점
 메소드호출  local변수(파라메터 변수포함)  메소드안에서 정의  stack  사용전의 초기화해야함
 new했을때  인스턴스 변수  메소드밖에선언static지정자x  heap  초기화안하면기본값초기화
 프로그램 시작시  class(static)변수  메소드밖선언 static지정자o  class Area  초기화안하면기본값초기화

2008. 8. 14. 15:56

Heap과Stack영역에서의 경계 체크를 통한 Buffer Overflow 공격 방지 기법에 대한 연구

2008. 8. 14. 15:55

UML (Unified Modeling Language)

ico-file animal.java
ico-file cat.java
ico-file fish.java
ico-file pet.java
ico-file spider.java



도식 , 의사소통 등을 위해 그려지는 UML 이라는 언어 ,Class 다이어그램이라고한다

네모칸에 맨윗부분은 클래스명이고  두번째칸은 Attribute 그다음칸은 메소드나 생성자가 온다

*visibility (가시성)

실제 자바에서 Acces modify(접근 지정자)는                               visibility로써는

                                                             public   ------------------------------      "  +  "                                 

                                                             protected-----------------------------      "  #  "

                                                             default(friendly)-----------------------      "      "

                                                             private  ------------------------------      "  -   "


로 표현된다


표현식으로 visibility Attribute명 : type

                visibility 메소드명() : return type(return type이 void면 생략가능)


메소드에 밑줄이 쳐져있는것은 static


스트레오타입으로 표현 <<        >>

                                               예)<<interface>>    ,    <<abstract>>

추상클래스는 이탤릭체로 표현


두가지 종류의 화살표

실선의 화살표는 extends를 한다는 의미

점선의 화살표는 inferface를 한다는 의미

2008. 8. 14. 15:53

Java동적내용의캐싱방지

동적 내용의 캐싱 방지
웹 브라우저 및 프록시 서버가 동적으로 생성된 웹 페이지(즉, JSP 파일과 Servlet의 처리로 인해 발생한 동적 출력)를 캐싱하지 않도록 방지하려면, 다음 코드를 사용하여 HTTP 응답에 헤더를 설정하십시오.
response.setHeader("Pragma", "No-cache");
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-cache");
HTTP 헤더를 설정하는 것은 태그에 해당하는 것들을 사용하여 브라우저 캐싱을 제어하는 방법에 비해 더 효과적입니다. 예를 들어, 는 첫 번째 HTTP 헤더 설정과 같습니다. 다음과 같은 이유에서 HTTP 헤더를 설정하는 것이 좋습니다.
일부 브라우저는 태그를 동등한 HTTP 헤더 설정과 같은 방식으로 처리합니다.
일부 브라우저의 경우, callPage() 메소드를 사용하여 태그가 들어 있는 JSP 파일을 로드할 때 태그가 작동하지 않습니다.
페이지가 캐싱되도록 하되 프록시 서버에서 여러 사용자가 캐싱된 페이지에 액세스하지 못하도록 하려는 경우가 있을 수 있습니다. 예를 들어, 사용자 Servlet이 세션 추적을 사용하지 않지만 사용자 입력이 들어 있는 웹 페이지를 생성하는 경우, 개인 정보를 유지하려면, 다른 사용자가 캐싱된 페이지에 액세스하지 못하도록 해야 할 것입니다. 포록시 서버가 캐싱된 페이지를 공유하지 못하도록 하려면, 다음 코드를 사용하십시오.

response.setHeader("Cache-Control", "private");
캐싱을 방지하기 위해 이 헤더를 세 가지 권장 헤더와 결합할 수 있습니다




///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



문자열

String             철사

StringBuffer      고무줄

+                  =========연결연산자


문자열 비교


값비교


2008. 8. 14. 15:52

HashTable & HashMap 설명

 

기본적인 동작은 HashTable이나 HashMap은 같습니다.

즉  Key object - Value object 를 쌍으로 저장하여 seek타임을 줄이기 위해 hash값을 이용합니다.

 

Hashtable

Hashtable 은 키나 값에 Null을 허용하지 않습니다.

또한 Object에 정의된 hashCode()와 equals()메소드를 재의하는 객체들만 저장할 수 있습니다.

다행히도 자바 내장 클래스들은 대부분 hashCode()구현되어 있다는 것을 아실겁니다.

특히 String 타입이 hashCode(), equals()메소드 두개 모두 구현되어 있지요.

 

Hashtable은 Map 클래스와 마찬가지로 반복자(interator)를 직접제공 하지 않습니다

다음 두가지 방식으로 HashTable 내용을 출력합니다.

 

Hashtable hashtable = new Hashtable();

hashtable.put("jakarta", "project");

hashtable.put("apache", "tomcat");

 

Enumertaion keys = hashtable.keys();

while(keys.hasMoreElements()) {

   key = (String)keys.nextElement();

   System.out.println(hashtable.get(key));

}

 

혹은

Set set = hashtable.keySet();

Iterator keys = set.interator();

while(keys.hasNext()) {

   key = (String)keys.next();

   System.out.println(hashtable.get(key));

}

 

HashMap

HashMap은 키나 값에 Null을 허용 합니다.

HashMap 출력방법은 다음 한가지 이네요. (Enumeration 지원 안함)

 

HashMap hashmap = new HashMap();

hashmap.put("jakarta", "project");

hashmap.put("apache", "tomcat");

 

Set set = hashmap.entrySet();

Iterator keys = set.iterator();

while (keys.hasNext()) {

   key = (String)keys.next();

   System.out.println(hashmap.get(key));

}

 

또한 Hashtable은 thread safe 한 객체이지만 HashMap은 그렇지 못해 unsynchronized 합니다.

이말은 즉 멀티 쓰레드 환경이 아니면 HashMap을 쓰면 속도가 빠르다는 말입니다.

굳이 동기화 하자면 다음과 같이 사용해야 겠지요

Map m = Collections.synchronizedMap(new HashMap(...));

 

간단히 정리하자면

HashMap이 HashTable에 비해 좀더 실용적으로 변한 형태라고 보면 되겠네요 ^^

일반적으로 쓴다면 HashMap을 사용하세요

'My work space > Java' 카테고리의 다른 글

UML (Unified Modeling Language)  (0) 2008.08.14
Java동적내용의캐싱방지  (0) 2008.08.14
상하위 클래스에서 생성자간의 관계  (0) 2008.08.14
JVM의메모리구조  (0) 2008.08.14
오라클DB에서 페이지 나누기  (0) 2008.08.14
2008. 8. 14. 15:51

상하위 클래스에서 생성자간의 관계

※상하위 클래스에서 생성자간의 관계


 상위클래스 하위클래스 결과
 생성자정의안함or인자없는생성자정의 생성자 정의 안함 ok
   인자없는 생성자  ok
   인자없는 생성자  ok
 인자있는 생성자만 정의 생성자 정의 안함  error
   인자없는 생성자  상위클래스에 정의된생성자를 명시적으로 호출하지 않으면 에러
   인자없는 생성자  상위클래스에 정의된생성자를 명시적으로 호출하지 않으면 에러

'My work space > Java' 카테고리의 다른 글

Java동적내용의캐싱방지  (0) 2008.08.14
HashTable & HashMap 설명  (0) 2008.08.14
JVM의메모리구조  (0) 2008.08.14
오라클DB에서 페이지 나누기  (0) 2008.08.14
게시판 답글 방법 정리  (0) 2008.08.14
2008. 8. 14. 15:50

JVM의메모리구조

JVM의 메모리구조
응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
그 중 3가지 주요영역(Method Area, 호출스택, Heap)에 대해서 알아보도록 하자.



[참고] cv는 클래스변수, lv는 지역변수, iv는 인스턴스변수를 뜻한다.

1. 메소드영역(Method Area)
- 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이타)를 Method Area에 저장한다.
이 때, 그 클래스의 클래스변수(class variable)도 이 영역에 함께 생성된다.


2. 힙(Heap)
- 인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이 곳에 생성된다. 즉, 인스턴스변수(instance variable)들이 생성되는 공간이다.

3. 호출스택(Call Stack 또는 Execution Stack)
호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고, 메서드가 작업을 마치게 되면, 할당되었던 메모리공간은 반환되어 비워진다.
각 메서드를 위한 메모리상의 작업공간은 서로 구별되며, 첫 번째로 호출된 메서드를 위한 작업공간이 호출스택의 맨 밑에 마련되고, 첫 번째 메서드 수행중에 다른 메서드를 호출하게 되면, 첫 번째 메서드의 바로 위에 두 번째로 호출된 메서드를 위한 공간이 마련된다.
이 때 첫 번째 메서드는 수행을 멈추고, 두 번째 메서드가 수행되기 시작한다. 두 번째로 호출된 메서드가 수행을 마치게 되면, 두 번째 메서드를 위해 제공되었던 호출스택의 메모리공간이 반환되며, 첫 번째 메서드는 다시 수행을 계속하게 된다. 첫 번째 메서드가 수행을 마치면, 역시 제공되었던 메모리 공간이 호출스택에서 제거되며 호출스택은 완전히 비워지게 된다.
호출스택의 제일 상위에 위치하는 메서드가 현재 실행 중인 메서드이며, 나머지는 대기상태에 있게 된다.
따라서, 호출스택을 조사해 보면 메서드 간의 호출관계와 현재 수행중인 메서드가 어느 것인지 알 수 있다.
호출스택의 특징을 요약해보면 다음과 같다.


- 언제나 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.
- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.


반환타입(return type)이 있는 메서드는 종료되면서 결과값을 자신을 호출한 메서드(caller)에게 반환한다. 대기상태에 있던 호출한 메서드(caller)는 넘겨받은 반환값으로 수행을 계속 진행하게 된다.

[예제6-6] CallStackTest.java

class CallStackTest {
      public static void main(String[] args) {
            firstMethod();
      }

      static void firstMethod() {
            secondMethod();
      }

      static void secondMethod() {
            System.out.println("secondMethod()");            
      }
}
[실행결과]
secondMethod()

위의 예제를 실행시켰을 때, 프로그램이 수행되는 동안 호출스택의 변화를 그림과 함께 살펴보도록 하자



(1)~(2) 위의 예제를 컴파일한 후 실행시키면, JVM에 의해서 main메서드가 호출됨으로써 프로그램이 시작된다. 이때, 호출스택에는 main메서드를 위한 메모리공간이 할당되고 main메서드의 코드가 수행되기 시작한다.
(3) main메서드에서 firstMethod()를 호출한 상태이다. 아직 main메서드가 끝난 것은 아니므로 main메서드는 호출스택에 대기상태로 남아있고 firstMethod()의 수행이 시작된다.
(4) firstMethod()에서 다시 secondMethod()를 호출했다. firstMethod()는 secondMethod()가 수행을 마칠 때까지 대기상태에 있게 된다. seoundMethod()가 수행을 마쳐야 firstMethod()의 나머지 문장들을 수행할 수 있기 때문이다.
(5) secondMethod()에서 println메서드를 호출했다. 이때, println메서드에 의해서 화면에 "secondMethod()"가 출력된다.
(6) println메서드의 수행이 완료되어 호출스택에서 사라지고 자신을 호출한 secondMethod()로 되돌아간다. 대기 중이던 secondMethod()는 println메서드를 호출한 이후부터 수행을 재개한다.
(7) secondMethod()에 더 이상 수행할 코드가 없으므로 종료되고, 자신을 호출한 firstMethod()로 돌아간다.
(8) firstMethod()에도 더 이상 수행할 코드가 없으므로 종료되고, 자신을 호출한 main메서드로 돌아간다.
(9) main메서드에도 더 이상 수행할 코드가 없으므로 종료되어, 호출스택은 완전히 비워지게 되고 프로그램은 종료된다.

[예제6-7] CallStackTest2.java

class CallStackTest2 {
      public static void main(String[] args) {
            System.out.println("main(String[] args)이 시작되었음.");
            firstMethod();
            System.out.println("main(String[] args)이 끝났음.");
     }
      static void firstMethod() {
            System.out.println("firstMethod()이 시작되었음.");
            secondMethod();
            System.out.println("firstMethod()이 끝났음.");            
     }

      static void secondMethod() {
            System.out.println("secondMethod()이 시작되었음.");
            System.out.println("secondMethod()이 끝났음.");            
     }

}
[실행결과]
main(String[] args)이 시작되었음.
firstMethod()이 시작되었음.
secondMethod()이 시작되었음.
secondMethod()이 끝났음.
firstMethod()이 끝났음.
main(String[] args)이 끝났음.



3.7 기본형 매개변수와 참조형 매개변수

자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다. 매개변수의 타입이 기본형(Primitive type)이면 때는 기본형 값이 복사되겠지만, 참조형(Reference type)이면 인스턴스의 주소가 복사된다.
메서드의 매개변수를 기본형으로 선언하면 단순히 저장된 값만 얻지만, 참조형으로 선언하면 값이 저장된 곳의 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경하는 것도 가능하다.


기본형 매개변수 - 변수의 값을 읽기만 할 수 있다.(read only)
참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다.(read & write)



[예제6-8] ParameterTest.java

class Data { int x; }
class ParameterTest {
      public static void main(String[] args) {

            Data d = new Data();
            d.x = 10;
            System.out.println("main() : x = " + d.x);

            change(d.x);
            System.out.println("After change(d.x)");
            System.out.println("main() : x = " + d.x);
      }

      static void change(int x) {
            x = 1000;
            System.out.println("change() : x = " + x);
      }
}
[실행결과]
main() : x = 10
change() : x = 1000
After change(d.x)
main() : x = 10

[플래시동영상]플래시동영상 자료실에서 기본형 매개변수 vs. 참조형매개변수(PrimitiveParam.swf vs. ReferenceParam.swf)를 보면 실행과정과 함께 자세히 설명하고 있으니 여기서는 자세한 설명은 생략하겠다.

[예제6-9] ParameterTest2.java

class Data { int x; }
class ParameterTest2 {
      public static void main(String[] args) {

            Data d = new Data();
            d.x = 10;
            System.out.println("main() : x = " + d.x);

            change(d);
            System.out.println("After change(d)");
            System.out.println("main() : x = " + d.x);

      }
      static void change(Data d) {
            d.x = 1000;
            System.out.println("change() : x = " + d.x);
      }
}
[실행결과]
main() : x = 10
change() : x = 1000
After change(d)
main() : x = 1000




3.8 재귀호출(Recursive Call)

메서드의 내부에서 메서드 자기자신을 다시 호출하는 것을 재귀호출(Recursive Call)이라 한다. 반복적인 작업을 해야 하는 메서드에 재귀호출을 이용하면, 메서드를 훨씬 간단하게 할 수 있는 경우가 있다. 하지만, 재귀호출은 다소 효율이 떨어진다는 단점이 있다.

대표적인 재귀호출의 예는 팩토리얼(factorial)을 구하는 것이다. 팩토리얼은 한 숫자를 1이 될 때까지 1씩 감소시켜가면서 계속해서 곱해 나가는 것인데, n!(n은 양의 정수)와 같이 표현한다. 예를 들면, 5! = 5 * 4 * 3 * 2 * 1 = 120이다.
그리고, 팩토리얼을 수학적 함수로 표현하면 아래와 같이 표현할 수 있다.


f(n) = n * f(n-1), 단 f(1) = 1.


다음 예제는 위의 함수를 자바로 구현한 것이다.

[예제6-10] FactorialTest.java

class FactorialTest {
      public static void main(String args[]) {
            System.out.println(factorial(4));
      }

      static long factorial(int n) {
            long result=0;
            if ( n == 1) {
                  result = 1;            
            } else {
                  result = n * factorial(n-1);             // 다시 메서드 자신을 호출한다.
            }

            return result;
      }
}
[실행결과]
24

[참고] 삼항연산자 ? : 를 이용하면 factorial메서드를 아래와 같이 더욱 간략하게 표현할 수 있다.

static long factorial(int n) {
            return (n == 1) ? 1 : n * factorial(n-1);
}


위 예제는 팩토리얼을 계산하는 메서드를 구현하고 테스트하는 것이다. factorial메서드가 main메서드와 같은 클래스내의 static메서드이므로 인스턴스를 생성하지 않고 직접 호출할 수 있다.
메서드가 자기자신을 다시 호출을 함으로써 반복문을 사용하지 않고도 반복적인 작업을 수행하도록 할 수 있다. 재귀호출은 반복문이 무한반복에 빠지는 것 처럼 무한호출이 되기 쉬우므로 주의해야한다.

[예제6-11] MainTest.java

class MainTest {
      public static void main(String args[]) {
            main(null);             // 자기자신을 다시 호출한다.
     }
}
[실행결과]
java.lang.StackOverflowError
      at MainTest.main(MainTest.java:3)
      at MainTest.main(MainTest.java:3)
      ...
      at MainTest.main(MainTest.java:3)
      at MainTest.main(MainTest.java:3)


main메서드 역시 자기자신을 호출하는 것이 가능한데, 아무런 조건도 없이 계속해서 자기자신을 다시 호출하기 때문에 무한호출에 빠지게 된다.
main메서드가 종료되지 않고 호출스택에 계속해서 쌓이게 되므로 결국 호출스택의 메모리 한계를 넘게 되고 StackOverflowError가 발생하여 프로그램은 비정상적으로 종료된다.

[예제6-12] PowerTest.java

class PowerTest
{
      public static void main(String[] args) {
            int x = 2;
            int n = 5;
            long result = 0;

            for(int i=1; i<=n; i++) {
                  result += power(x, i);
            }

            System.out.println(result);
      }

      static long power(int x, int n) {
            if(n==1) return x;
            return x * power(x, n-1);
      }
}
[실행결과]
62

x의 1제곱부터 x의 n제곱까지의 합을 구하는 예제이다. 재귀호출을 사용하여 x의 n제곱을 구하는 power메서드를 작성하였다. x는 2, n은 5로 계산했기 때문에 21 + 22 + 23 + 24 + 25의 결과인 62가 출력되었다.

'My work space > Java' 카테고리의 다른 글

HashTable & HashMap 설명  (0) 2008.08.14
상하위 클래스에서 생성자간의 관계  (0) 2008.08.14
오라클DB에서 페이지 나누기  (0) 2008.08.14
게시판 답글 방법 정리  (0) 2008.08.14
게시판 답글 달기 정의  (0) 2008.08.14