항해99 기술면접 대비

23.10.12 항해 99 16기 기술면접 대비

김용글 2023. 10. 12. 10:39

1. Call by reference란 무엇이고 보통 어떻게 쓰이나요?

   1) Call by reference란 ?

       참조에 의한 호출방식이라고 불리며 인자의 값이 매개변수에 복사되지만 복사되는 값이 데이터의 주소값이다 

   2) 어떻게 쓰이나?

       (1) 값의 변경이 필요한 경우

            함수내에서 전달된 변수를 수정하고, 이 수정이 호출자에게 영향을 미치도록 하는경우 사용할 수 있다

            반환값만으로는 충분하지 않고 함수 호출자의 변수를 직접 변경해야 하는 경우에 유용

       (2) 다수의 반환값

            여러개의 값을 반환하는 대신 함수 호출자에게 여러 변수를 전달하여 다수의 값을 수정하고 가져올 수 있다

       (3) 메모리 효율성

            데이터의 복사본을 만들지 않기 때문에 대용량 데이터 처리에 유용할 수 있다 데이터를 복사하는 대신

           데이터의 주소를 전달하므로 메모리 사용량을 줄일수 있다

 

예시)

#include <isotream>

using namespace std;

void swap(int *x, indt *y) {
int temp = *x;
*x = *y;
*y = temp;
}

int main(void) {
int a= 1;
int b= 2;

swap (&a, &b);

cout << "a : " << a << endl;
cout << "b : " << n << endl;

system("pause");

trturn 0;
}

결과값
a = 2
b = 1

       *순서

        (1) a라는 변수에 1이라는 값이 저장되어 있고 a의 주소는 0x123 이라고 가정

        (2) b라는 변수에 2라는 값이 저장되어 있고 b의 주소는 0x124 이라고 가정

        (3) swap 함수가 호출되면서 a, b의 각각앖이 저장되어 있는 주소값을 x, y로 각각 넘김

        (4) int temp 변수 안에 x의 주소값이 가리키고 있는 값 즉, a 변수가 저장하고 있는 1이라는 값을 

             temp 변수에 저장시킴

        (5) y의 주소값이 가리키고 있는값 즉, b 변수가 저장하고 있는 2라는 값을 x가 가리키고 있는 주소에 저장을 시킴

             그러면 x = 2가 됨

        (6) temp 변수가 저장하고 있던 1이라는 값을 y 변수가 저장하고 있는 주소값이 가리키는 곳에 가서 저장시킴

            그러면 y = 1이 됨

        이로써 현재 a와 x의 주소는 같고 x가 저장하고있는 주소값이 가리키는 메모리 값은 2가 되고,

         b와 y의 주소는 같고 y가 저장하공 있는 주소값이 가리키는 메모리 값은 1이됨

 

-> 모범 답안

1) Call by Value (값에 의한 호출)

    메소드에 변수를 전달할 때, 해당 변수의 값이 복사되어 메소드 내에서 사용됩니다.

    따라서 메소드 내에서 변수의 값을 변경하더라도 호출자의 변수는 변경되지 않습니다

    스프링에서는 메소드 호출 시 일반적으로 Call by Value 방식을 따릅니다.

2) Call by Reference (참조에 의한 호출)

    메소드에 변수를 전달할 때 변수의 참조(메모리 주소)가 전달되며, 메소드 내에서 변수를 수정하면 호출자의

    변수도 변경됩니다. 이것은 자바에서 직접 지원하지 않습니다.

    스프링에서는 이러한 방식을 직접 사용하지 않고, 대신 객체를 전달하여 객체 내부의 상태를 변경할 수 있습니다.

    스프링은 Java에서 메소드 호출 시 "Call by Value" 방식을 따릅니다. 이는 메소드에 변수를 전달할 때 해당 변수의

    값이 복사되어 전달되며, 따라서 메소드 내에서 변수의 값을 변경해도 호출자의 변수는 변경되지 않습니다.

    스프링은 객체 지향 프로그래밍을 적극적으로 활용하며, 객체를 전달하여 객체의 상태를 변경하거나 결과를

    반환하는 방식을 선호합니다. 객체를 전달하면 객체의 상태 변경과 관리가 더 효율적이며 예측 가능해집니다.

    (1) 예

         친구에게 책을 빌려주는 상황이라 가정하자 2가지 방법으로 책을 빌려줄 수 있을 것이다.

         첫번째는 책을 직접 가져다주는 것이다. 복사해서 말이다.

         두번째는 책이 있는 자신의 집 주소를 알려주는 것이다.

         두번째 경우에는 친구가 책을 보고 해당 책을 수정하면 내 원래 책에도 변화가 생긴다같은 책이니 말이다.

         Call by reference는 후자와 같다고 할 수 있다.

    (2) 사용이유

         Call by Reference는 책을 빌리는 상황처럼 주소만을 다루기에 아까와 동일한 상황에서 거대한 책을

         직접 옮길 필요도 복사할 필요도 없다.

         프로그램 적으로 보면 배열이나 객체와 같이 큰 데이터를 전달할때 복사하는 시간도 메모리도 절약할 수 있다.

 

3. JPA는 언제 필요하고 언제 필요하지 않은지 설명해주실 수 있을까요?

  1) 언제 필요한가?

      (1) 생산성

            JDBC 방식의 경우 SQL 쿼리문을 직접 작성해야 데이터베이스에 접근할 수 있지만 JPA는

            쿼리문을 별도로 작성할 필요가 없기 때문에 간단한 메서드를 통해 CRUD가 가능하므로

            생산성이 높아진다

      (2) 유지보수

           JPA를 사용하지 않으면 엔티티 클래스의 필드가 변경되면 모든 SQL을 수정해야 했다

           하지만 JPA에서는 쿼리를 직접 작성하지 않기 때문에 필드가 변경되더라도 매핑 정보만 잘 연결하면

            SQL 문은 자동으로 작성된다

      (3) 패러다임의 불일치 문제 해결

           상속, 연관관계, 객체 그래프탐색, 비교 등의 설계 차이로 인해 발행하는 패러다임 불일치 문제를 해결한다

            - 객체는 상속 구조를 만들 수 있으며, 다형성 구현이 가능하지만 관계형 데이터베이스의 테이블은 상속이란

              개념이 존재하지않는다

            - 객체는 참조를 통해 관계를 표현하며 방향을 가지고 있으나, 관계형 데이터베이스는 외래키를 통해 관계를

              표현하며, 방향이 존재하지 않는다 또한, 다대다 관계 문제를 해결하기 위해 조인을 사용한다.

           이와 같이 객체와 데이터베이스는 서로 다른 목적을 가지고 설계 되었기 때문에 매핑하는데 있어 여러문제가

           발생하는데 JPA를 사용하면 이런 문제를 모두 해결할 수 있다

 

 2) 언제 필요하지 않은가?

     (1) 간단한 응용프로그램 개발

           작은 규모의 응용프로그램이나 프로토타입을 개발할때는 JPA의 추가 복잡성은 필요하지 않을 수 있으며

           직접 SQL을 작성하거나 경량 데이터베이스를 사용하는 것이 더 효율적일 수 있다

     (2) 성능문제

           JPA는 간단한 쿼리를 실행할 때에도 ORM 오버헤드가 발생할 수 있다 응용프로그램의 성능이 매우 중요하다면

          직접 SQL을 작성하거나 JPA 기능의 최적화가 필요하다

     (3) 기존 데이터베이스 스키마와의 제한

          기존 데이터베이스 스키마가 복잡하거나 ORM과 어울리지 않는 경우, JPA 사용이 어려울 수 있다

          이 경우 기존 스키마에 맞게 직접 SQL을 작성하는 것이 좋다

     (4) ORM의 학습곡선

          ORM 기술은 학습곡선이 있을 수 있으며 처음 개발자에게는 추가 학습 시간이 필요하므로 간단한 프로젝트에는

          도입하지 않는 것이 좋다

 

    * JPA란?

      Java에서 사용하는 ORM(Object Relational Mapping) 기술표준

      Java 애플리케이션과 JDBC 사이에서 동작하며 자바 인터페이스로 정의됨

 

    * ORM(Object Relational Mapping) 이란?

      1) 객체와 관계형 데이터베이스의 데이터를 매핑하는 기술

      2) ORM 프레임워크가 객체와 데이터베이스 중간에서 매핑

      3) 객체와 테이블을 매핑하여 패러다임 불일치 문제를 해결

 

    * JDBC 

      자바 프로그램이 데이터베이스와 연결되어 데이터를 주고 받을 수 있게 해주는 프로그래밍 인터페이스

      응용 프로그램과 DBMS 간의 통신을 중간에서 번역해주는 역활

 

    * DBMS

      데이터베이스를 관리하고 운영하는 소프트웨어

 

    * 데이터베이스 스키마

      관계형 데이터베이스에서 데이터가 구조화 되는 방식을 정의한다

      여기에는 테이블 이름, 필드, 데이터 유형 그리고 이러한 엔티티 간의 관계 등 논리적 제약조건이 포함된다

      일반적으로 스키마는 시각적 표현을 사용하여 데이터베이스의 아키텍쳐를 전달하며, 조직의 데이터 관리 규율의

     기반이다 이 데이터베이스 스키마 설계 프로세스를 데이터 모델링이라고도 한다

 

-> 모범 답안

  1) JPA가 필요하지 않은 경우는 다음과 같습니다.

      (1) 간단한 프로젝트     

            작은 규모의 프로젝트에서는 JPA를 사용하지 않고 JDBC와 SQL을 직접 다루는 것이 좋습니다.

      (2) 쿼리가 복잡하지 않은 경우

           간단한 쿼리로 데이터베이스와 상호작용할 때는 JPA를 사용하는 대신 직접 SQL을 작성하는 것이 더

           효과적일 수 있습니다.

      (3) 성능이 매우 중요한 경우 

           JPA는 객체와 데이터베이스 간의 변환을 처리하는데 일정한 오버헤드가 발생할 수 있습니다.

           매우 높은 성능을 요구하는 애플리케이션의 경우 직접 SQL을 작성하는 것이 더 효율적일 수 있습니다.

 2) JPA가 필요한 경우

      (1) 복잡한 데이터베이스 관계

           데이터베이스 테이블 간에 복잡한 연관 관계가 있을 때, 복잡한 조인 쿼리를 작성할 필요가 없어집니다.

      (2) CRUD 작업이 자주 발생하는 경우

           CRUD 작업을 수행할 때 JPA는 객체와 데이터베이스 간의 변환을 자동으로 처리해 줍니다.

      (3) 유지보수가 용이한 코드

           JPA를 사용하면 데이터베이스 스키마의 변경에 대응하기 쉽습니다. 데이터베이스 스키마가 변경되더라도

           Java 코드는 변경하지 않고 JPA 설정만 업데이트하면 됩니다.

      (4) 패러다임 불일치 해결: 객체는 상속 구조를 만들 수 있으며, 다형성 구현이 가능하지만, 관계형 데이터베이스의

           테이블은 상속이라는 개념이 존재하지 않습니다. 객체는 참조를 통해 관계를 표현하며 방향을 가지고 있으나,

           관계형 데이터베이스는 외래 키를 통해 관계를 표현하며, 방향이 존재하지 않습니다.

           JPA는 객체 간의 상속과 다형성을 데이터베이스에서 표현할 수 있게 해줘, 객체 중심적으로 데이터베이스를

           다룰 수 있게 해줍니다.