반응형

ExecutorService


1. newFixedThreadPool vs newCachedThreadPool

일단 doc 문서를 참고 하자면 아래와 같이 설명이 되어있다..

newFixedThreadPool();

Creates a thread pool that reuses a fixed number of threads operating off a shared unbounded queue. At any point, at most nThreads threads will be active processing tasks. If additional tasks are submitted when all threads are active, they will wait in the queue until a thread is available. If any thread terminates due to a failure during execution prior to shutdown, a new one will take its place if needed to execute subsequent tasks. The threads in the pool will exist until it is explicitly shutdown.


newCachedThreadPool();

Creates a thread pool that creates new threads as needed, but will reuse previously constructed threads when they are available. These pools will typically improve the performance of programs that execute many short-lived asynchronous tasks. Calls to execute will reuse previously constructed threads if available. If no existing thread is available, a new thread will be created and added to the pool. Threads that have not been used for sixty seconds are terminated and removed from the cache. Thus, a pool that remains idle for long enough will not consume any resources. Note that pools with similar properties but different details (for example, timeout parameters) may be created using ThreadPoolExecutor constructors.


newFixedThreadPool은 pool size가 다 차고 나면 다음 thread가 실행되기 위해서는 먼저 실행되었던 thread가 종료되어야 한다. 

newCachedThreadPool는 기존에 사용되던 thread가 사용가능하면 재사용하고, 아니면 새로운 thread를 생성한다. 그리고 일정시간 동안 사용하지 않는 thread는 종료시킨다. 


이런 의미에서 newChacedThreadPool이 성능면에서 좋다는 의미인것 같다. 


execute vs submit


728x90
반응형
반응형

1. 오버라이딩 할때에는 접근 제한자의 범위가 같거나 커야한다.

 

2. 오버라이딩 된 하위 클래스의 메서드에 throws 구문이 있으면 상위 클래스의 오버라이딩을 준 메서드도 반드시 해당 예외 클래스에 준하는 throws 구문이 있어야 한다.

 

맨날 오버로딩하고 헷갈리는 오버라이딩

규칙도 있다는것을 처음 알았다

 

참고로 오버 로딩은 매개변수가 다르거나 매개변수의 자료형이 틀린 동일한 메서드를 말한다.

까먹지 말아야지..

728x90
반응형
반응형

음.. 미묘한 내용이라 잘 이해가 되실지 모르겠습니다만..

좀 전문적인 관점에서 설명을 해드리겠습니다.
(어려운 내용이지만 오히려 이편이 이해가 더 빠를 수도 있을거 같아서요)

먼저 객체란 것은 무엇이고 변수란 것은 무엇인가?
그냥 다 그냥 값을 저장하는 공간 아닌가?

객체는 힙(heap)이라는 메모리 영역에 생성됩니다.
힙은 프로그램(프로세스 process)이 실행되는 동안
무언가 저장할 공간이 필요할 때 사용되는 메모리 공간입니다.

변수는 스택(stack)이란 메모리 영역에 생성됩니다.
스택은 쓰레드(thread)가 실행되는 동안 사용되는 영역입니다.
(쓰레드란거에 대해서 이해를 하셨는지 모르겠습니다만)

하나의 프로세스에는 여러개의 쓰레드가 있을수 있습니다.
각 쓰레드는 고유의 스택영역을 가지지만
하나의 프로세스 내에서는 힙(heap)은 공유해서 사용합니다.

왜 이렇게 나눠져 있느냐?
스텍 영역은 프로그램 코드와 밀접한 관계가 있습니다.
크기가 고정적일 수 밖에 없습니다.(컴파일 할때 고정됩니다. 이걸 '컴파일 타임'이라고 합니다.)
프로그램 실행중에 크기가 변경될 수있거나 결정되는 것들은 힙에 저장해야 합니다.
(이걸 '런 타임'이라고 합니다.)

그리고 또한가지
스택은 쓰레드간에 격리된 공간이기 때문에 여러 쓰레드에서 사용하려면 힙에 저장해야 합니다.

그러면 스택은 무시하고 힙만 쓰면 되지 않느냐?
힙 영역에 어떤 데이터가 존재한다고 하더라도 프로그램에서 바로 그 값을 사용할 수가 없습니다.
합은 구획되지 않은 그냥 커다란 공간일 뿐입니다.

스택의 데이터는 이름(실제로는 상대주소)을 통해서 쉽게 접근이 가능하지만
힙의 데이터는 메모리 주소값으로 사용해야 합니다.

즉 힙에 데이터를 저장할 때는 몇번지에 저장했는지 메모리 주소값을 따로 기억하고 있어야합니다.
어떻게 기억하느냐? 스택 변수에 저장해서 기억합니다.

다음으로 넘어가기 전에 잠시 정리하면 대충 다음과 같습니다.

객체 = 힙 = 메모리 주소를 따로 보관해야함
변수 = 스택 = 그냥 이름으로 쓰면됨


여기까지는 대충 그렇구나 하시면 됩니다.
지금부터 코드를 작성하면 그게 실제로 어떻게 동작하는지
차근차근 설명해 드리도록 하겠습니다.


어떤 함수 안에서

void someMethod() {
int a;
...
}

라고 선언했다면 이것은 스택 영역에 int 크기(4바이트져)만큼의 공간이 할당되고 a라고 이름 붙여집니다.

만약 어떤 순간에 someMethod()가 2개가 동시에 실행되고 있었다면(2개의 쓰레드에서)
스택영역도 2개가 되고 a 도 2개가 존재하는 겁니다.

어떤 함수 안에서

void someMethod() {
String s;
...
}

라고 선언했다면 스택영역에 참조(reference)형 변수가 생성되고 s라고 이름이 붙여집니다.
참조형 변수란것이 바로 힙영역에 대한 메모리 주소입니다.

자바에서 참조(reference)란 힙 영역의 객체에 대한 메모리 주소를 유식하게 말하는 것입니다.

다시 코드에서 보면 메모리 주소를 저장할 공간은 만들었지만
s에 실제로 주소를 지정하지는 않았습니다.
이 상태를 null 이라고 합니다. 따라서 s == null 입니다.

null 이란 참조형 변수가 있는데 거기에 메모리 주소가 저장되어있지 않은 상태를 말합니다.
(정확하게 말하면 0번지라는 값을 의미합니다.)

void someMethod() {
String s = new String("1234");
...
}

라고 했다면 힙에 "1234"가 저장될 메모리 공간이 생성되고, 스텍에는 s라는 참조형 변수가 생깁니다.
그리고 "1234"의 주소값이 s에 저장됩니다.

s에는 주소 값이 저장되어있으므로 s != null 입니다.

void someMethod() {
String s = new String("1234");
...
s = null;
...
}

만약 s에 null이란 값을 대입하게 되면 s에는 0번지란 값이 저장되고
조금전에 생성된 "1234" 객체에 대한 메모리 주소값은 어딘지 알 수 없게 되어버립니다.
그래서 다시 "1234"를 사용할 수 없게 되죠.

이것을 객체 참조를 끊는다라고 말합니다.
힙에 할당되어있지만 그 주소를 담고 있는 참조 변수가 하나도 없는 경우
즉 모든 참조가 끊긴 경우 자동으로 메모리가 해제되고
다시 사용할 수 있는 공간으로 바뀝니다. (이것을 가비지 컬렉팅이라고 합니다.)


void someMethod() {
String s1 = new String("1234");
String s2 = new String("1234");
...
}

라고 했다면 힙에 "1234"가 생기고 그 주소값이 스택의 s1 에 저장됩니다.
그리고 또다시 힙에 "1234"가 생성되고 그 주소값이 스택의 s2 에 저장됩니다.

힙에는 "1234"가 2번 생겼습니다.
따라서 s1과 s2는 서로 다른 메모리 주소를 가지게 됩니다.

그렇기 때문에 s1 != s2 인것이죠.
하지만 s1.equals(s2) 는 true 입니다.
그 이유는 String의 equals()는 힙에 들어있는 실제 문자열 데이터를 비교하기 때문입니다.

참고로 말씀드리자면 equals()는 힙에 있는 객체의 값을 비교하기 위한 메쏘드입니다만
모든 객체의 디폴트인 Object.equals() 는 == 연산자와 동일하게 동작합니다.
객체를 만들 때 자신의 객체에 맞게 equals() 메쏘드를
재정의 해야 String.equals()처럼 올바르게 값을 비교할 수있게 됩니다.

길게 설명했는데 잘 모르겠으면 그냥 무시하십쇼^^
언젠가는 이해가 될겁니다.
 
출처 : 네이버 지식IN 답변(dagui0님)

728x90
반응형

'Development > Java' 카테고리의 다른 글

ExecutorService  (0) 2013.03.22
오버라이딩 규칙  (0) 2013.02.12
Deep Copy vs Shallow Copy  (0) 2013.02.12
객체에는 메서드가 포함되지 않는다?  (0) 2013.02.12
파일 입출력.  (0) 2013.01.29
반응형

예전에 시험에서 나왔었는데...

그때는 이게 뭔말인가 했다. -_-;;
어디서 듣도 보지도 못한것이 굴러나왔나 했는데...

[직역]
Deep copy - 깊은 복사
Shallow copy - 얕은 복사

Deep copy
원본과 같은 데이터를 저장하고 있는 새로운 객체나 배열을 생성하는것
원번이 바뀌어도 복사본은 독립적이기 때무에 영향이 없다.

Shallow copy
배열이나 객체를 복사할때 단순히 참조만 복사하는것.
원본이 변경됨면 복사본도 변경된다.


까먹지 말자꾸나!

728x90
반응형

'Development > Java' 카테고리의 다른 글

오버라이딩 규칙  (0) 2013.02.12
Java에서 Null 값을 비교할 때  (0) 2013.02.12
객체에는 메서드가 포함되지 않는다?  (0) 2013.02.12
파일 입출력.  (0) 2013.01.29
[Spring]Spring Annotation  (0) 2012.08.01
반응형

객채가 생성되면 인스턴스 변수는 포함이 되지만 메서드는 포함되지 않는다.

왜냐고??
인스턴스 변수는 인스턴스마다 다른 값을 가질수 있어야 하기 때문에 별도의 
메모리 공간이 필요하다.
그런데 메서드는 변하는게 아니다.
그래서 메모리를 낭비해 가면서 인스턴스를 포함시킬 이유가 없다...

라고 오늘 책에서 봤다...
처음 알았네 -_-;;;

728x90
반응형

'Development > Java' 카테고리의 다른 글

Java에서 Null 값을 비교할 때  (0) 2013.02.12
Deep Copy vs Shallow Copy  (0) 2013.02.12
파일 입출력.  (0) 2013.01.29
[Spring]Spring Annotation  (0) 2012.08.01
[Spring]SpEL(Spring Expression Language)  (0) 2012.07.31
반응형

가끔 찾아보기가 귀찮아서.. ㅡㅡ;

  1. try {
  2.       BufferedReader in = new BufferedReader(new FileReader("src/input"));
  3.       String s;
  4.       while ((s = in.readLine()) != null) {
  5.         System.out.println(s);
  6.       }
  7.       in.close();
  8.     } catch (IOException e) {
  9.         System.err.println(e);
  10.         System.exit(1);
  11.     }
  12. }


728x90
반응형

'Development > Java' 카테고리의 다른 글

Deep Copy vs Shallow Copy  (0) 2013.02.12
객체에는 메서드가 포함되지 않는다?  (0) 2013.02.12
[Spring]Spring Annotation  (0) 2012.08.01
[Spring]SpEL(Spring Expression Language)  (0) 2012.07.31
[Spring]Autowiring  (0) 2012.05.03
반응형

1. 속성 정의 XML 파일에 추가되어야 하는 정의 

 xmlns:context="http://www.springframework.org/schema/context“
                                  http://www.springframework.org/schema/context
                                  http://www.springframework.org/schema/context/spring-context-3.0.xsd">  
                <context:annotation-config/>       
Spring Container가 Annotation을 인식하기 위해서는 Spring Container에 BeanPostProcessor들이 등록되어있어야한다. <context:annotation-config/>을 추가하면 내부적으로 자동 등록된다.

2. Stereotype
- @Service : Business Layer를 구성하는 서비스 클래스 대상
- @Repository : Data Access Layer를 구성하는 클래스 대상
- @Controller : 프레젠테이션 Layer를 구성하는 클래스 대상, Spring MVC 기반의 경우에 한하여 사용

3. Dependencies
- @Inject, @Autowired, @Resource : 특정 Bean의 비지니스 기능 수행을 위해 다른 Bean을 참조할경우 사용
- @Inject (javax.inject-xxx.jar)
  멤버변수, setter 메소드, 생성자, 일반 메소드에 정의
- @Autowired : Framework에 종속적
- @Resource (jsr250-api.jar)
  멤버변수와 setter 메솓에 정의할수 있음

@Inject 

 @Autowired

@Resource 

type-driven injection 방식  type-driven injection 방식  

name-matching injection 방식  

JSR-330표준, Framework에 종속되지 않음 

 Spring Framework에 종속적   JSR-2500표준, Framework에 종속되지 않음
 @Named 이용하여 특정 빈 지정

@Qualifier를 이용하여 특정 빈 지정 

 Annotation 내에 name 속성을 통해 특정 빈 지정

 멤버변수, setter메소드, 생성자, 일반메소드

   멤버변수, setter메소드, 생성자, 일반메소드    멤버변수, setter메소드

 @Inject 사용을 권장


4. Auto-Detection
- <context:component-scan> 정의 필요
- 클래스패스 상에 존재하는 클래스들을 스캔하여 Stereotype Annotation이 정의된 클래스들과 필터와 비교하여 매칭되는 클래스들을 Bean으로 인식하여 자동으로 등록

 <context:component-scan base-package="패키지명" />

5. TestCase
- @RunWith : SpringFramework에서 Junit4.5+와의 연계를 위해 제공하는 SpringJUnit4ClassRunner클래스로 정의
- @ContextConfiguration : ApplicationContext 생성시 필요한 속성정의 파일 위치 명시


728x90
반응형

'Development > Java' 카테고리의 다른 글

객체에는 메서드가 포함되지 않는다?  (0) 2013.02.12
파일 입출력.  (0) 2013.01.29
[Spring]SpEL(Spring Expression Language)  (0) 2012.07.31
[Spring]Autowiring  (0) 2012.05.03
[Spring]AOP 주요 구성요소  (0) 2012.04.13
반응형

SpEL
- Expression Languege중 하나, 런타임시 특정 객체의 정보에 접근하거나 조작할수 있도록 지원.

1. XML 기반 Bean 정의시

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
        <property name="driverClassName" value="#{contextProperties.driver}"> 
        <property name="url" value="#{contextProperties.url}"> 
        <property name="username" value="#{contextProperties.username}"> 
        <property name="password" value="#{contextProperties.password}"> 
</property></property></property></property></bean>

classpath상에 존재하는 context.properties파일을 로드하여 bean으로 정의한 후 driver, url 등의 정보를 추출함.

2. Annotation 기반 Bean 정의시

  1. @Repository(“movieDao")
  2. public class MovieDao extends SimpleJdbcDaoSupport {
  3.  
  4.        @Value("#{contextProperties['pageSize'] ?: 10}")
  5.        int pageSize;
  6.        @Value("#{contextProperties['pageUnit'] ?: 10}")
  7.        int pageUnit;
  8.        @Inject
  9.        public void setJdbcDaoDataSource(DataSource dataSource) throws Exception {
  10.                  super.setDataSource(dataSource);
  11.        }
  12. }
@Value라는 Annotation과 함께 Expression정의 (값이 없을 경우 10으로 셋팅)

728x90
반응형

'Development > Java' 카테고리의 다른 글

파일 입출력.  (0) 2013.01.29
[Spring]Spring Annotation  (0) 2012.08.01
[Spring]Autowiring  (0) 2012.05.03
[Spring]AOP 주요 구성요소  (0) 2012.04.13
[Spring]Spring Bean Scope  (0) 2012.04.09
반응형

- Autowiring 이란
  Spirng container가 bean 간의 참조관계를 자동으로 연결해주는 기능

- 속성값
 1. no : 기본값
 2. byName : property 명과 동일한 id 또는 name을 가진 bean
 3. byType : 동일한 클래스타입,(같은 타입 여러개 존재시 exception 발생)
 4. constructor : byType과 비슷하나 생성자인자에 적용
 5. autodetect : constructor 모드 수행후 byType 모드 수행
 6. default : 최상위 태그인 <beans> 에 셋팅한 모드가 수행됨. (default-autowire 속성)


Setter Injection 사용시

  1. <bean id="firstBean" class="“org.anyframe.exercise.dependencies.FirstBean">
  2.     <property name="”secondBean”" ref="”secondBean”/"></property></bean>
  3.     <bean id="secondBean" class="“org.anyframe.exercise.dependencies.SecondBean/">
  4. </bean>
Autowire 사용시
  1. <bean id="firstBean" class="“org.anyframe.exercise.dependencies.FirstBean" autowire="byType">
  2.     <bean id="secondBean" class="“org.anyframe.exercise.dependencies.SecondBean/">
  3. </bean></bean>

특정 bean을 autowiring 제외시키려면

  1. <bean id="bean" class="“org.anyframe.test.TestBean”" autowire-candidate="false"> </bean>


728x90
반응형

'Development > Java' 카테고리의 다른 글

[Spring]Spring Annotation  (0) 2012.08.01
[Spring]SpEL(Spring Expression Language)  (0) 2012.07.31
[Spring]AOP 주요 구성요소  (0) 2012.04.13
[Spring]Spring Bean Scope  (0) 2012.04.09
[Spring]Dependency Injection  (0) 2012.03.21

+ Recent posts