객체지향 프로그래밍이란

상속관계로 클래스 계층구조를 형성하고,

클래스에 대한 인스턴스(필드)는 객체로 표현하며,

객체가 모여 서로 협조(사용)하며

조직을 이루게하는 구현방식이다.

Collections.sort(list, new Comparator<SomeDto>() {
@Override
public int compare(SomdDto o1, SomeDto o2) {
return o1.getCreatedAt().compareTo(o2.getCreatedAt());
}
});

객체안 값을 비교하여 sort Collections sort

private static final char UTF_8_WITHOUT_BOM = '\ufeff';

private String saveUpdatedResult(String mailString) {
String fileName = DateUtils.
convertDateToString(new Date(), DateUtils.FORMAT_DATE_CALENDAR) + ".csv";
Path filePath = Paths.get(fileName);
try {
Files.
createFile(filePath);
try (BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(Files.newOutputStream(filePath, StandardOpenOption.TRUNCATE_EXISTING), "UTF-8"))) {
writer.write(
UTF_8_WITHOUT_BOM);
writer.write(convertHtmlToCSV(mailString));
}
return store(new File(fileName), fileName);
} catch (Exception e) {
log.warn("File create error. cause : ", e);
return null;
} finally {
try {
Files.
delete(filePath);
} catch (IOException e) {
log.warn("File delete fail. cause : ", e);
}
}
}

파일의 맨 앞에 \ufeff 을 넣어주면 된다. 하이고~..

function checkOnlyCharacter(data) {
for (var i = 0; i < data.length; i++) {
var temp = data.substring(i, i + 1);
if (!temp.match(/[0-9]|[a-z]|[A-Z]/)) {
return true;
}
}
}


private String getBarcodeCheckBit(String barcodeNumber) {
StringBuffer result = new StringBuffer();
if (barcodeNumber.length() <= NORMAL_BARCODE_LENGTH) {
for (int i = 0; i < NORMAL_BARCODE_LENGTH - barcodeNumber.length(); i++) {
result.append("0");
}
result.append(barcodeNumber);
}
String barcode = result.toString();
int s = 0;
int d = 0;
for (int i = 0; i < NORMAL_BARCODE_LENGTH - 1; i++) {
if (i % 2 == 0) {
s += Character.getNumericValue(barcode.charAt(i));
} else {
d += Character.getNumericValue(barcode.charAt(i)) * 3;
}
}

int chk = (10 - ((s + d) % 10)) % 10;

return String.valueOf(chk);
}


List<EditHistory> getEditHistory(String userId, Obj source, Obj target, Class clazz) {
List<EditHistory> editHistoryList = new ArrayList<>();
try {

for (Method sourceMethod : clazz.getMethods()) {
for (Method targetMethod : clazz.getMethods()) {
String sourceMethodName = sourceMethod.getName();
String targetMethodName = targetMethod.getName();
String startWithGet = "get";
String startWithIs = "is";
boolean methodGet = sourceMethodName.startsWith(startWithGet);
boolean methodIs = sourceMethodName.startsWith(startWithIs);
if ((methodGet || methodIs)
&& !sourceMethodName.equals("getClass")) {
if (sourceMethodName.equals(targetMethodName)) {
Object sourceResult = MethodHandles.lookup().findVirtual(clazz, sourceMethodName,
MethodType.methodType(sourceMethod.getReturnType())).invoke(source);
Object targetResult = MethodHandles.lookup().findVirtual(clazz, targetMethodName,
MethodType.methodType(targetMethod.getReturnType())).invoke(target);

if (sourceResult != null && !sourceResult.equals(targetResult)) {
EditHistory skuEditHistory = new EditHistory();
editHistory.setEditField(sourceMethodName.substring(methodGet ? startWithGet.length() : startWithIs.length()));
editHistory.setOriginValue(sourceResult.toString());
editHistory.setChangedValue(targetResult != null ? targetResult.toString() : null);
editHistory.setCreatedId(userId);
editHistoryList.add(editHistory);
}
}
}
}
}

return editHistoryList;
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}


'java' 카테고리의 다른 글

java script 숫자 또는 영문자만 허용하기  (0) 2015.03.19
바코드 체크 비트 검증 Java 코드  (0) 2015.03.06
JVM에 관한 토론 기록  (0) 2015.01.21
Java MethodHandle Example (Java 1.7)  (0) 2014.10.07
Java reflection example.  (0) 2014.10.07

JVM (Visualizer eclipse plugin 사용시 보기편함)

참고자료 http://www.slideshare.net/javajigi/java-virtual-machine-call-stack-java-byte-code

  • JVM Stacks (N) - Call Stack
    • Operand Stack
      • 자바는 cpu 레지스터를 사용하지 않고 Operand Stack을 사용한다.
      • 논리적으로 연산을 하는데 물리적 연산을 하는 C보다 가끔 빠른 이유는?
        • 내부적으로 컴파일을 했을때 native code로 변환을 하면 최적화가 일어난다.
        • VM에서 외부 시스템에 호출할때 최적화된 CPU레지스터를 사용한다.
        • C로 짜면 성능 최적화가 어렵다. Java로 최적화를 잘하면 역전 현상도 일어난다.
        • Java byte code -> JVM Interpreter Code
        • C byte code -> H/W Code
        • Java는 메모리 매니지먼트가 빠르다
          • 자바는 핫스팟(GC)관리가 메모리 관리에 뛰어나다.
        • C는 malloc
          • 파편화, 쓰레드 세이프, 직렬화
          • 메모리를 빈번하게 생성하면 성능이 떨어진다.
    • Local Variables
    • 호출했다 빠졌다가 하기때문에 Call Stack
    • 명령을 받았을때 실행되기 때문에 Operand Stack
    • opcode
      • dup
        • 메소드를 호출할때 마다 dup opcode를 호출한다 (관례)
      • invoke special 구상메소드에 호출메소드를 알고 있을때 사용하는 호출방식
        • 모든 메소드의 첫번째 인자는 this 이다.
      • load opcode
        • stack에 값을 넣는다.
        • 값을 빼서 처리 후 store로 stack에 넣는다.
      • iconst
      • invokevirtual 다형성이 지원되지 않는다.
        • 런타임에 어떤 오브젝트를 호출할지 결정된다.
      • store opcode
        • stack에서 값을 뺀다.
        • local 변수로 돌려준다.
  • JVM Heap (1)
    • 모두가 공유하는 메모리이다.
  • Method Area (1)

 

주요 주제

  • 어노테이션의 특성
    • 컴파일이 될때 사용처를 알려주어 컴파일
    • 리플렉션 사용을 위한 마킹을 해놓는다.
  • 롬복 Lombok
    • 어노테이션으로 마킹하여 필요한 메소드를 바이트 코드를 적용하여 생성한다.
    • JavaOne Lambda: A peek under the hood (람다 초기 자료)
    • From Lambdas to Bytecode - Brian Goetz
    • 익명 클래스와 다른점은?
      • 익명클래스로 하던일을 쉽게 한다.
    • 익명 클래스로 하던 패턴을 바로 쓰겠다.
    • 메소드 하나만 있는 인터페이스 -> 람다적용 대상이 된다.
      • SAM (Single Abstract Method) -> Functional Abstract Method

  • invoke dynamic
    • 특징
      • 다형성 x
      • 어떤클래스를 사용하는지 런타임에 결정된다
    • 순서
      • indy botstrap 메소드 호출
        • 어떤 bootstrap메소드를 호출할지는 컴파일타임에 정해진다.
      • Callsite 라는 값을 반환한다.
        • 무엇을 호출할지 값을 가지고있다
      • bootstrap 을 통해 callsite 값 을 받은후에는 callsite 메소드를 호출
    • 장점 
      • 펌젬이오버플로우 되는 문제를 해결
      • 첫실행에는 시간이 조금 더걸리나, 첫실행후에는 빠르다. 
      • 리플렉션에 비해 절반정도 빠르다.

  • Method Handle 
    • 최종적으로 Functional Interface 로 Mapping 된다.
    • 어떤메소드를 호출할지 알려준다.
  • 람다 표현식에서 Invoke dynamic의 역할
    • 람다가쓰이는곳에 Invoke dynamic 방식으로 쓰고,
    • bootstrap 이 Method Factory 를 반환한다.
    • 런타임 중 4가지 방법중에 최적화된 방법을 찾아 수행한다.
  • 키워드
    • Lambda
    • Inner class
    • Proxy
    • Method handle
    • Invoke virtual
      • 다형성
    • Invoke interface
      • 다형성
    • invoke static
      • 다형성 x
  • Lambda 의 동작 방식
    • 한번 더 절차를 만들어 desugar
    • 람다를 람다클래스를 사용하는 멤버변수를생성
    • 코드를 Invoke dynamic 으로 생성
    • 메소드 팩토리(부트스트랩)를 생성
    • callsite를 생성하여 4가지 방법 중 가장 좋은것으로 생성
  • 정보
    • 자바닷컴은 내년초에 자바8로 바뀌게된다. (대중화가 이뤄지는 시기가 아닐까 하는 관측)

 

집 서버에 리눅스를 올리고 외장하드를 물려 사용하던 중 어느날 갑자기 외장하드 마운트가 떨어졌다.


$fdisk -l

명령어를 쳐도 안나오길래 아얘 뻑이 났나 싶어서 복구 툴을 돌리니 파일은 살아있는게 보였다.

혹시나 해서 

$sudo fdisk -l 

을 치니 디바이스는 물려있는게 보였다.

바로

$mount -t ext4 /dev/sda1/ /dir/ 

을 하니 

bad superblock on /dev/sdb1 ~

에러가 나오는 것이다. 

몇몇 포럼을 찾아 본 결과 배드 섹션이 있어서 그런것인데 아래의 명령어를 치면 해결된다.

#fsck.ext4 /dev/sda1

이후 다시 마운트 하면 해결


아이고 며칠 고생했네..


Class clazz : 클래스 변수

List<String> methodList : 메소드 리스트

Object source : 메소드를 호출할 객체

CustomMethodInfo : 메소드 정보를 담은 객체


for (CustomMethodInfo methodInfo : methodInfoList) {

MethodHandle methodHandle = MethodHandles.lookup().findVirtual(clazz, changeAccessibleMethodName(methodInfo.getMethodName()),

MethodType.methodType(methodInfo.getMethodClass()));

Object result = methodHandle.invoke(source);

}



Class clazz : 클래스 변수

List<String> methodList : 메소드 리스트

Object source : 메소드를 호출할 객체

                       try {

for (String methodStr : methodInfoList) {

Object result = clazz.getMethod(methodStr).invoke(source);

}

} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {

log.error("error." + e.getMessage());

throw new Exception("");

}

'java' 카테고리의 다른 글

JVM에 관한 토론 기록  (0) 2015.01.21
Java MethodHandle Example (Java 1.7)  (0) 2014.10.07
Java String equals / == 속도 비교  (0) 2014.07.14
Java 8 신기능 정리 - Stream  (0) 2014.07.02
Java 8 신기능 정리 - Default Method  (0) 2014.07.02

+ Recent posts