공부/f-lab

f-lab 5주차

heeyeon 2024. 4. 16. 12:01

1. 다형성을 사용하면 좋은 점은?

  • 다형성 : 한 타입의 참조 변수를 통해 여러 타입의 객체를 참조할 수 있도록 하는 것. 즉, 상위 클래스 타입의 참조 변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용하여 상위 클래스가 동일한 메시지로 하위 클래스들이 서로 다른 동작을 할 수 있도록 한다.
  • 클래스가 상속 관계에 있을 때 나타나는 다채로운 성질
  • 장점
    • 코드를 유지보수하기 쉽다. 
    • 여러 클래스를 하나의 타입으로 묶어서 사용할 수 있기 때문에 코드를 압축할 수 있다.
  • https://inpa.tistory.com/entry/OOP-JAVA%EC%9D%98-%EB%8B%A4%ED%98%95%EC%84%B1Polymorphism-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4 참고

2. 언제 interface 사용하고, 언제 abstract class 사용 하는가? (문법적인 차이도)

  • 인터페이스
    • 모든 메서드가 추상 메서드로 구성되어 있고 구현 클래스에서 이를 구현해야 한다.
    • 다중 상속을 지원한다.
    • 주로 다중 상속을 필요로 하는 상황에서 사용한다. 여러 인터페이스를 구현함으로써 한 클래스가 다양한 역할을 수행할 수 있게 하는 상황
    • 다중 상속이 필요하거나 구현 객체 간의 계약을 정의할 필요가 있는 경우
  • 추상 클래스
    • 추상 메서드와 일반 메서드를 모두 포함하고 일부 기능을 구현한다. 
    • 다중 상속을 지원하지 않는다.
    • 공통적인 기능을 가진 클래스들 사이에서 코드의 재사용성을 높이기 위해 사용한다. 
    • 상속을 통해 코드의 재사용성을 높이고 공통적인 기능을 효율적으로 관리할 수 있게 한다.

3. checked exception vs unchecked exception

  • checked exception
    • 컴파일 단계에서 확인
    • 반드시 예외처리를 해야 함
    • 예외발생 시 트랜잭션 처리에서 롤백하지 않음(복구 가능한 메커니즘을 가져서)
    • RuntimeException의 하위 클래스가 아니면서 Exception 클래스의 하위 클래스들
  • unchecked exception
    • 실행단계에서 확인
    • 명시적인 예외 처리를 강제하지 않음
    • 외발생 시 트랜잭션 처리에서 롤백함
    • RuntimeException의 하위 클래스들

4. StringBuffer는 내부적으로 동기화 처리가 어떻게 되어 있나요?

  • StringBuilder와 StringBuffer의 append 메소드에는 차이가 있다.
  • StringBuilder
@Override
@HotSpotIntrinsicCandidate
public StringBuilder append(String str) {
    super.append(str);
    return this;
}
  • StringBuffer
@Override
@HotSpotIntrinsicCandidate
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}
  • Synchronized 메서드를 호출하였을 때, 자신이 포함된 객체에 lock 걸게 된다. 

5. enum 어떤 메모리에 저장이 될까요? (method 영역, Heap 영역 분리하여)

  • enum 클래스의 정보가 메서드 영역에 저장된다.
  • enum 객체 인스턴스가 힙 영역에 저장된다.
  • enum 클래스는 상수 하나당 인스턴스 하나를 생성해서 public static final로 공개한다. 열거 타입의 인스턴스는 클라이언트가 직접 생성할 수 없고, 인스턴스는 런타임에 한 번만 생성된다. 이런 특징으로 싱글톤 패턴을 구현할 때 사용되기도 한다.

6. inner class vs nested class (+ GC의 대상이 되는건 누구?)

  • inner class
    • static 키워드를 사용하지 않고 다른 클래스 내부에 정의된 클래스
    • 내부 클래스는 외부 클래스 멤버에 접근할 수 있다.
    • 내부 클래스 객체를 생성하려면 외부 클래스의 객체부터 생성해야 한다.
    • 내부 클래스에서 외부 클래스 멤버에 접근할 때는 외부클래스.this 로 사용한다. 내부 클래스 멤버에 접근하려면 this만 사용한다.
  • nested class
    • static 키워드를 사용하고 다른 클래스 내부에 정의된 클래스
    • 기술적으로는 내부 클래스가 아니다.
    • 내부 클래스에서 외부 클래스의 멤버에 접근할 수 없다.
    • 내부 클래스를 인스턴스화하기 위해 외부 클래스를 인스턴스화할 필요는 없다.
  •   inner class는 외부 클래스에 종속되어 있기 때문에 외부 클래스의 인스턴스가 더 이상 쓰이지 않고 GC의 대상이 되었을 때 inner class도 GC의 대상이 된다. 즉, 외부 클래스의 인스턴스가 메모리에 계속 남아있다면 inner class도 그렇다. nested class는 외부 클래스와 독립적으로 이루어져 있고 static이 붙은 클래스이기 때문에 GC의 대상이 될 수 없다.

7. 어노테이션을  왜 쓸까요? (+ 리플렉션 적용 과정)

  • 용도
    • 소스 코드에 메타데이터 추가
    • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보 제공
    • 소프트웨어 개발툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공
    • 실행 시 특정 기능을 실행하도록 정보 제공
  • 리플렉션 : 힙 영역에 로드된 Class 타입의 객체를 통해, 원하는 클래스의 인스턴스를 생성할 수 있도록 지원하고, 인스턴스의 필드와 메소드를 접근 제어자와 상관 없이 사용할 수 있도록 지원하는 API이다. 컴파일타임이 아닌 런타임에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법이다.
  • 어노테이션은 소스 코드에 메타데이터를 추가하는 방법이며, 리플렉션은 실행 시간에 클래스의 정보를 검사하고 조작하는 데 사용됩니다. 어노테이션을 사용하여 클래스에 메타데이터를 추가하고, 리플렉션을 사용하여 그 정보를 동적으로 검사하고 처리한다.
  • 리플렉션 적용 과정
    • 클래스 객체 얻기 
    • 얻고자 하는 클래스의 정보를 얻기 위해 클래스 객체의 메서드를 사용한다. 이러한 메서드는 클래스의 필드, 메서드, 생성자, 어노테이션 등에 접근할 수 있는 다양한 방법을 제공합니다.
    • 얻은 클래스, 필드, 메서드 등에 어노테이션을 조사하여 필요한 작업을 수행할 수 있다.
Class<?> clazz = MyClass.class;
MyClass obj = new MyClass();
Class<?> clazz = obj.getClass();

 

 

8. GC에서 사용하는 알고리즘은 무엇이 있고, Java는 어떤 알고리즘을 사용하나요?

9. 부동 소수점의 오류란?

  • 부동 소수점 숫자를 정확하게 표현하지 못하는 문제, 부동 소수점 숫자를 이진수로 표현할 때 발생한다.
  • 예를 들어, 10진수 0.1을 이진 소수점으로 정확하게 표현할 수 없다. 따라서 이진 소수점으로 근사하여 표현하게 되는데, 이 과정에서 정확한 값과 약간의 차이가 발생할 수 있다. 이러한 근사로 인해 부동 소수점 오류가 발생할 수 있다.
  • 계산 결과의 정확성에 영향을 미칠 수 있다. 특히 금융 애플리케이션과 같이 정밀한 계산이 필요한 경우에는 이러한 오류를 최소화해야 한다.
  • 이를 위해 BigDecimal과 같은 정확한 십진수 연산을 지원하는 데이터 타입을 사용한다.

※ 다음 주 예습 주제

1. 제네릭 

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%A0%9C%EB%84%A4%EB%A6%ADGenerics-%EA%B0%9C%EB%85%90-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0

2. ArrayList

https://inpa.tistory.com/entry/JAVA-%E2%98%95-ArrayList-%EA%B5%AC%EC%A1%B0-%EC%82%AC%EC%9A%A9%EB%B2%95

3. Stack 클래스

https://inpa.tistory.com/entry/JCF-%F0%9F%A7%B1-Stack-%EA%B5%AC%EC%A1%B0-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%A0%95%EB%A6%AC

4. Set, HashSet, Queue, LinkedList

5. Map, HashMap

 

※ 프로젝트

- 유저 시나리오 작성하기

- API 문서 작성하기

- 최소한의 기능이 무엇인지 고민해보기