1. 객체 지향 언어가 상태를 가져서 좋은 점은?(절차 지향과 비교)

  • 객체 지향은 클래스라는 개념으로 데이터와 함수를 묶어서 사용한다.  그 클래스의 데이터들을 객체의 상태라고 할 수 있다. 이것을 캡슐화라고 할 수 있고 캡슐화를 하면 정보를 은닉해두기 때문데 외부에서 그 객체의 메서드를 호출하지 않는 이상 객체의 상태를 변경할 수 없다. 
  • 절차지향에서는 클래스라는 개념을 사용하지 않고 데이터와 함수를 묶지 않고 분리해서 사용하기 때문에 데이터가 예기치 않게 변경될 수 있다.
  • 절차 지향에서는 주로 전역 변수를 사용하고 어느 곳에서나 쉽게 접근할 수 있고 객체 지향에서는 상태를 행동을 통해서만 변경할 수 있다.

2. SSD에서는 전기 신호로 어떻게 데이터를 읽어 오는가?

  • SSD는 플래시 메모리를 사용해서 전기 신호로 데이터를 읽고 저장한다.
  • 플래시 메모리는 비휘발성 메모리의 한 유형으로, 데이터를 저장하는 데 사용되는 전자 소자이다. 플래시 메모리는 전기 신호를 이용하여 데이터를 읽고 쓰며, 전원이 꺼져도 저장된 데이터를 유지할 수 있다.

3. HDD와 SSD의 데이터 액세스 포인트 개수 차이는?

  • HDD는 보통 한 번에 하나의 데이터 액세스 포인트에 액세스 할 수 있다.
  • SSD는 병렬로 한 번에 여러 개의 데이터에 액세스 할 수 있으며 물리적은 접근이 아니기 때문에 가능하다.

4. JVM 링크에서 심볼릭 레퍼런스란?

  • 클래스로더의 링크 과정에서 마지막 단계인 해결단계와 관련된 용어이다.
  • 메서드 영역 내의 런타임 상수 풀에 있는 심볼릭 레퍼런스를 직접 참조로 대체한다. 
  • 심볼릭 레퍼런스란 우리가 코드를 작성하면서 사용한 클래스, 필드, 메서드의 이름을 지칭한다. 해결 단계에서 클래스, 필드, 메서드 , 상수 풀의 심볼릭 레퍼런스를 실제 메모리 주소로 변환한다.
  • 심볼릭 레퍼런스 : 특정 객체를 참조할 때 객체의 이름으로 참조하는 것, 상수 풀에 저장됨
  • 직접 참조 : 객체를 메모리의 실제 주소 값으로 참조하는 것

5. 상속을 타입 공유로 사용하였을 때의 장점

  • 업캐스팅을 이용해서 자식 객체를 부모 클래스의 타입으로 변환할 수 있다.(=업캐스팅, 반대는 불가능)
  • 다양한 자식 객체들을 부모의 타입으로 묶어서 관리할 수 있다.

  • 각각의 자식 객체들은 같은 부모 타입이지만 각각의 객체를 참조하기 때문에 같은 이름의 메서드를 실행해도 각각의 자식 클래스에서 재정의된 메서드로 실행된다.
  • 다형성을 구현하고 코드의 유연성을 높인다.

6. 상속의 단점은?

  • 결합도가 높아짐 :  부모 클래스의 변경이 자식 클래스에 영향을 미칠 수 있기 때문에 유지보수를 어렵게 만든다.
  • 불필요한 기능 상속 : '동물'이라는 부모 클래스에 '날다'라는 메서드가 있다면 '호랑이'라는 자식 클래스에는 불필요한 메서드가 상속된다.
  • 부모 클래스의 결함이 그대로 넘어옴
  • 부모 클래스와 자식 클래스의 동시 수정 문제  : OCP 법칙 위반(확장에는 열려 있고 수정에는 닫혀있다)
  • 메서드 오버라이딩의 오동작
  • 불필요한 인터페이스 상속 문제
  • 클래스 폭발 : 상속을 남용하게 되면 새롭게 만든 클래스에 하나의 기존 기능을 연결하기 위해 상속을 하게 되고, 이러한 과정이 반복되면 필요 이상으로 수많은 클래스를 추가해야 한다.
  • 단일 상속의 한계 : 상속이 필요한 클래스가 이미 다른 클래스를 상속하고 있다면 또 클래스를 나누어서 상속을 해야 하는데 이렇게 하면 결국 클래스 폭발 문제로 이어진다.
  • https://brightstarit.tistory.com/43 참고

7. instanceof는 왜 성능이 안좋은가?

  • instanceof를 사용하면 알맞은 타입을 찾을 때까지 컴파일 시에 모든 타입을 돌며 검사해야한다.
  • 대신에 is타입명() 과 같은 메서드의 다형성을 적용해야 성능이 더 좋다.

8. 언제 interface 사용하고, 언제 abstract class 사용 하는가?

  • 인터페이스 : 상속 관계를 타고 올라갔을 때 다른 부모 클래스를 상속하는데 같은 기능이 필요할 경우
  • 추상 클래스 : 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하는데 같은 기능도 필요할 경우
  • 상속을 받아 기능을 확장하고자 할 때는 추상클래스를 사용하고 동일한 기능을 구현하는 클래스 간의 메서드나 변수의 이름을 통일하고자 할 때는 인터페이스를 사용한다.

9. final 키워드에 대해 설명

  • final 키워드는 한 번 초기화되면 변경할 수 없음을 나타낸다.
  • final 변수 
    • 한 번 할당되면 값을 변경할 수 없다. 즉, 변수가 초기화된 후 다른 값으로 재할당할 수 없다.
    • 선언 시 초기화를 해야 한다. 초기화를 하지 않고 선언만 하면 컴파일 오류가 발생한다.
    • 보통 상수를 표현할 때 사용된다.
  • final 메서드
    • 하위 클래스에서 오버라이딩할 수 없다. 즉, final 메서드는 하위 클래스에서 변경할 수 없다.
    • 보안, 성능 최적화, 메서드의 의도된 동작 보호 등을 위해 사용됩니다.
  • final 클래스 
    • 상속할 수 없는 클래스이다. 즉, final 클래스는 하위 클래스를 가질 수 없다.
    • 보안, 불변 클래스(immutable class) 설계, 효율성 등을 위해 사용된다.
  • final 키워드를 사용하면 코드의 안정성을 높일 수 있다. final 변수는 값이 변경되지 않음을 보장하고, final 메서드와 final 클래스는 의도된 대로 동작하도록 보호할 수 있다. 따라서 코드의 의도를 명확히 전달하고 오류를 방지하기 위해 final 키워드를 적절히 활용하는 것이 좋다.

10. exception vs error

  • exception(프로그램 안) 
    • 프로그램의 실행 도중 발생할 수 있는 예외적인 상황을 나타낸다. 이러한 예외적인 상황은 일반적으로 프로그램의 사용자 또는 외부 환경의 영향을 받아 발생한다.
    • 주로 프로그램 코드 내에서 예상할 수 있는 오류나 예외적인 상황을 처리하기 위해 사용된다. 예를 들어, 파일을 찾을 수 없는 경우나 배열 범위를 벗어나는 경우 등이 있다.
    • checked exception은 반드시 처리되어야 하는 예외이며, 컴파일 시에 확인된다. unchecked(runtime) exception은 명시적으로 처리하지 않아도 되는 예외로, 실행 시에 확인된다.
    • 스레드에만 영향을 준다.
    • checked  exception
    • unchecked(runtime) exception : 예외를 미리 감지하디 못했을 때 발생. 컴파일시에 체크를 하지 않는다.
  • error(프로그램 밖)
    • 일반적으로 프로그램이 복구할 수 없는 심각한 상황을 나타낸다. 이러한 상황은 주로 시스템 레벨에서 발생하며, 프로그램 자체의 문제보다는 주로 시스템 리소스 부족, 가상 머신의 오동작, 하드웨어 장애 등과 관련이 있다.
    • 프로그램이 직접 처리할 수 없으며, 대부분의 경우 프로그램이 종료되거나 예외처리 기능을 사용하여 처리할 수 없다. Error는 주로 시스템 관리자나 개발자에게 알려주는 역할을 한다.
    • 예를 들어, OutOfMemoryError는 메모리 부족으로 인해 발생하는 오류이며, StackOverflowError는 스택 오버플로우로 인해 발생하는 오류이다.
    • 프로세스에 영향을 준다.
  • exception은 프로그램의 예외적인 상황을 처리하는 데 사용되며, 프로그램이 복구할 수 있는 상황을 나타내는 반면, error는 프로그램이 처리할 수 없는 심각한 상황을 나타내며, 주로 시스템 레벨의 문제와 관련이 있다.

11. String vs StringBuilder vs StringBuffer

  • String 
    • 불변(immutable)한 클래스이다. 즉, 한 번 생성된 문자열은 변경할 수 없다.
    • 문자열이 변경되면 새로운 문자열 객체가 생성되며, 기존 문자열은 가비지 컬렉션의 대상이 된다.
  • StringBuilder 
    • 가변적인(mutable)인 문자열을 다루는 데 사용된다. 즉, 문자열을 변경할 수 있다.
    • 내부적으로 가변적인 크기의 문자열을 저장하기 위한 버퍼를 사용하며, 이 버퍼는 동기화(synchronization)를 지원하지 않기 때문에 단일 스레드 환경에서 안전하게 사용할 수 있다.
  • StringBuffer
    • 가변적인 문자열을 다루는 데 사용된다. 그러나 StringBuilder와 달리 StringBuffer는 스레드 안전(thread-safe)한 클래스이다.
    • 멀티 스레드 환경에서 안전하게 사용할 수 있습니다. 여러 스레드가 동시에 StringBuffer 객체를 수정해도 상호간섭없이 안전하게 작동한다.
  • 멀티 스레드 환경에서는 StringBuffer를 사용해야 하지만 대부분의 경우 단일 스레드 환경에서 문자열 조작이 이루어지기 때문에 StringBuilder를 주로 사용한다.  StringBuffer는 동기화를 적용하기 때문에 오버헤드가 발생할 수 있다.

12. C1 컴파일러와 C2 컴파일러의 차이

  • C1 컴파일러 : 빠른 컴파일 시간과 작은 코드 풋프린트를 갖는 환경에서 사용된다. 1~3레벨, 낮은 수준의 최적화
  • C2 컴파일러 : 더 높은 수준의 최적화를 수행하여 더 높은 성능을 제공하는 대규모 서버 및 데스크톱 애플리케이션과 같은 환경에서 사용된다. 4레벨

13. 스프링 부트 + JSP 프로젝트에서 .jar로 빌드하는 방법은 없는가?

  • 스프링 부트 + JSP 프로젝트를 jar로 빌드하면 WEB-INF를 생성하지 못하기 때문에 jsp 파일을 가져올 수 없다.
  • 추가적으로 필요한 resource들을 담아주는 역할도 하는 META-INF를 사용하면 해결가능하다. resource에 jsp를 넣어주는 방법이다. 다음과 같이 WEB-INF를 복사해주고 원래 WEB-INF를 지워준다. 그리고 sub application을 dependency로 활용할 수 있도록 변경을 해줘야 한다.(https://oingdaddy.tistory.com/426 참고)

 

 

 

## 프로젝트

다음 3가지 주제 중 원하는 것 하나 정해서 "카카오 오븐으로 프로토 타이핑", "유저 시나리오 (글 + 그림으로 표현하면 좋음" 작성하기 (유저 시나리오까지 시간 어려우면 프로토 타이핑까지라도)
  • 필라테스, 헬스장 수업 예약
  • 서브웨이, 버거킹 등 음식점 미리 주문하기
  • 여행을 주제로 한 SNS인데, 같은 여행지에 있는 사람 찾기

'공부 > f-lab' 카테고리의 다른 글

f-lab 6주차  (0) 2024.04.24
f-lab 5주차  (0) 2024.04.16
f-lab 3주차  (0) 2024.04.02
f-lab 2주차  (0) 2024.03.26
f-lab 1주차  (0) 2024.03.19

+ Recent posts