[F-Lab] 모각코 챌린지 2일차

tree·2023년 5월 2일
0

Q1. 자바에서 변수의 종류 4가지에 대해서 설명해주세요

  • 메소드 인자
    • 메소드 내에서 사용하는 변수. 메소드를 호출할 때 호출하는 쪽에서 변수 값을 전달해준다.
    • 유효 범위는 선언되어 있는 메소드 내로 한정.
    • 메모리 상에서는 stack 영역에 저장된다.
  • 지역 변수
    • 메소드 또는 블록 내에 선언되는 변수.
    • 유효 범위 역시 선언되어 있는 메소드 또는 블록이다. 다른 메서드나 블록에서 접근할 수 없다.
    • 메모리 상에서는 stack 영역에 저장된다.
  • static 변수
    • 클래스 내에 선언된 변수 중에서 static이 붙은 변수. 모든 인스턴스가 공유하며, 인스턴스를 생성하지 않고도 사용할 수 있다.
    • 클래스가 메모리에 로드될 때 static 영역(메소드 영역)에 저장되며 프로세스가 종료될 때까지 메모리 해제가 이루어지지 않는다.
  • 인스턴스 변수
    • 클래스 내에 선언된 변수이며 인스턴스마다 별도로 가진다.
    • 메모리 상에서는 힙 영역에 저장된다.

1-1. class, instance 변수는 thread safety 문제가 있는데 무엇인가요?

  • 쓰레드는 각자 스택 영역을 가진다. 메소드 인자와 지역 변수는 스택 영역에 저장되기 때문에 한 쓰레드가 다른 쓰레드의 스택 영역에 있는 메소드 인자와 지역 변수에 접근할 수 없다. 하지만 static 변수(class 변수)는 메소드 영역에 저장되고, 인스턴스 변수는 힙 영역에 저장되는데 메소드 영역과 힙 영역은 쓰레드들이 공유하는 메모리 공간이다. 따라서 한 쓰레드가 static 또는 인스턴스 변수에 대한 작업을 진행 중일 때, 다른 쓰레드가 해당 변수의 값을 변경하면 데이터의 일관성이 깨져 문제가 발생한다.

1-2. primitive type과 reference type의 차이점은 무엇인가요?

  • 기본형은 short, byte, char, int, long, float, double, boolean이 있으며 이를 제외한 나머지 유형은 모두 참조형이다.
  • 기본형은 변수의 메모리 공간에 값 그 자체를 저장하는 반면, reference type은 참조하는 객체의 주소값을 저장한다.

Q2. String literal ("") 과 new String("") 으로 만든 문자열 참조의 차이는 무엇인가요?

  • 문자열 리터럴을 사용해 문자열을 생성하면 Constant Pool을 뒤져서 동일한 문자열 리터럴이 이미 풀에 존재하는지 확인한 후 존재하면 해당 리터럴을 참조하고, 없으면 풀에 새로운 문자열을 추가한다. 하지만 new String()을 이용해 문자열을 생성하면 풀에 해당 문자열의 존재 여부와 상관없이 새로운 문자열을 추가한다. Constant Pool은 JVM의 힙 영역에 존재하므로 GC(가비지 컬렉션)의 대상이 된다. 따라서 new String()을 무분별하게 사용하면 Constant Pool에 중복되는 문자열이 존재하게 되므로 메모리 낭비가 심해질 뿐더러 GC가 자주 수행되고 GC의 성능도 떨어진다.

Q3. 자바에서 코드를 공유(재사용)하는 방법은 어떤 것들이 있나요?

  • 정적 유틸리티 클래스 사용
    • 정적 유틸리티 클래스를 만들면 프로젝트 전반에 사용되는 기능에 대해서 클래스마다 메소드를 만들 필요가 없고 유틸리티 클래스의 메소드를 호출함으로써 코드의 재사용성을 도모할 수 있다.
      • 하지만 유틸리티 클래스를 많이 사용하면 유틸리티 클래스에 의존하는 클래스가 늘어나게 되고, 유틸리티 클래스는 추상화를 하지 않기 때문에 유틸리티 클래스의 코드에 변경이 발생하면 의존하는 클래스들의 코드를 수정해야 하는 문제가 발생할 수 있다.
  • 상속
    • 상속이란 부모 클래스의 변수와 메소드를 자식 클래스가 물려받아 사용하는 것이다. 자식 클래스는 오버라이딩을 통해 메소드의 기능을 재정의 할 수도 있고, 부모 클래스에 없는 기능을 추가할 수도 있다. 상속을 사용하면 부모 클래스에 있는 메소드를 자식 클래스에 만들지 않아도 사용할 수 있으므로 재사용성이 높아진다.

3-1. 상속으로 코드를 공유했을 때 발생하는 문제점은 무엇이 있을까요?

  • 강한 결합도
    • 부모 클래스와 자식 클래스의 결합이 강해져 부모 클래스 변경 시, 자식 클래스가 영향을 받기 쉬워 유지보수성이 떨어지고 버그 발생 확률이 높아진다.
  • 컴파일 관계(정적 관계) 형성
    • 부모 클래스와 자식 클래스의 관계가 컴파일 시점에 결정되어 실행 시점에 둘의 관계를 변경할 수 없어 유연한 설계가 어려워진다.
  • 클래스 폭발
    • 여러 기능을 조합해야 하는 설계에 상속을 사용하면 조합의 경우의 수만큼 클래스를 만들어야 한다.

3-2. 계층 구조를 고정하는 문제를 해결하기 위한 방법은 어떤 것들이 있을까요?

  • 합성(Compositon)
    • 낮은 결합도
      • 합성은 인터페이스에 의존하므로 구현 객체의 변경에 받는 영향을 최소화할 수 있다.
    • 런타임 관계(동적 관계) 형성
      • 런타임 시점에 객체의 관계를 결정할 수 있어 유연한 설계가 가능해진다.
    • 클래스 폭발 문제도 자연스럽게 해결된다.
  • 믹스인(Mixin)
    • 객체를 생성할 때 코드 일부를 클래스에 섞어 넣어 재사용하는 기법

3-3. 믹스인은 무엇이고 사용했을 때 얻을 수 있는 이점은 무엇인가요?

  • (잘 모르겠다ㅠㅠ 추후 추가 예정...)

0개의 댓글