Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

Language/Java 2016.10.27 16:48
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


problem

java -version

-bash: /acet/program/jdk/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory


solution

$ yum -y install glibc.i686

Loaded plugins: fastestmirror, security

You need to be root to perform this command.

[deploy@lineup-data-krane program]$ sudo yum -y install glibc.i686

Loaded plugins: fastestmirror, security

Setting up Install Process

Loading mirror speeds from cached hostfile

Resolving Dependencies

--> Running transaction check

---> Package glibc.i686 0:2.12-1.192.el6 will be installed

--> Processing Dependency: libfreebl3.so(NSSRAWHASH_3.12.3) for package: glibc-2.12-1.192.el6.i686

--> Processing Dependency: libfreebl3.so for package: glibc-2.12-1.192.el6.i686

--> Running transaction check

---> Package nss-softokn-freebl.i686 0:3.14.3-23.3.el6_8 will be installed

--> Finished Dependency Resolution


result

$ java -version

java version "1.8.0_101"

Java(TM) SE Runtime Environment (build 1.8.0_101-b13)

Java HotSpot(TM) Server VM (build 25.101-b13, mixed mode)



저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

자바 예외처리를 생각해보자.

Language/Java 2016.09.26 18:16
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


예외의 종류는 2가지로 보면 된다.

checked exception과 unchecked exception

말그대로 체크가 되는 예외와 예기치 못하게 발생하는 예외를 뜻한다. 

또한 unchecked exception은 runtime exception 이라고 많이 불리운다.

여기서 생각해보아야 할 것이 있다. 어떤 처리를 해주어야 예외처리를 잘하는 걸까?

보통은 Exception가 발생하면 잡아서 에러로그를 찍어주거나 상위로 올려주어서 처리를 하기도 한다.

try {

   ... 블라블라 ...

} catch(Excetpion e) {

   logger.error(e.getMessage);

}

토비책에서도 제대로된 예외처리를 하라고 살짝 나오기도 한다. 

과연..어떤 예외처리가 제대로된 예외처리일까? 사람마다 다를수 있을것 같기도 하다.(책임과 구조가 중요하기 때문..)

다음 RND 스터디(지인들과 만든 스터디 그룹)에서 토론해보면 좋을것 같다. 

개인적으로는 

1) 런타임 예외에 대한 것을 아래처럼 공통화(소스)를 한다!

예)

public class CommonLineupException extends RuntimeException{

    public static final Logger logger = LoggerFactory.getLogger(CommonLineupException.class);

    public CommonLineupException(String message){

        super(message);

        logger.error(message);

    }

}

2) 런타임 예외는 발생 시킨다! 고려사항으로 런타임 예외가 났을 경우 어떻게 처리를 해주는가를 더 생각해봐야한다.

  - MVC 구조라면 컨트롤러까지 올려서 관련 내용 처리 하기
  - api라고 한다면 유용정보(에러로그) 남기기


3) 또한 service -> service 구조이거나 service안에 여러 메소드들로 만들어져있다면

런타임 예외가 발생하는 메소드들이 그책임을 다해야 한다. 그안에서 에러로그와 런타임 예외를 발생 시켜 위로 올려주거나 하면 된다.


팁 : 스프링프레임워크에서는 예외를 잘할 수 있도록 도움을 주는 어노테이션이 존재한다.

참고 : https://www.mkyong.com/spring-mvc/spring-mvc-exceptionhandler-example/ 

또한 db단하고 붙어있다면 롤백 유무와도 상관이 있다. 롤백이 되려면 런타임 예외에만 가능하기 때문이다.


정리하자면..런타임 예외를 잘이용하고 에러로그를 쉽게 오류를 찾을 수 있도록 정보를 넣을수 있도록 한다.


   - 끝 - 

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Integer.valueOf / Integer.parseInt

Language/Java 2016.05.19 23:13
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


왜 자꾸 오류가 나나..싶었는데...


Integer.valueOf(queryTimeStr); // queryTimeStr은 스트링형태가 확실했다...


원인은..int 범위를 넘어서였다..-_-;;


삽질 하다니 ㅋㅋㅋㅋ

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

  • BlogIcon Geetha 2016.06.10 14:48 신고 답글 | 수정/삭제 | ADDR

    This blog provides useful information about new techniques and concepts.very impressive lines are given which is very attractive.

    • Favicon of http://acet.pe.kr BlogIcon String Ace-T 2016.06.11 01:40 신고 수정/삭제

      Thank you for your comment and visit!
      and I am happy because of your message:D
      Thanks! I wanna share infos more and more :D

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

input value escape 적용하기!

Language/Java 2015.11.30 16:32
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


상황) 아래와 같이 input box의 value의 값에 특수문자가 들어가면 안녕하세요! "ace-t" 입니다가 아닌 안녕하세요! 만 나오게 된다.ㅠㅠ 


처리) 처리는 자바단에서 하였고 guava lib를 사용하였다.

maven기반!

더보기


guava 사용법

 - 아래와 같이 Escape하고자 하는것을 addEscpae로 추가하시면 됩니다. 단, html 특수문자를 처리해줘야 하는 상황 입니다.  즉, "는 쌍따옵표죵!

  \" <--요건 아니겠죠?~

ex) 

public String getEscapeResultByGuavarLib(SiteMastModel mast) {
    Escaper escaper = Escapers.builder().addEscape('"', "&quot;").build(); // addEscpape
추가 가능!
    return escaper.escape(mast.getSite_title());

  }


참고) HTML 특수문자 코드표!

HTML 특수문자


  -  끝 -

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

자바 전체공백 제거하기

Language/Java 2015.10.19 14:52
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T
1. trim()은 문자열 앞뒤 공백제거. 전체가 아니라서 부족해!~ 하실때는?

 replaceAll(" ","") 또는 replaceAll("\\p{Space}", "")  로 공백을 제거하면 됩니다.






위처럼 검색을 때리면 "카카오톡" 으로 붙어서 검색하게 되어집니다.

 



참 쉽죠잉?

참고로 가독성이 첫번째것이 더 높을 것 같아서 replaceAll(" ","") 처리하려고 했는데 치환이 안되는 경우도 있는듯 하여

두번째 방법을 택하였습니다.

참고 사이트 : http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html



끝~

저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

이펙티브자바) 규칙 68, 69

Language/Java 2015.08.05 01:31
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


규칙 68. Prefer executors and tasks to threads

# Info 01) JDK 1.5 - add java.util.concurrent

참고 사이트



  # info_02) 이 패키지에는 실행자 프레임워크(Executor Framework)라는 것이 있음, 인터페이스 기반 Task 실행 프레임워크.

   ex_01)  ExecutorService executor = Executors.newSingleThreadExcutor();

          Runnable을 넘겨 실행 : excutor.excute(runnable);

          자연스레 종료 : executor.shutdown();


  # info_03) 멀티쓰레드를 하기위해 스레드 풀(thread pool)를 사용!

  어떻게 사용하는가? java.util.concurrent.Executors에 보면 된다.

  (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html)

  


tip. Executors.newCachedThreadPool - 작은 프로그램이거나 부하가 크지 않은 서버를 만들 때 사용.

      Executors.newFixedThreadPool - 부하가 심한 환경에 들어갈 서버를 만들 때 사용.


# info_04) 이번 장에서 중요하게 눈여겨봐야할 것은 지금까지 설명한 실행(Excutor)뿐만 아니라 작업의 단위인 Task이다.

Task란? Runnable, Callable 등이 Task이다!

Task실행은? 실행자 서비스(Excutor service)로 실행. 위에서 언급한 ex_01) 참고!!


# info_05) 실행자 프레임워크에는 java.util.Timer를 대신할 ScheduledThreadPoolExecutor가 정의 되어있음.

결론적으로 스케줄을 하기위해 사용하기 편하고 유연성도 훨씬 높은 ScheduledThreadPoolExecutor를 사용하라!


위의 5가지 info를 기억하자~ item 68 End.


규칙 69Prefer concurrency utilities to wait and notify

# Info 01) JDK 1.5 - add high-level concurrency utility

    ㄴ wait, notify를 정확하게 사용하는 것은 어렵기 때문에, 이 고수준 유틸리티들을 반드시 이용해야 한다.

위에서 말한 높은수준의 병행성 유틸리티는 어디에 있는건가? java.util.concurrent 에 있음.

이 유틸리티는 

   1) 실행자 프레임워크(규칙 68)

   2) 병행 컬렉션(concurrent collection)

   3) 동기자(synchronizer)

의 세가지 범주로 나눌 수 있다.

규칙 69에서는 2), 3)에 대해서 알아보기로 하자.


# Info 02) 병행 컬렉션은?

List, Queue, Map등의 표준 컬렉션 인터페이스에 대한 고성능 병행 컬렉션을 제공한다.

이러한 병행 컬렉션은 동기화를 내부적으로 처리한다. 그러므로 컬렉션 외부에서 병행성을 처리하는 것은 불가능하다.

락을 걸어봐야 아무 효과가 없고 프로그램만 느려진다.

Concurrent Collections

Besides Queues, this package supplies Collection implementations designed for use in multithreaded contexts: ConcurrentHashMap, ConcurrentSkipListMap, ConcurrentSkipListSet, CopyOnWriteArrayList, and CopyOnWriteArraySet. When many threads are expected to access a given collection, a ConcurrentHashMap

 is normally preferable to a synchronized 

HashMap, and a ConcurrentSkipListMap is normally preferable to a synchronized TreeMap. A CopyOnWriteArrayList is preferable to a synchronized ArrayList when the expected number of reads and traversals greatly outnumber the number of updates to a list.

The "Concurrent" prefix used with some classes in this package is a shorthand indicating several differences from similar "synchronized" classes. For example java.util.Hashtable and Collections.synchronizedMap(new HashMap()) are synchronized. But ConcurrentHashMap is "concurrent". A concurrent collection is thread-safe, but not governed by a single exclusion lock. In the particular case of ConcurrentHashMap, it safely permits any number of concurrent reads as well as a tunable number of concurrent writes. "Synchronized" classes can be useful when you need to prevent all access to a collection via a single lock, at the expense of poorer scalability. In other cases in which multiple threads are expected to access a common collection, "concurrent" versions are normally preferable. And unsynchronized collections are preferable when either collections are unshared, or are accessible only when holding other locks.

Most concurrent Collection implementations (including most Queues) also differ from the usual java.util conventions in that their Iterators provide weakly consistent rather than fast-fail traversal. A weakly consistent iterator is thread-safe, but does not necessarily freeze the collection while iterating, so it may (or may not) reflect any updates since the iterator was created.

 


컬렉션 인터페이스 가운데 일부는 상태 종속 변경 연산(state depended modify operation)으로 확장.

ex)  ConcurrentMap > putIfAbsent(key, value)



# Info 03) 동기자(synchronizer)는 스레드들이 서로를 기다릴 수 있도록 하여, 상호협력이 가능하게 한다.

가장 널리 쓰이는 동기자는 CountDownLatch와 Semaphore가 있다. 


# tip) 특정 구간의 실행시간을 잴 때는 System.currentTimeMillis대신 System.nanoTime을 사용하자!


더욱 더 궁금한 것이 있다면 Java Concurrency in Practice 참조!


END

          









저작자 표시 비영리 변경 금지
신고

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

이펙티브 자바) 규칙 59, 60, 61, 62, 63, 64, 65

Language/Java 2015.07.30 01:44
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

규칙 59. Avoid unnecessary use of checked exceptions


 checked exceptions

 Exception

 can recover

 IOException, 

IllegalArgumentExceptions

 uncheked exceptions

 RuntimeException

 can not recover

 transaction

NullPointerException


핵심요약 : checked exceptions 은 너무 남발하면 프로그램을 복잡하게 만든다.

그러므로 훌륭한 프로그래머가 되기위해서는 생각해보아야 한다. 무엇을?

1) 예외적인 상황을 막을수 있는가?   2) 예외 상황에 대한 조치를 취할 수 있는가?

막을수 없고, 조치를 취할 수 없다면(can't recover) runtimeException을 고려!

unchecked exception을 사용!(아래의 예제 참고~)

   // Invocation with checked exception

   try {

       obj.action(args);

   } catch(TheCheckedException e) {

       // Handle exceptional condition

       ...

   }

 

// Invocation with state-testing method and unchecked exception

   if (obj.actionPermitted(args)) {

       obj.action(args);

   } else {

       // Handle exceptional condition

       ...

   }



규칙 60Favor the use of standard exceptions

 어떤 예외를 재사용할 지 용도에 맞게 결정하여 사용하도록 하자!

  (단, 기존 예외의 하위 클래스를 자유로이 만들어 사용해도 좋다(규칙 63)


규칙 61Throw exceptions appropriate to the abstraction

     메서드가 하는 일고 뚜렷한 관련성이 없는 예외가 발생하면 당혹스럽다.

     해결방안

상위계층에서는 하위 계층에서 발생하는 예외를 반드시 받아서 상위계층 추상화 수준에 맞는 예외로 바꿔서 던져야 함.

이것을 exception translation 이라고 부른다.

예제1)


  // Exception Translation 

  try {

       // Use lower-level abstraction to do our bidding

       ...

   } catch(LowerLevelException e) {

       throw new HigherLevelException(...);

 }  


예제2) List<E> interface의 명세를 보면 예외변환이 필요함을 알수 있다.


public interface List<E> extends Collection<E>
/**
* Returns the element at the specified position in this list.
*
* @param index index of the element to return
* @return the element at the specified position in this list
* @throws IndexOutOfBoundsException if the index is out of range
* (<tt>index &lt; 0 || index &gt;= size()</tt>)
*/
E get(int index);


/**

* Returns the element at the specified position in this list. * 

@throws IndexOutOfBoundsException if the index is out of range * 

({@code index < 0 || index >= size()}).

*/

   public E get(int index) {

       ListIterator<E> i = listIterator(index);

       try {

           return i.next();

       } catch(NoSuchElementException e) {

           throw new IndexOutOfBoundsException("Index: " + index);  // exception translation 

       }

} 


예외 연결(exception chaining)

하위 계층의 예외를 상위 계층의 생성자에게 전달한다. 

Throwable.getCause를 호출하면 해당 정보를 꺼낼수 있으며 디버깅에 용이하다!


   // Exception with chaining-aware constructor

   class HigherLevelException extends Exception {

       HigherLevelException(Throwable cause) {

           super(cause);

       }

  }  


Throwable 

 initCause() to set cause, and getCause() to access cause.


규칙 62Document all exceptions thrown by each method

  • checked exceptions은 메서드의 throws 절에 나열
  • uncheked exceptions은 throws절에는 적지마라.

     프로그래머는 문서만 보면 무엇이 checked exception인지 무엇이 unchecked exception인지 알수 있다.


규칙 63Include failure-capture information in detail messages

    오류 정보를 알아내기 위해서는 오류의 상세메시지에 "예외에 관계된" 모든 인자와 필드의 값을 포함 시켜야 한다.

    간단히 말해 예외에서 나는 오류정보는 프로그래머 등의 사람들이 보게 되며, 이것은 오류를 쉽게 파악하거나 

    해결할 수 있게 해주는 메시지이다.


규칙 64. Strive for failure atomicity

    예외를 던지고 난 뒤에도 객체의 상태가 사용 가능한 상태로 남아 있으면 좋다.

    다시 말하면 메서드 호출이 정상적으로 처리되지 못한 객체의 상태는 메서드 호출 전 상태와 동일해야 한다.

    이것을 만족했을 때 이 메서드는 실패 원자성(failure atomicity)을 갖추었다고 한다.


실패 원자성을 달성하는 방법

  1. 가장 간단한 방법은 변경 불가능한 객체로 설계하는 것이다.(규칙 15) 또한, 변경 가능한 객체의 경우는 연산을 하기 전에 인자 유효성(validity)을 체크하는 것이 가장 보편적인 방법이다.(규칙 38) 
  2. computation so that any part that may fail takes place before any part that modifies the object / Compute the result first, to see whether there is an exception. If result is valid, then set it to the object.
  3. 연산 수행 도중에 발생하는 오류를 가로채는 복구 코드(recovery code)를 작성한다.
  4. 객체의 임시 복사본상에서 필요한 연산을 수행하고, 연산이 끝난 다음에 임시 복사본의 내용으로 객체 상태를 바꾸는 방법.


규칙 65.  Don’t ignore exceptions

    빈 catch 블록은 사용하지 말고, 최소한 예외를 무시해도 괜찮은 이유라도 주석으로 남겨둬라!


  // Empty catch block ignores exception - Highly suspect!

   try { ...

   } catch (SomeException e) {

   } 


-  END -






저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

규칙41) 오버로딩을할 때는 주의하라!

Language/Java 2015.07.21 02:16
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T




제네릭 메카니즘 “Erasure"
Type Erasure

Generics were introduced to the Java language to provide tighter type checks at compile time and to support generic programming. To implement generics, the Java compiler applies type erasure to:

  • Replace all type parameters in generic types with their bounds or Object if the type parameters are unbounded. The produced bytecode, therefore, contains only ordinary classes, interfaces, and methods.
  • Insert type casts if necessary to preserve type safety.
  • Generate bridge methods to preserve polymorphism in extended generic types.
Type erasure ensures that no new classes are created for parameterized types; consequently, generics incur no runtime overhead.


Raw Types

raw type is the name of a generic class or interface without any type arguments. For example, given the generic Box class:

public class Box<T> {
    public void set(T t) { /* ... */ }
    // ...
}

To create a parameterized type of Box<T>, you supply an actual type argument for the formal type parameter T:

Box<Integer> intBox = new Box<>();


Row Type이 동일한 모든 제네릭 타입은 컴파일된 시점에서 모두가 동일한 타입으로 존재!

Test.java

public class Test<K, V> {
     public void f(K k) {
     }
     public void f(V v) {
     }
}


localhost:src terrypark$ javac Test.java
Test.java:5: error: name clash: f(V) and f(K) have the same erasure
public void f(V v) {
^
where V,K are type-variables:
V extends Object declared in class Test
K extends Object declared in class Test
1 error



저작자 표시 비영리 변경 금지
신고

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

(java) ltrim 구현

Language/Java 2015.06.30 00:10
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


private final static Pattern LTRIM = Pattern.compile("^\\s+");

tip. \\s+$

private String ltrim(String s) {
     return LTRIM.matcher(s).replaceAll("");
}


^ : 시작.
\s : 공백.
+ : 하나 이상.

매칭되는것 없애준다. 
   끝.


저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

이펙티브자바 규칙 19) 2015년 6월 21일- 일요일 스터디 카페 방문

Language/Java 2015.06.21 19:11
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T
1. 이펙티브 자바 읽기(범위 : 규칙19,20,21)
인터페이스는 클라이언트 입장에서 보면 “알림이?(명세) 역할"을 한다. 즉, class로 구현할 것을 인터페이스는 미리 말해준다.
인터페이스 사용법 중에 실패한 것은 메소드도 없고 static final field만 존재하는 소위 "constant interface” 라 불린다.

// Constant interface antipattern - do not use!
public interface PhysicalConstants {
     // Avogadro's number (1/mol)
     static final double AVOGADROS_NUMBER = 6.02214199e23;
    // Boltzmann constant (J/K) 
    static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
    // Mass of the electron (kg)
    static final double ELECTRON_MASS = 9.10938188e-31;
}

There are several constant interfaces in the Java platform libraries, such as java.io.ObjectStreamConstants
public interface ObjectStreamConstants {

/**
* Magic number that is written to the stream header.
*/
final static short STREAM_MAGIC = (short)0xaced;

/**
* Version number that is written to the stream header.
*/
final static short STREAM_VERSION = 5;

/* Each item in the stream is preceded by a tag
*/

/**
     ……… 


왜 사용하면 안되는가?
1. 인터페이스로 제공을 한다면 다음에 해당 Constant Interface의 상수를 class에서 사용하지 않는다고 해도 
    binary-compatibliliy(이진 호환성?)을 보장하기 위해 그 인터페이스를 계속 implements해야한다.

2.  비-final 클래스가 상수 인터페이스를 구현할 경우, 그 모든 하위 클래스의 이름 공간(namespace)이 해당 인터페이스의 상수들로 오염된다. ????? 뭔소리지??-_-;; 
원문 : 
If a nonfinal class implements a constant interface, all of its subclasses will have their namespaces polluted by the constants in the interface.

아마도 이런 뜻이 아닐까?
ex) 아래의 상수 인터페이스가 있다고 하면

/**
* Created by terrypark on 2015. 6. 21..
*/
public interface DoNotConstantInterfaceTest {

public static final Double ACET=4.5;
public static final Double VICTER=4.3;
public static final Double JINNY=4.1;
public static final Double HOIRU=4.4;
}

위의 인터페이스를 구현하는 클래스가 있고 그 클래스를 상속받은 클래스가 있을 것이다.(sub class)
이 자식 클래스에서 namespace가 ACET인 것을 사용한다고 하면???

DoNotConstantInterfaceTest Interface를 구현한 클래스!

/**
* Created by terrypark on 2015. 6. 21..
*/
public class DoNotTest implements DoNotConstantInterfaceTest {
public DoNotTest(){}
private double data;

public void getData(){
System.out.println(DoNotConstantInterfaceTest.ACET);
this.data = DoNotConstantInterfaceTest.HOIRU;
System.out.println(data);
}
}

위의 클래스의 자식 클래스(Sub Class)

/**
* Created by terrypark on 2015. 6. 21..
*/
public class DoNotTest2 extends DoNotTest {
public static final Double ACET=2.5;
private Double test;

public void getData2(){
System.out.println("DoNotTest2----start");
this.test = DoNotConstantInterfaceTest.ACET;
System.out.println(test);
System.out.println("DoNotTest2----end");
}
}

DoNotTest dt = new DoNotTest();
dt.getData();

DoNotTest2 dt2 = new DoNotTest2();
dt2.getData2();

의 결과는???

4.5
4.4
DoNotTest2----
4.5
DoNotTest2----
위를 드래그하면 답이 있음! ㅋㅋ 

이런 내용이 오염을 시키는 것으로 봐도 되는것인가??!!  모두에게 묻기!~

아니면 아래와 같이.. 헷깔리게 여러군데에서 사용하게 하는 아래의 형태가 오염된거라고 하는것인가?
/**
* Created by terrypark on 2015. 6. 21..
*/
public class DoNotTest2 extends DoNotTest {
public static final Double ACET=2.5;
private Double test;

public void getData2(){
System.out.println("DoNotTest2----start");
this.test = DoNotConstantInterfaceTest.ACET;
System.out.println(test);
System.out.println("DoNotTest2----end");

System.out.println(DoNotConstantInterfaceTest.ACET);
System.out.println(DoNotTest.ACET);
System.out.println(DoNotTest2.ACET);
}
}

위의 답은?
4.5
4.5
2.5

우어…1시간이 벌써 지났다..쿨럭;; 
anyways..위와 같은 좋지 않으니 사용하지 말라는 것이다.

이제는 그럼 뭘 쓰라는 말이냐? 어쩌라는거냐? 라는 말에 대한 답변이다.

상수를 API 일부로 공개하고 싶을 때는(역시나 라이브러리 느낌이 강하군..) 더 좋은 방법이 있다고 제시한다.
(이펙티브 규칙 19)

아래처럼 사용하면 된다.
생성자는 private으로 객체를 생성하지 못하게 한다. 그리고 아래처럼 static final로!! 즉, 규칙 3에 나오는 유틸리티 클래스로!
/**
* Created by terrypark on 2015. 6. 21..
*/
public class PrivateConstructTest {
private PrivateConstructTest(){}
public static final double AVO = 6.0;
}

또한, 위의 class를 접근하기 위해서는 아래처럼 클래스명을 붙여야 한다.
PrivateConstructTest.AVO
정적 임포트(static import)를 사용하면 클래스 이름을 제거할 수 있다! 
import static kr.pe.acet.PrivateConstructTest.*;

마지막으로 인터페이스는 Type을 정의할 때만 사용하라! 특정 상수를 API의 일부로 공개할 목적으로는
(api니깐 공통적으로 사용하자는 목적?!) 적절치 않다.


저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

2015년 06월 17일 이펙티브자바 스터디.

Language/Java 2015.06.17 10:44
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



스터디 범위 : 이펙티브 자바 규칙17.
   참여인원 : 총 5명 - 테리팍, 호이루팍, 빅터신, 지니유, 아론킴
상속을 위한 설계와 문서를 갖추거나 그럴수 없다면 상속을 하지말라!??
재정의 기능 메소드를 내부적으로 어떻게 사용하는지(self-use) 반드시 문서에 남기라는 것.
 - 더 쉽게 풀어서 말하면 메소드 내부동작 원리에 관한 주석을 남기라는 뜻.

토론) java doc 이야기
테리팍 : java doc을 남기는 것은 좋은 것 같다.
  • 이유 : 이력관리도할 수있고, 더 나아가 CI서버에서도 사용할 수 있다. 또한 개발 전후에 유용할 것 같다.
호이루팍 외 3명 : 이력은 커밋로그나 히스토리를 통해서 보면 되지 않는가? java doc은 관리가 안된다.
빅터신 : 주석(java doc)은 필요한 것만 즉, 메소드명등으로 한번에 파악하지 못할 것들에 대해서
테리팍 : 동의. 이력관리 이야기는 확장성을 위해 말함. 프로젝트 들어가기전에 빅터신이 말한 것처럼 업무적인 요소나 특이사항을
            자바doc이나 주석으로 남기면 좋을 것 같다.

개발자는 코드로 말하는것이 제일 좋다고는 생각하지만 서로의 생각이 많이 상이하기때문에 히스토리성이나 업무성 특이사항은
공유할 수 있도록 java doc, 소스주석, 위키등으로 약속된 관리가 필요할 것 같다. 


저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Favor composition over inheritance

Language/Java 2015.06.16 02:18
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

여기에서 말하는 상속의 범위
  - extends!!  interface implements는 아니다.

상속은 코드 재사용에 대해서 파워풀하지만 항상 좋은것만은 아니다.
: 상속을 적절히 잘 사용하지 못하면 소프트웨어는 깨지기 쉽다.

잘 사용하려면?
  • 같은 프로그래머가 같은 패키지 안에서 사용하면 안전하다(당연한거 아닌가..-_-;;)
  • 여러사람이 사용하더라도 상속을 고려해 설계되고 그에 맞는 문서를 갖춘 클래스에 사용하는 것은 안전!

메서드 호출과 달리, 계승은 캡슐화 원칙을 위반한다.
 : 하위 클래스는 상위클래스의 구현에 의존하기 때문! 상위클래스가 변경되면 하위에 영향이 감.

예제를 통해 더욱 더 신나는 이펙티브 자바의 내용을 알아보도록 하자! 
예제는 HashSet의 예제를 보도록 한다.
우선 Class UML을 하나보도록 하자.(완벽하지는 않다. 대충보도록 하자! ㅋ)


우리가 코딩할 예제의 클래스 구조이다.




위의 예제에서의 답은?!!
이유는 왜 그런걸까?

InstrumentedHashSet
mainObj.addAll(Arrays.asList("terry","ace-t","victor", "hoiru", "jinny"));

@Override
public boolean addAll(Collection<? extends E> c){
addCount +=c.size();
return super.addAll(c);
}

HashSet
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}

AbstractCollection
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;
}

InstrumentedHashSet
@Override
public boolean add(E e) {
addCount++;
return super.add(e);
}


해결 방법_1) @Override한 addAll()을 주석 처리 한다.
//  @Override
// public boolean addAll(Collection<? extends E> c){
// addCount +=c.size();
// return super.addAll(c);
//  }

해결 방법_2) addAll()메소드가 인자에 담긴 각 원소마다 add를 호출하도록 변경.
@Override
public boolean addAll(Collection<? extends E> c){
//addCount +=c.size();
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;

}

위의 해결방법이 모든 문제를 해결하는 것은 아니다. 상속을 함으로써 상위클래스와 하위클래스의 응집도가 매우 높기때문이다.

그래서 사용하는 것이 Wrapper Class를 두고 그 Class는 다른 객체를 Wrapper하고 있다.
쉽게 말해서 우리에게 잘알려진 Decorator Pattern을 통해 해결할 수 있다.
단, 역호출(CallBack) 프레임워크와 함께 사용하기에는 적합하지 않다. 웅? Wrapper 객체는 포장 객체에 대해서 모르기 때문에 자기 자신에 대한 참조(this)를 전달할 것이다. 이 문제는 SELF 문제(self problem lieberman 86)로 알려져있다고 한다.

Decorator Pattern 참조 : http://acet.pe.kr/386



저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

String을 날짜 포맷으로 변환하기!

Language/Java 2015.06.15 16:30
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



String을 날짜 포맷으로 변환하기!

regTime : 20150522141253
reqTime : 20150428234211

위와 같은 String형식을..

2개의 format을 선언 한 뒤

DateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

아래처럼 작업을 해주면 됩니다.

try {
outputMap.put("작업일", sdf.format(formatter.parse(regTime)));
outputMap.put("신청일", sdf.format(formatter.parse(reqTime)));
} catch (ParseException e) {
e.printStackTrace();
}


변환 과정
regTime : 20150522141253
reqTime : 20150428234211
regTime2 : Fri May 22 14:12:53 KST 2015
reqTime2 : Tue Apr 28 23:42:11 KST 2015
regTme3 : 2015/05/22 14:12:53
reqTime3 : 2015/04/28 23:42:11


Date Format Pattern Syntax

You can design your own format patterns for dates and times from the list of symbols in the following table:

Symbol Meaning Presentation Example
G era designator Text AD
y year Number 2009
M month in year Text & Number July & 07
d day in month Number 10
h hour in am/pm (1-12) Number 12
H hour in day (0-23) Number 0
m minute in hour Number 30
s second in minute Number 55
S millisecond Number 978
E day in week Text Tuesday
D day in year Number 189
F day of week in month Number 2 (2nd Wed in July)
w week in year Number 27
W week in month Number 2
a am/pm marker Text PM
k hour in day (1-24) Number 24
K hour in am/pm (0-11) Number 0
z time zone Text Pacific Standard Time
' escape for text Delimiter (none)
' single quote Literal '


더 좋은 방법이 있을지도 모르겠지만..이렇게 처리 했네요^^;



저작자 표시 비영리 변경 금지
신고

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

2015년 06월 17일 이펙티브자바 스터디.  (0) 2015.06.17
Favor composition over inheritance  (0) 2015.06.16
String을 날짜 포맷으로 변환하기!  (0) 2015.06.15
clone을 재정의할 때는 신중하라!  (0) 2015.06.11
hashCode()  (0) 2015.06.07
unicode 문제 해결(\u003d 등)  (0) 2015.01.12

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

clone을 재정의할 때는 신중하라!

Language/Java 2015.06.11 10:17
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T
Cloneable : Note that this interface does not contain the clone method
Even if the clone method is invoked reflectively, there is no guarantee that it will succeed.


단점 :
 기본적인 문제는 clone메소드가 없으며 Object의 clone메소드가 protected로 선언되어 있다는 것이다.
 리플렉션(reflection)을 사용하지 않고서는 Cloneable을 구현한 객체라도 clone 메소드를 호출할 방법이 없다.
 리플렉션을 사용한 호출도 실패할 가능성이 있다. 해당 객체에 호출 가능한 clone메소드가 구현되어 있으리라는 
 보장이 없기 때문.

참고내용
접근 제어자
구분
modifier
설명
접근권한
public
모든 클래스에서 접근이 가능!

protected
동일 패키지에 속하는 클래스와 하위 클래스 관계의 클래스에 의해 접근이 가능.

private
클래스 내에서만 접근이 가능.



다시 돌아와서
  • x.clone() != x   : clone()는 아래 말한것처럼 "객체를 복사한다. 참조가 아니라는 뜻.
           Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class of the object.

  • x.clone().getClass() == x.getClass() : 원본 객체와 복사된 객체이므로 참! 그러나 반드시 그래야 하는 것은 아니다!

  • x.clone().equals(x) : 당연히 true이지만 반드시 그래야하는 것은 아니다.(내부 자료구조까지 복사해야 될 수도 있다.)<— 정확히 감 오지 않음.
    • victor : 오버라이딩 시에 다르게 할수도 있기 때문.
    • ace-t : equals() & hashCode() 처럼 같은 맥락의 내용으로 추정.


  • 어떤 생성자도 호출되지 않는다. : 생성자가 호출이 되지 않는다는 것은 객체가 자바에서 흔히 new해서 생성되지 않음을 뜻한다.  이펙티브자바를 보면 이 규칙에 대해서 저자는 너무 심한거 아니냐고 말하고 있다.ㅋㅋㅋ 
          특히 복사본 내부객체에서 생성자로 만든 객체를 반환하도록 clone을 구현하거나 클래스가 final로 선언되어있다면, 생성자로 만든 객체를 리턴하도록 clone을 구현할 수도 있다고 반박한다. ㅋㅋㅋ 
또한 조금 논란이 있는데 java.util.HashMap을 보면 clone()을 타고가다보면 new Entry가 호출된다.
public Object clone() {
HashMap<K,V> result = null;
try {
result = (HashMap<K,V>)super.clone();
} catch (CloneNotSupportedException e) {
// assert false;
}
if (result.table != EMPTY_TABLE) {
result.inflateTable(Math.min(
(int) Math.min(
size * Math.min(1 / loadFactor, 4.0f),
// we have limits...
HashMap.MAXIMUM_CAPACITY),
table.length));
}
result.entrySet = null;
result.modCount = 0;
result.size = 0;
result.init();
result.putAllForCreate(this);

return result;
}
아래에 보면 new Entry를 하고 있다.
private void inflateTable(int toSize) {
// Find a power of 2 >= toSize
int capacity = roundUpToPowerOf2(toSize);

threshold = (int) Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);
table = new Entry[capacity];
initHashSeedAsNeeded(capacity);
}

이제 clone()을 알아보고 구현해보자!
java.lang.Object에 속한 clone() !!! 
protected native Object clone() throws CloneNotSupportedException;

 위와 같이 protected로 되어있다. 그러므로 override 시에 public으로 하지 않으면 외부에서 호출이 불가능 하다.
그래서 이펙티브 자바 굵은 글씨로 “실질적으로 Cloneable 인터페이스를 구현하는 클래스는 제대로 동작하는 public clone 메소드를 제공해야한다." 라고 말한다.

clone을 구현 시 반드시 java.lang.cloneable인터페이스를 implements해야 한다.
위에서 보았던 Cloneable 인터페이스는 아무런 메소드를 정의되어있지 않지만 Cloneable을 구현하지 않는다면 clone 메소드를 호출
할 때 CloneNotSupportedException을 발생 시킵니다.

final 필드가 있으면 clone을 제대로 구현하기 어렵다. 복사를 해서 다시 대입할 수 없기 때문 입니다.
이펙티브 자바에서는 “clone의 아키텍처는 변경 가능한 객체를 참조하는 final 필드의 일반적 용법과 호환되지 않는다.” 라고 하네요.
간단한 예)
public class Test implement Cloneable{
    private final String errorString;
    ....
    public Object clone() throws CloneNotSupportedException {
        Test test = super.clone();
        test.errorString = errorString; // <= 컴파일 에러!
    }
}

비-fianl 클래스에 clone을 재정의할 때는 반드시 super.clone()을 호출해 얻은 객체를 반환해야 한다.











저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

hashCode()

Language/Java 2015.06.07 18:04
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


HashCode란?

객체를 구별하기 위해, 고유한 정수값으로 출력시켜주는 메소드가 바로 hashCode()다.

객체 참조 변수를 출력할 때, 출력되는 Reference Address는 바로 이 hashCode를 16진수로 출력한 값이다.

ex) HashCodeTest@cb788b90(참고 사이트 : http://mwultong.blogspot.com/2008/02/16-2-10-8-hex-calc.html)


모든 클래스는 java.lang.Object의 하나의 기본이 되는 hash scheme를 상속 받는다.

클래스는 implementation을할 때(equals 같은 method overriding을 뜻한다) public int hashCode()를 반드시 override해야한다.

여기서 일반적인 규약이 있다. "Always override hashCode when you override equals" in Bloch, Joshua (2008) 의

이펙티브자바의 규약을 살펴볼 것 이다.

그리고 java.lang.String.hashCode()라는것이 있는데 아래의 내용을 간단히 참고해보자.



이제 아래의 소스를 보자.

https://gist.github.com/acetaeha/4091d379957499e97aeb




결과는 hashCode()의 유무에 따라서 달라진다 없을 경우에는 true true false가 나온다.  

그 이유는 아래와 같다. hashMap에  put을할 때 아래와 같이 hashCode()가 키가 된다.  hashCode는 

public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

ㅋㅋㅋ 이제 이펙티브 자바의 규약을 알아보도록 하자.

"equals를 재정의할 때는 반드시 hashCode도 재정의 하라!"

그렇지 않으면 위의 코드처럼 hashMap의 경우 문제가 생길수 있다.

또한 규약은 다음과 같다.

  • 같은 객체의 hashCode를 여러 번 호출하는 경우, equals가 사용하는 정보들이 변경되지 않았다면, 언제나 동일한 정수가 반환되어야 한다.
  • equals(Object)메소드가 true이면 두 객체의 hashCode 값은 같아야 한다.
  • equals(Object)메소드가 false이면 두 객체의 hashCode가 꼭 다를 필요는 없다. 하지만 서로 다른 hashCode 값이 나오면  해시 테이블(hash table)의 성능이 향상될 수 있다는 점은 이해하고 있어야 한다.


hashCode를 재정의 하지 않으면 위반되는 핵심규약은 같은 객체는 같은 해시코드 값을 가져야 한다는 규약이 위반되는 것이다.



References

  • 펙티브 자바 규칙 9







저작자 표시 비영리 변경 금지
신고

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

unicode 문제 해결(\u003d 등)

Language/Java 2015.01.12 16:42
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



\u003d 의 문제 발생..;;


찾아보니 Gson으로 Json을 가지고 놀다가도 발생할 수 있으며, http로 가져와서 String에 담아줄 때도 발생할 수 있다.


1. http로 가져와서 String에 담았는데 유니코드가 박혀있을 때!

jsonData = StringEscapeUtils.unescapeJava(jsonData);

2. Gson을 사용했는데 유니코드가 박혀있을 때!

// Gson gson = new Gson(); 말고 아래처럼 disableHtmlEscaping() 사용!
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
String noEscapeStr = gson.toJson(queryCodeList).toString();


다른분의 삽질을 줄이기 위해 오늘도 포스팅 한다~~달려라 ace-T~~ㅋㅋ 

   - 끝 -

저작자 표시 비영리 변경 금지
신고

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

clone을 재정의할 때는 신중하라!  (0) 2015.06.11
hashCode()  (0) 2015.06.07
unicode 문제 해결(\u003d 등)  (0) 2015.01.12
[문제] Java main함수에서 static 키워드가 없다면??  (2) 2014.07.04
Mac에서 Jdk8 설치 되는 장소!  (0) 2014.07.02
Version Interface  (0) 2014.06.19

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

[문제] Java main함수에서 static 키워드가 없다면??

Language/Java 2014.07.04 18:02
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

package kr.pe.acet;


public class MainTest {


// public static void main(String[] args) {

public void main(String[] args) {

// TODO Auto-generated method stub

   String test = "This is test!";

   System.out.println(test);

}


}



위의 코드에서 main부분에 static 이 없다면??

   1) compile은 된다. run은 X

   2) compile조차 안된다.(당근 run도 X)

   3) compile은 안되나 run은 된다.

당신의 선택은????

답은 코멘트로!! ㅋㅋ 





    - END -

저작자 표시 비영리 변경 금지
신고

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

hashCode()  (0) 2015.06.07
unicode 문제 해결(\u003d 등)  (0) 2015.01.12
[문제] Java main함수에서 static 키워드가 없다면??  (2) 2014.07.04
Mac에서 Jdk8 설치 되는 장소!  (0) 2014.07.02
Version Interface  (0) 2014.06.19
[Java] JVM 메모리 구조  (0) 2014.05.15

설정

트랙백

댓글

  • Favicon of http://codezip.net BlogIcon 일퍼센트 2014.07.07 13:15 신고 답글 | 수정/삭제 | ADDR

    static이 없기에 메모리 영역에 올릴 수 없으니~~실행은 당연히 안 되고
    compiler가 체크를 할지는 모르겠네~

    • Favicon of http://acet.pe.kr BlogIcon String Ace-T 2014.07.07 23:30 신고 수정/삭제

      ㅎㅎㅎ 답은?!!!! 1번~~~
      바이트코드로 변환은 되어지나 런타임시에 오류!
      형이 말한것 처럼 메모리에 못올라가니..ㅎㅎㅎ
      난 메모리 생각이 안났었다능..ㅠ_ㅠ

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Mac에서 Jdk8 설치 되는 장소!

Language/Java 2014.07.02 20:46
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T



/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home


AceTui-MacBook-Pro:~ AceT$ /usr/libexec/java_home -v 1.6

/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home


AceTui-MacBook-Pro:~ AceT$ /usr/libexec/java_home -v 1.8

/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home


- END -

저작자 표시 비영리 변경 금지
신고

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

unicode 문제 해결(\u003d 등)  (0) 2015.01.12
[문제] Java main함수에서 static 키워드가 없다면??  (2) 2014.07.04
Mac에서 Jdk8 설치 되는 장소!  (0) 2014.07.02
Version Interface  (0) 2014.06.19
[Java] JVM 메모리 구조  (0) 2014.05.15
sort 관련(vo)  (0) 2014.03.19

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Version Interface

Language/Java 2014.06.19 14:48
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


[이미지 출처 - 웹툰 작가 꿀똥이]


인터페이스를 바꾸고 싶은데..바꿀 수 없는 경우에는 어떻게 해야할까?

인터페이스에 어떤 연산을 추가하고 싶을 때가 바로 그런 경우다.

새로운 인터페이스를 선언해서 기존 인터페이스를 확장(상속)한 후 새로운 연산을 추가할 수는 있다.

반드시 다운캐스트해서 사용해야 한다는 점에 주의하자!

출처 : 켄트 벡의 구현 패턴 중에서!

내용을 바탕으로 코드로 구현해봄! ㅎㅎㅎ



저작자 표시 비영리 변경 금지
신고

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

[문제] Java main함수에서 static 키워드가 없다면??  (2) 2014.07.04
Mac에서 Jdk8 설치 되는 장소!  (0) 2014.07.02
Version Interface  (0) 2014.06.19
[Java] JVM 메모리 구조  (0) 2014.05.15
sort 관련(vo)  (0) 2014.03.19
단어 카운트 - 첫번째에 걸리는 것만..  (0) 2014.03.19

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

[Java] JVM 메모리 구조

Language/Java 2014.05.15 01:21
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 

용도에 따라 여러 영역으로 나누어 관리한다.

아래의 그 중 주요한 3가지 영역이다.


[참고 : cv-클래스변수, lv - 지역변수, iv - 인스턴스 변수를 뜻함.]

1) 메소드 영역

    프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽어서 분석하여 클래스에 

    대한 정보(클래스 데이터)를 이곳에 저장한다. 이때 그 클래스의 클래스 변수(Class Variable)도 이 영역에 함께 생성 된다.


2) 힙(heap)

    인스턴스가 생성되는 공간, 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다.

    즉, 인스턴스 변수(Instance Variable)들이 생성되는 공간이다.


3) 호출스택(Call Stack)

    호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다.

    메소드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 작업을 수행하는 동안 지역변수

    (매개변수 포함) 들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고 메소드가 작업을 마치면 할당되었던 메모리 공간은 

    반환되어 비워진다.


 [Tip] 호출스택 특징

         1. 메소드가 호출 되면 수행에 필요한 만큼의 메모리를 스택에 할당 받는다.

         2. 메소드가 수행을 마치고나면 사용했던 메모리를반환하고 스택에서 제거된다.

         3. Call Stack의 최상위에 위치하는 메소드가 현재 실행 중인 메소드이며, 나머지는 대기상태에 있게 된다.

         4. 아래에 있는 메소드가 바로 위의 메소드를 호출한 메소드이다. 


참고문헌 : 하승현씨가 빌려준 자바의 적성 2nd Edition


참고 사이트 : 

  http://novathin.kr/75  김한도님이 공개한 ppt(Java Performance Fundamental"(김한도, 서울, 엑셈,2009))

  http://helloworld.naver.com/helloworld/1230   - NHN 헬로우월드

 

               END 슈퍼맨


저작자 표시 비영리 변경 금지
신고

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

Mac에서 Jdk8 설치 되는 장소!  (0) 2014.07.02
Version Interface  (0) 2014.06.19
[Java] JVM 메모리 구조  (0) 2014.05.15
sort 관련(vo)  (0) 2014.03.19
단어 카운트 - 첫번째에 걸리는 것만..  (0) 2014.03.19
[Ace-T의 기초튼튼] for문 잘 알고 쓰자  (0) 2013.12.16

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바