DevJong12

22.05.04 F-Lab멘토링 본문

Java,Spring/F-Lab

22.05.04 F-Lab멘토링

Jong12 2022. 5. 5. 21:45
728x90

단 한시간동안이었지만.. 질문을 받은 부분들이 전부다 생각조차 못해봤던 영역의 문제라 듣기만 해도 멘탈이 바사삭 부셔지긴 했는데

되게 재밌는 시간이었고, 왜 이정도 까지 생각을 못해봤을까 라는 생각을 했다..

 

정리를 해주신 것들은 무조건 알아보고자 기록으로 남겨놓는다.

 

1. Primitive Type과 Reference Type이 Garbage Collector가 동작하게 될 경우 어떻게 작동이 진행 될까요?

- 예시로 들어준 것은 int a = 1; Integer a = 1;일 경우 GC에서는 어떻게 동작되는지

 

내가 봐야할 부분은 선언당시에 JVM의 어느 메모리 영역에 생성이 되는지를 한번 확인해봐야 할 것 같다.

 

- Primitive Type(기본형) 의 경우에는 JVM에서 Stack 메모리에 값이 저장이 됨

- Reference Type(참조형) 의 경우에는 JVM에서 Heap메모리에 값이 저장된다.

 

- Garbage Collector는 간단히 설명하면 JVM에서 Heap영역에서 메모리가 Full이 되는 경우 실행이 되는 프로세스이다

 

- 위에 설명에서 적혀있듯 Heap영역에 대해서 비우는 역할이다.. Stack영역의 수집은 이뤄지지 않는다는 뜻..

- 주셨던 예제에서 int의 경우에는 기본형에 속하여 Stack메모리에 해당 값이 저장이된다.

   반면에 Integer형의 경우에는 참조형이다 보니 Heap메모리에 해당 값이 저장이 되며, GC가 발생하게 될 경우 Integer형은 수집이 되어

   참조가 없게 되는 경우 삭제가 이뤄질 수 있지만, int형으로 선언된 변수는 Stack에 저장이 되어있기에 삭제가 이뤄지지 않게된다..

 

✓ 현재 해당 원리가 궁금해서 겉할기식으로만 봤지만 Garbage Collector에 대해서 알면 알수록 너무 재밌었다..

    JVM에서 부터 시작을 해서 Garbage Collector로 가고, 구동원리도 봐야했고.. 추후 GC에 대해서도 조금더 자세히 공부하고 포스트를 작성해야겠다..


2. ==과 .equals()차이를 직접 구현해보세요

일단 두개의 차이부터 기록을 해보자..

 

공통점

  • 내용을 비교하는 기능
  • return 타입으로 boolean형을 받음

차이점

  •  ==연산자
    • 객체의 주소값을 비교, 비교하는 객체가 동일한 객체인지를 판별함
    • Primitive Type의 객채에 대해서는 값의 비교가 가능하고 Reference Type에 대해서는 주소 비교를 수행
    • Primitive Type의 객체는 Constant Pool의 특정한 값을 참조하는 변수, 동일 주소를 비교
  • .equals()
    • ==연산자와 동일하게 주소값의 비교를 수행하는 메소드이나, 오버라이딩이 가능함
    • String의 equals메소드도 오버라이딩을 하여 문자열비교가 가능한 것
public class quest2 {
    public static void main(String[] args) {
        ExampleEquals exam1 = new ExampleEquals("sample");
        ExampleEquals exam2 = new ExampleEquals("sample");

        System.out.println(exam1.equals(exam2));
    }
}

class ExampleEquals {
    String name;

    public ExampleEquals(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if(this == obj)
            return true;
        else
            if(obj instanceof ExampleEquals) return name == ((ExampleEquals)obj).name;
            else return false;
    }
}

코드구현은 위와 같이 간단하게만 구현해봄..

 

✓ String의 경우 =""형식으로 생성을 하게 될 경우 Heap메모리의 String Constant Pool로 저장이 되며, 추후 String을 선언시 동일한

값이 String Constant Pool에 존재하는 경우 새로 생성하는 게 아니라 String Constant Pool영역의 주소값을 연결한다


3. 배열의 크기를 벗어나면 ArrayIndexOutOfBoudsException이 발생되는데 해결방법은 뭐가 있을까요?

- 수업들을 당시에 Map 밖에 생각이 안났었는데...차라리 리스트가 났긴했네... 다른 방안도 생각해보는걸로..

 

- 곰곰히 생각을 해봤는데 다음과 같은 방식으로도 Exception자체는 피할수 있지 않을까 싶다.

- 선언되었던 배열의 크기를 늘릴 수 있는 방법이 있는지 봤는데 따로 없는 것으로 보임..ㅋㅋ...처음 배울때 했던 생각을 다시 해볼줄은 몰랐다..

public class quest3 {
    public static void main(String[] args) {
        int[] exam = new int[20];

        integerArray intAry = new integerArray();
        intAry.exampleArray(exam);
    }

}

class integerArray {
    void exampleArray(int[] ary) {
        int [] sample = new int[10];
        System.out.println(sample.length);
        sample = new int[ary.length];
        System.out.println(sample.length);
    }
}

 

✓ 하면서 들었던 생각이 지금은 일단 배열을 다시 선언한 것이지만, ArrayList도 방안이 될 수도 있다..

✓ 배열의 크기는 동적으로 늘릴수가 없다.. 이미선언되었다면..

✓ 위의 소스를 보면서 생각했던 건 위에서 메모리를 다루다 보니까 이 과정이 메모리에서 어떻게 이뤄질지에 대한 생각을 해보게 되었슴..

int는 primitive Type으로 stack영역에 선언이 된다, 하지만 new를 사용할 경우 reference Type영역으로 heap에 선언이 되게 되지 않을까..?  그리고 이렇게 두번이나 선언을 해버리게 되면 리소스의 효율은..?

이러면 차라리 list가 낫지않을까 라는 생각이 듦..., 일단 배열을 새로 만드는 거다 보니 주소값자체도 다른건 확인이 된다..

 

4. try-catch-finally 구문 중 return 키워드 시에 메소드를 종료시킨다면 finally구문의 실행여부 확인해보기.

public class quest4 {
    public static void main(String[] args) {
        finallyTest test = new finallyTest();
        System.out.println("as-is try");
        test.tryCatchFinallyTest();
        System.out.println("to-be try");
    }
}

class finallyTest {
    void tryCatchFinallyTest(){
        try {
            System.out.println("In Try");
            return;

            //JVM의 중지 또는 런타임의 중지는 finally블록을 실행하지 않는다.
            //System.exit(1);
            //Runtime.getRuntime().halt(1);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("finally Test");
        }
    }
}

이건뭐... 무조건 실행은 맞으니까..

 

추가적으로 주의사항은 주석의 시스템종료와.. 

 

try {
    System.out.println("Inside try");
    throw new RuntimeException();
} finally {
    System.out.println("Inside finally");
    return "from finally";
}

위의 코드에서는 throw가 무시되고 return 이 반환됨. finally블록에서 return 문을 사용하거나, 예외발생은 하지말것...

 

try {
    System.out.println("Inside try");
    return "from try";
} finally {
    System.out.println("Inside finally");
    return "from finally";
}

위의 경우처럼 에도 finally의 return이 반환된다.

728x90

'Java,Spring > F-Lab' 카테고리의 다른 글

22. 06. 20 F-Lab 멘토링  (0) 2022.06.27
22. 05. 30 F-Lab 멘토링  (0) 2022.06.12
22.05.24 F-Lab멘토링  (0) 2022.05.30
22.05.16 F-Lab멘토링  (0) 2022.05.18
22.05.09 F-Lab멘토링  (0) 2022.05.11
Comments