기술면접/자바, 객체지향, 스프링

자바, 객체지향, 스프링

EnoughTT 2023. 12. 26. 19:33

⁉️ 자바의 특징은?

자바는 객체지향 프로그래밍 언어로, 컴파일 언어인 동시에 인터프리터 언어이기도 합니다.
JVM (자바 가상 머신) 위에서 실행되기 때문에 운영체제에 독립적입니다.
또한, 객체 생성시 자동으로 메모리 영역을 찾아 할당하고, GC (Gabage Collector)를 통해 사용하지 않는 객체를 삭제해 메모리를 자동으로 관리합니다.
하지만, 자바 실행시 JVM 을 거쳐야하므로, 다른 언어에 비해 실행 속도가 느립니다.
다른 언어에 비해 작성해야 하는 코드의 길이가 긴 편입니다.


⁉️ JVM 이란? 어떤 기능?

JVM 은 스택기반으로 동작합니다.

자바와 운영체제 사이에서 중개자 역할을 수행하여 운영체제에 구애받지 않고 재사용을 가능하게 해줍니다.

메모리관리, GC (Gabage Collector) 를 수행합니다.

 

⁉️ 자바 말고 다른 언어는 JVM 위에 올릴 수 있나?

Kotlin, Scala, JRuby 등 자바와 호환되는 바이트 코드를 생성하여 JVM 상에서 실행하기 때문에 JVM 위에 올릴 수 있습니다.

 

⁉️ JVM 계열 언어를 일반적으로 컴파일해서 사용할 수 있나?

JVM 계열 언어는 JVM 위에서 실행될 바이트코드로 컴파일되게 설계되있지만, 바이트코드를 기계어나 네이티브 코드로 직접 컴파일하는 방법으로 사용할 수 있습니다. 네이티브 컴파일의 장/단점을 고려해야합니다.


⁉️ 자바의 컴파일 과정은?

 

1. 자바(.java) 코드를 작성합니다.

2. 자바 컴파일러가 자바 소스파일을 컴파일합니다.

   이때 나오는 파일은 자바 바이트 코드(.class)파일로 아직 컴퓨터가 읽을 수 없는 자바 가상 머신이 이해할 수 있는

   코드입니다.

3. 컴파일된 바이트 코드를 JVM의 클래스로더(Class Loader)에게 전달하고, JVM의 메모리에 올립니다.

4. 실행엔진을 통해 자바 인터프리터, JIT 컴파일러를 통해 기계어로 해석됩니다.


⁉️ 오버로딩 (Overloading)과 오버라이딩 (Overriding)이란?

오버로딩 (Overloading) 은 메서드 또는 생성자를 선언할 때 이름은 같지만 매개 변수의 유형이나 개수를 다르게 선언해 놓는 것을 의미합니다.

오버라이딩 (Overriding) 은 메서드 재정의라고 하며, 부모클래스로부터 상속받은 메서드를 자식클래스에서 행위를 바꾸거나 보완하기 위해 다시 정의해서 사용하는 것을 말합니다.

 

-- 메서드 재정의 규칙

   1. 반드시 상속을 전제로 해야합니다.

   2. 메서드 이름이 같아야합니다.

   3. 매개 변수 선언이 정확히 일치해야 합니다.

   4. 접근제한자는 같거나 더 제한이 없어야 합니다.


⁉️ 추상클래스와 인터페이스의 설명과 차이점은?

추상클래스는 추상 메서드를 선언한 후, 상속을 통해 자식 클래스에서 완성되도록 하는 클래스입니다. class 앞에 예약어 abstract 를 사용해서 구현합니다.

인터페이스추상 메서드와 상수만 가질 수 있습니다. 클래스와 달리 다중 상속이 가능해, 하나의 클래스가 여러개의 인터페이스를 구현할 수 있습니다.


⁉️ try-with-resources에 대해 설명

자원을 안전하게 처리하기 위한 방법으로 AutoCloseable 또는 Closeable 인터페이스를 구현하는 자원을 자동으로 닫아주는 기능을 제공합니다. 

try (ResourceType resource = new ResourceType()) {
    // 자원을 사용하는 코드
    
} catch (Exception e) {
    // 예외 처리
}

try 블록이 종료되면 자동으로 resource.close()가 호출되어 자원이 안전하게 닫힙니다.

자원을 닫기 위해 별도의 코드 작성이 필요없습니다. 자원이 항상 안전하게 닫히므로 자원 누수의 위험성을 크게 줄 일 수 있습니다.


⁉️ Call by value vs Call by reference

Call by value 는 메소드를 호출할 때 넘겨주고 싶은 변수(인자)를 지정하면, 메소드의 매개변수가 지정한 변수 값의 복사본으로 초기화되는 것입니다. (값 전달)

Call by reference 는 메소드를 호출할 때 넘겨주고 싶은 변수(인자)를 지정하면, 메소드의 매개변수가 지정한 변수의 레퍼런스로 초기화되는 것입니다. (주소 전달)

 

Call by value : 자바에서는 항상 Call by value 방식으로 변수를 전달합니다. 함수나 메소드에 값을 전달할 때 원본 변수의 복사본이 전달된다는 것을 의미합니다. 따라서 원본 변수의 값은 해당 함수나 메소드에서 변경되지 않습니다.

public class Test {
    public static void main(String[] args) {
        int num = 10;
        modifyValue(num);
        System.out.println(num);  // 출력: 10
    }

    public static void modifyValue(int x) {
        x = x * 10;
    }
}

 

Call by reference : 자바에서 객체를 전달할 때 객체 참조의 복사본이 전달됩니다. 이 참조의 복사본은 동일한 객체를 가리킵니다. 따라서 메소드 내에서 객체의 내부 상태를 변경하면 원본 객체도 변경됩니다. 하지만, 새로운 객체를 할당하려고 하면 원본 참조에는 영향을 주지 않습니다.

public class Test {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello");
        modifyObject(sb);
        System.out.println(sb);  // 출력: Hello, World!

        replaceObject(sb);
        System.out.println(sb);  // 출력: Hello, World!
    }

    public static void modifyObject(StringBuilder s) {
        s.append(", World!");
    }

    public static void replaceObject(StringBuilder s) {
        s = new StringBuilder("Goodbye");
    }
}

 

결론적으로, 자바는 항상 Call by value 방식을 사용하지만 객체의 경우 참조 값의 복사본을 전달합니다.


⁉️ ArrayList 와 LinkedList 의 차이점

ArrayList : 배열을 이용해 리스트를 구현하므로 인덱스 기반으로 리스트의 요소에 빠르게 접근 할 수 있습니다. 하지만 요소를 추가하거나 삭제하는 경우 배열의 크기를 변경해야해 시간이 많이 소요됩니다.

 

LinkedList : 연결 리스트로 구현해서 삽입과 삭제가 빠릅니다. 하지만 특정 요소에 접근 할 경우 순차적으로 접근하기 때문에 배열보다 시간이 많이 소요된다는 단점이 있습니다.


⁉️ List, Set, Map 차이점

List : 데이터를 순차적으로 저장하고 중복을 허용합니다. 그리고 null 도 허용합니다.

 

Set : 순서없이 Key로만 데이터를 저장합니다. Key의 중복은 허용되지않으며, Null 값도 허용되지 않습니다.

 

Map : 순서없이 Key, Value 로 데이터를 저장합니다. Set 과 마찬가지로 Key의 중복과 Null 값은 허용하지 않지만, Value는 중복을 허용합니다.


⁉️ String, StringBuffer, StringBuilder 차이점

String : 문자열 연산이 적을 때 사용하고, +/concat과 같은 연산시 새로운 String 인스턴스가 생성됩니다.

StringBuffer : 문자열 연산이 많을 때 사용하며, 동기화를 지원하며, 속도가 느리지만 병렬 상황에서 안전합니다.

StringBuilder : 문자열 연산이 많을 때 사용하며, 동기화를 지원하지 않지만 속도가 빠르며, 병렬 상황에서 안전하지 않습니다.


⁉️ Optional 클래스란?

자바 8에서 도입된 Wrapper 클래스로 값이 존재할 수도 있고 없을 수도 있는 상황을 명시적으로 처리 할 수 있습니다. 이를 통해 NullPointException 문제를 해결할 수 있으며, 가독성 높은 코드를 작성할 수 있습니다.
Optional 메서드를 사용해 값의 존재 여부를 체크하고 값이 없는 경우에 대한 기본 처리를 할 수 있습니다.


⁉️ 객체지향 설계 원칙 (SOLID)은?

1. S : 단일 책임의 원칙입니다. 하나의 객체가 하나의 책임만 져야 한다는 의미입니다. 이 원칙은 높은 유지보수성을

         유지하며, 애플리케이션 모듈 전반에서 가시성 제어를 제공함으로써 캡슐화를 유지할 수 있습니다.

2. O : 개방-폐쇄 원칙입니다. 소프트웨어 컴포넌트는 확장에 열려있어야 하고, 수정에는 닫혀 있어야 한다는 의미입니다.

          클래스를 확장하기만 하면 원하는 작업을 할 수 있도록 해야합니다.

3. L : 리스코프 치환 원칙입니다. 파생 타입 (하위 타입)은 반드시 기본 타입 (상위 타입)을 완벽하게 대체할 수 있어야 한다

         는 의미입니다.

4. I : 인터페이스 분리의 원칙입니다. 사용하지 않을 불필요한 메서드를 강제로 구현하게 해서는 안된다는 의미입니다.

        이 경우 하나의 인터페이스를 2개 이상의 인터페이스로 분할해야 합니다.

5. D : 의존관계 역전 원칙입니다. 추상화에 의존해야 한다는 사실을 의미합니다.


⁉️ 스프링 프레임워크란?

스프링 프레임워크 자바 기반의 오픈 소스 애플리케이션 프레임워크로, 개발을 빠르고 효율적을 할 수 있도록 틀과 공통 프로그래밍 모델, 기술 API 등을 제공해줍니다.

 

⁉️ 스프링 프레임워크 특징은?

1. IoC (Inversion of Control, 제어 반전) 과 DI (Dependency Injection, 의존성 주입) 을 지원합니다.

    제어 반전을 통해 컨트롤의 제어권이 프레임워크에게 있어서 필요에 따라 스프링에서 사용자의 코드를 호출합니다.

    가독성이나 코드 중복, 유지 보수를 편하게 할 수 있습니다.

    의존성 주입은 객체 간의 결합을 느슨하게 만들어줍니다. 이를 통해 객체들은 서로의 의존성을 직접 생성하지 않고,

    외부에서 주입받아 사용할 수 있게 됩니다. 이로 인해 테스트 용이성과 모듈성이 향상됩니다.

2. 관점 지향 프로그래밍 (AOP (Aspect-Oriented Programming)) 을 지원합니다. 애플리케이션의 핵심 비즈니스 로직과

    관련 없는 부가적인 기능들(로깅, 보안, 트랜잭션 등)을 모듈화하고 분리할 수 있습니다.

    이로써 핵심 로직과 부가 기능의 재사용성과 관리 용이성이 높아집니다.

3. POJO (Plain Old Java Object) 기반의 프레임워크 입니다. 특정 라이브러리를 사용할 필요가 없어 개발이 쉽고, 기존

    라이브러리의 지원이 용이합니다.


⁉️ 스프링 MVC 란?

스프링 MVC 는 MVC (Model-View-Controller) 아키텍처 패턴을 기반으로 한 웹 프레임워크 입니다.

MVC 아키텍처는 비즈니스 로직, 사용자 인터페이스, 데이터를 각각 독립된 컴포넌트로 분리하여 개발하는 패턴입니다.

모델 (Model) : 데이터와 비즈니스 객체를 나타냅니다. 컨트롤러가 모델 데이터를 준비하고, 뷰에 전달하여 화면에 표시될

                       내용을 결정합니다. DAO, DTO, Service 가 해당됩니다.

뷰 (View) : 사용자에게 결과를 시각적으로 표현하는 역할을 합니다. 일반적으로 템플릿 엔진을 사용하여 동적으로 화면을

                  생성하고, 컨트롤러로부터 전달받은 모델 데이터를 표시합니다. HTML, JSP, Thymeleaf 등으로 화면을 구성

                  하고, Rest API로 서버가 구현된다면 json 응답으로 구성되기도 합니다.

컨트롤러 (Controller) : 클라이언트의 요청을 처리하고, 모델과 뷰를 연결하는 역할을 합니다.


⁉️ JPA 와 같은 ORM 을 사용하는 이유?

  • ORM 을 사용하면 개발자는 SQL 쿼리를 작성하는 대신 객체 지향적인 방식으로 데이터베이스 작업을 수행할 수 있습니다. 이를 통해 개발 시간이 단축되고, 코드의 가독성과 유지 보수성이 향상됩니다.
  • 데이터베이스의 종류와 독립적인 코드를 작성할 수 있게 해줍니다. 이를 통해 마이그레이션 시 코드 변경이 최소화됩니다.
  • 1차 캐시를 내장하고 있어, 반복적인 데이터베이스 조회 작업의 효율성을 높일 수 있습니다.

 

 

 

 

 

 

 

 

참고

신입 개발자 기술면접 질문 정리 - 백엔드 (tistory.com)

'기술면접 > 자바, 객체지향, 스프링' 카테고리의 다른 글

디자인 패턴  (0) 2024.05.19