[C/C++/JAVA] 변수를 block중간에 선언하는 방법에 대한 단상.

변수는 사용하기 직전에 선언하는 것이 원칙인데.. 문제는 scope다.
C/C++/JAVA에서 명시적으로 ‘{ }’를 통해서 scope를 잡아주지 않으면, 이후에도 계속 해당 변수가 살아있는 상태가 되어서 좋지 못하다.
그래서 ‘{ }’를 사용해서 scope를 제한해 주는 것이 좋은데, 그렇게 하면, indentation에서 괜시리 한칸 들여쓰여지게 되어 미관상 – 개인적으로 – 마음에 안든다…
음…
변수의 scope를 위한 이~~쁜~~ syntax가 있었으면 좋았을텐데… 라는 생각이 그냥 들어서…

[Java] Visibility에서 추가했으면 하는 것….

Java visibility는 private, protected, default(package private), public 이렇게 4단계가 있다.
그런데 개인적으로 한단계 정도 더 있었으면 한다.

기능별로 block을 형성하도록 programming할 수 있어야 한다. 그게 oop의 기본이기도 하다.
하나의 class가 하나의 block을 형성할 수 있으면 좋겠지만, 보통 여러개의 class가 하나의 기능 block을 형성한다.
그리고, 이 기능 block의 내부 interface는 package private으로 하고, 외부 interface는 public으로 둔다.
이게 Java에서의 일반적인 programming방법이다.
그런데, 어떤 기능 block 자체가 더 큰 기능 block의 한 부분이게 하고 싶은 경우는 어떻게 해야 하는가?
물론, 재 사용성을 위해서 모든 기능 블럭은 자체적으로 완벽하게 동작하도록 디자인하고, 관련 interface는 public으로 해 둘 수 있게 하는것이 이상적이긴 하다.
그렇지만, 대부분의 경우, 큰 기능 블럭의 한 부분임을 가정하고 programming하는 경우가 많다.
왜냐하면, 일반적인 기능블럭(public interface를 가지는…)을 만들어 내기 위해서는 추가적인 많은 노력들이 필요하기 때문이다.
그런데, Java의 visibility는 이런 경우를 해결해 줄 수 없다.
(하나의 package로 구성된 기능 block의 interface는 public이여야만 한다.)
그래서 개인적으로 추가적인 안을 제시해 본다.

*** tree-based name space ***

name space가 tree형태를 가진다. java convention을 이용해 설명하면, ‘.’을 separator로 하고, 각 name이 tree의 path를 의미하도록 하는 것이다.
예를 들면, ‘com.java.io’라면, ‘java’는 ‘com’의 child 이고, ‘io’는 ‘java’의 child가 된다.

***  parent private ***

visibility가 자신의 parent에게만 되도록…

음.. visibility가 자꾸 많아지는 것도 안 좋긴 한데… 일단 이런게 있었으면 좋겠다… 단점도 있을 것 같은데.. 좀더 고민해 보자…

[Java] Some notable stuffs of VM

⚫ From VM Spec

⚬ In particular, x != x is true if and only if x is NaN, and (x<y) == !(x>=y) will be false if x or y is NaN.
⚬ round towards zero
⚬ Multibyte data items are always stored in big-endian order.

⚫ Java VM Type Signature

Signature                     Java Type
Z                             boolean
B                             byte
C                             char
S                             short
I                             int
J                             long
F                             float
D                             double
L fully-qualified-class ;     fully-qualified-class
[ type                        type[]
( arg-types ) ret-type        method type

to be continue …

[Java] Simple sample codes to remind…

* Following codes is to change byte[] to integer-typed-value and vice versa.
=> Note : JavaVM uses Big-Endian. And, size of each integer-type is byte(1), short(2), int(4), long(8).

public static final int
byteArrayToLongBE(byte[] b) {
    return ((b[0]&0xff) << 56) + ((b[1]&0xff) << 48)
         + ((b[2]&0xff) << 40) + ((b[3]&0xff) << 32)
         + ((b[4]&0xff) << 24) + ((b[5]&0xff) << 16)
         + ((b[6]&0xff) << 8)  + (b[7]&0xff);
}

public static final int
byteArrayToLongLE(byte[] b) {
    return (b[0]&0xff          + ((b[1]&0xff) << 8)
         + ((b[2]&0xff) << 16) + ((b[3]&0xff) << 24)
         + ((b[4]&0xff) << 32) + ((b[5]&0xff) << 40)
         + ((b[6]&0xff) << 48) + ((b[7]&0xff) << 56));
}

public static final int
byteArrayToIntBE(byte[] b) {
    return ((b[0]&0xff) << 24) + ((b[1]&0xff) << 16)
         + ((b[2]&0xff) << 8) + (b[3]&0xff);
}

public static final int
byteArrayToIntLE(byte[] b) {
    return (b[0]&0xff) + ((b[1]&0xff) << 8)
         + ((b[2]&0xff) << 16) + ((b[3]&0xff) << 24);
}

public static final short
byteArrayToShortBE(byte[] b) {
    return (short) (((b[0]&0xff) << 8) + (b[1]&0xff));
}

public static final short
byteArrayToShortLE(byte[] b) {
    return (short) ((b[0]&0xff) + ((b[1]&0xff) << 8));
}

public static final byte[]
longToByteArrayBE(long v) {
    return new byte[] {
            (byte)(v >>> 56), (byte)(v >>> 48),
            (byte)(v >>> 40), (byte)(v >>> 32),
            (byte)(v >>> 24), (byte)(v >>> 16),
            (byte)(v >>> 8),  (byte)v};
}

public static final byte[]
longToByteArrayLE(long v) {
    return new byte[] {
            (byte)v,          (byte)(v >>> 8),
            (byte)(v >>> 16), (byte)(v >>> 24),
            (byte)(v >>> 32), (byte)(v >>> 40),
            (byte)(v >>> 48), (byte)(v >>> 56)};
}

public static final byte[]
intToByteArrayBE(int v) {
    return new byte[] {
            (byte)(v >>> 24), (byte)(v >>> 16),
            (byte)(v >>> 8),  (byte)v};
}

public static final byte[]
intToByteArrayLE(int v) {
    return new byte[] {
            (byte)v,          (byte)(v >>> 8),
            (byte)(v >>> 16), (byte)(v >>> 24)};
}

public static final byte[]
shortToByteArrayBE(short v) {
    return new byte[] {(byte)(v >>> 8), (byte)v };
}

public static final byte[]
shortToByteArrayLE(short v) {
    return new byte[] {(byte)v, (byte)(v >>> 8) };
}

* Run process

// Recommanded
// Run shell command and return it's output as string
public static String
runCmd(String... cmd) {
    String r = "";
    try {
        // execute command
        ProcessBuilder pb = new ProcessBuilder(cmds);
        // pb.redirectErrorStream(true); // if needed.
        // wait till running is done.
        Process pr = pb.start();
        pr.waitFor() ;
        String line;
        // Reader output of sub process.
        BufferedReader br = new BufferedReader(new InputStreamReader(pr.getInputStream())) ;
        // Make output String object
        while ( null != (line = br.readLine()) ) r += line + "\n";
    } catch (Exception e) {
        ; // Exception Handling!
    }
    return r;
}

// OR
public static String
    runCmd(String[] cmds) {
    String r = "";
    try {
        // execute command
        Process pr = Runtime.getRuntime().exec(cmds) ;
        // wait till running is done.
        pr.waitFor() ;
        // Reader output of sub process.
        BufferedReader br = new BufferedReader(new InputStreamReader(pr.getInputStream())) ;
        // Make output String object
        String  line;
        while ( null != (line = br.readLine()) ) r += line + "\n";
    } catch (Exception e) {
        ; // Exception Handling!
    }
    return r;
}

* Run shell command

// We should invoke SHELL (not process command directly)
// See above for 'runCmd'
String cmd = "ls -al | grep text";
runCmd("/bin/bash", "-c", cmd);
// or : runCmd(new String[]{"/bin/bash", "-c", cmd});

* Multi-lined JLabel : We can do this by using HTML directly.

JLabel jl = new JLabel("<html>1st line<br>2nd line</html>");

* Loading java property

Properties prop = new Properties();
try {
    prop.load(new FileInputStream(property_file_path));
} catch (IOException e) {
    ; // exception handling
}

* String to Integer

try {
    int v = Integer.parseInt("3456");
} catch (NumberFormatException e) {
    ; // exception handling
}

=== to be continued…

[Java] Package private in Java

Java has useful visibility; package private.
Let’s see the following case.

We want implement quite big module A. And this has some sub features. So, we need to make sub classes a, b, c.

In this case, external module should be able to see only interfaces of A; Not those of a, b and c. It is very difficult to make this in C++. But, in java, we can use package private. Here is design example.

Put all these modules in the same package.
Make interfaces of A as public.
Make all interfaces of a, b and c be package private.

Developer can easily know that using a, b and c directly is not allowed intuitively.

How about in C++?
In C++, there is no proper way to do this. Making A be ‘friend’ of a, b and c, breaks encapsulation. Making interfaces of a, b and c be public, may lead to misuse of those; we want only interfaces of A be visible to external.

I has been desired this kind of visibility – ex. namespace private – when using C++. :-)

[Java][Tips] Compile…

Java also uses compiler. So, if we meet with compile error, we need to check compile option.

[Cases]
Error : “Access restriction : the field …” [in Eclipse]

‘Project’ -> ‘Properties’ -> ‘Java Compiler’ -> ‘Errors/Warnings’ -> ‘Deprecated and restricted API’ -> Forbidden reference (access rule) -> change from ‘Error’ to ‘Warning’.
=> We can make compile success. But, please keep it mind… using forbidden reference is not recommended!!

Using external Jar [in Eclipse]

Right click on Project -> Properties -> select ‘Java Build Path’ -> select ‘Libraries’ tab -> select ‘Add External JARs’ button…