passion and relax

[JAVA] 19. 거의 본문에 들어갈 뻔 했던 내용 본문

프로그래밍

[JAVA] 19. 거의 본문에 들어갈 뻔 했던 내용

Grab Java 2024. 6. 5. 14:37

불변성 (Immutability)

String의 불변성

. String은 같은 변수를 여러번 연산하면, 연산시 사용한 문자열을 모두 String 풀에 넣는다.
. 어떤 문자열을 변수에 대입하면, String 풀에 그 문자열이 있는지 확인하고, 있으면 그 레퍼런스를 사용한다.
. 자바는 이런 재활용성 때문에 Sring에서 immutability를 기본적으로 사용하며, 가비지컬렉터도 돌지 않아 절대 사라지지 않는다.
. 이에 String 연산이 많다면 메모리 절약을 위해 StringBuffer나 StringBuilder를 사용하라.


Wrapper의 불변성

. 레퍼 클래스도 불변성을 갖는다.
    Integer iWrap = new Integer(42);  //42라는 정수값을 변경할 수 없다. setter 자체가 없다.
    iWap = new Integer(37);  //이것은 새로운 객체를 만든 것이지 37로 바꾼 것이 아니다.

 


String - StringBuffer - StringBuilder

모두 다 있는 메소드

    char charAt (int index);    //특정 위치의 문자
    int length();    //문자열의 길이
    String substring (int start, int end);    //문자열 일부를 뽑아 냄
    String toString();    //객체를 문자열로 나타낸 값


String 에만 있는 메소드

    String concat (String);    //문자열을 합하는 메소드
    String replace (char old, char new);    //치환
    char[] toCharArray();    //char 배열로 변환
    String toLowerCase();  toUpperCase();    //대소 변환
    String trim();    //앞, 뒤 끝의 공백 제거
    String valueOf (char[]);    //char에서 String으로
    String valueOf (int i);    //원시값에서 문자열로.. 다른 원시형도 가능.


StringBuffer와 StringBuilder에 있는 메소드

    String append(String);    //문자열 합하는 메소드
    StringBxxx delete (int start, int end);    //일부 삭제
    StringBxxx insert (int offset, any primitive or char[]);    //offset 위치에 뭔가를 삽입함.
    StringBxxx replace (int start, int end, String s);    //일부를 String을 변환
    StringBxxx reverse();    //뒤집음.
    void setCharAt (int index, char ch);    //해당 위치를 문자로 치환

 


assert 문

assert (height > 0);    //참이면 아무일 없이 계속 진행. 거짓이면 AssertionError 발생
assert (height > 0) : "height = " + height;    //거짓이면 AssertionError에 높이값을 추가해서 출력. 어떤 자바 표현식도 가능함.
컴파일 방법 : 그냥 하면 됨.
    javac Ha.java
실행 방법 : -ea 옵션 추가. assert가 작동하게 됨.
    java -ea Ha

 


정적 중첩 클래스

public class FooOuter {
    static class BarInner {
        void sayIt() {
            sout("inner");
        }
    }
}

class Test {
    psvm {
        FooOuter.BarInner foo = new Footer.BarInner();  //내부가 정적이기에 외부클래스의 인스턴스 불필요함.
        foo.sayIt();
    }
}

익명 내부 클래스

public class TestAnon {
    psvm {
        JFrame frame = new Frame();
        JButton button = new JButton("click");
        frame.getContentPan().add(button);
        //button.addActionListener(quitListener);  //원래 이런 식으로 한다.
 

        button.addActionListener (  new ActionListener() {
            public void actionPerformed (ActionEvent ev) {
                System.exit(0);
            }
        }  );

    }
}

 


다차원 배열

int[][] a2d = new int[4][2];
. [4]에 의해 래퍼런스 변수를 담을 수 있는 int형 배열을 잡고, 이 배열 주소를 a2d 변수에 담는다.
    a2d ㅁ => ㅁ ㅁ ㅁ ㅁ
. [4][2]에 의해 2개 짜리 배열 4개를 준비한다.
    [4][2] => ㅁㅁ, ㅁㅁ, ㅁㅁ, ㅁㅁ
. 4개의 각각의 레퍼런스는 처음 a2d에 의해 잡혀진 4개의 ㅁㅁㅁㅁ에 각각 담는다.
    ㅁ => ㅁㅁ,   ㅁ => ㅁㅁ,   ㅁ => ㅁㅁ,   ㅁ => ㅁㅁ

 

int myVal = a2d[2][1];
    배열 인덱스는 0부터..
    하나의 값만 가져온다.
int[] myRow = a2d[2]
    한 row를 가져온다.
    즉 일차원 레퍼런스를 가져온다.
int[][] x = {{2,3,4}, {7,8,9}}
    2*3 배열의 선언과 동시에 초기화하는 방법.
int[][] y = new int [2][];    y[0] = new int[3];    y[1] = new int[4];
    불규칙적인 크기를 갖는 이차원 배열도 생성 가능하다.

 


열거형 (Enumerations) :: 열거형의 기본

public enum Member { JERRY, BOBBY, PHIL };
public Members theMember;

if (theMember == Members.JERRY) {
    //관련 작업
}

열거형 (Enumerations) :: 열거형의 고급

public class MyEnum {
    enum Names {
        JERRY ("lead quiter") {
            public String sings() {
                return "plaintively";
            }
        },
        BOBBY ("rhythm guiter") {
            public String sings() {
                return "hoarsely";
            }
        },
        PHIL ("bass");
        private String instrument;
        Names(String instrument) {
            this.instrument = instrument;
        }

        public String getInstrument() {
            return this.instrument;
        }

        public Striing sings() {
            return "occasionally";
        }
    }

    psvm {
        for (Names n : Names.values()) {
            sout(n + " : " + n.getInstrument() + " : " + n.sings());
        }
    }
}


출력

JERRY : lead guitar : plaintively
BOBBY : rhythm guiter : hoarsely
PHIL : bass : occasionally