++/CS

[TIL] CS공부 1일차

writtenbyrla 2024. 3. 5. 14:02

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

Call by reference는 함수 호출 방법 중 하나로 참조에 의한 호출이라고 합니다.
함수 호출 시 인수로 전달되는 변수의 값 주소를 참조하는 방식으로 별도 메모리를 사용하지 않고 주소만 참조하기 때문에 빠르다는 장점이 있으나, 호출된 함수에서 해당 값이 변경될 경우 원래 값에도 영향을 준다는 단점이 있습니다.

Call by reference와 달리 Call by value는 값에 의한 호출로, 값을 복사하여 처리하는 방식입니다. 원래 값이 보존될 수 있다는 장점이 있지만 복사로 인해 메모리 사용량 증가한다는 단점이 있습니다.

C언어에서는 포인터 변수(*)를 파라미터로 지정하고 함수 호출 시 주소연산자(&)를 이용해 매개변수의 주소값을 직접 넘겨 참조가 가능하지만, JAVA에서는 포인터를 이용하지 못하도록 막아 Call by Value 방식으로 값이나 주소를 복사하여 참조하는 방식으로 함수를 호출하는 것이 기본입니다.

 

 


 

 

 

 

OverrideOverload설명해 주실 수 있을까요?

한 마디로 Override는 상속받은 메서드의 내용을 변경하는 것이고, Overload는 같은 이름의 메서드를 새로 정의하는 것입니다.

Override는 덮어쓰다라는 의미로 JAVA에서 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 말합니다.
Override 시 메서드 내용만 새로 작성하므로 메서드명, 매개변수, 반환타입이 모두 같아야 하며, 따라서 두 메서드의 선언부가 일치해야 합니다.
Override가 성립하기 위해서는 세 가지 규칙이 존재하는데 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없고더 많은 예외를 선언할 수 없으며 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없습니다.

Overload는 한 클래스 내에 같은 이름을 가진 메서드가 있더라도 매개변수 타입이나 개수가 다르면 재정의해서 사용 가능하도록 하는 것으로 이를 메서드 오버로딩이라고 하며, 같은 이름을 유지하면서 비슷한 기능을 하는 메서드임을 예측 가능하게 한다는 장점이 있습니다.
사용 예시
Override
프로젝트에서 JWT와 Spring Security 인증 절차 로직을 구현하면서
JwtAutehnticationFilter에서 OncePerRequestFilter 추상 클래스를 상속받아 doFilterInternal 메서드를 오버라이드하고, UserDetailImpl에서 UserDetail 인터페이스를 상속받아 유저의 정보를 받아오는 메서드를 오버라이드하였습니다.

Overload
출력문에서 많이 사용하는 PrintStream 클래스의 println이 오버로딩이 적용된 대표적인 예시로,
메서드의 이름은 println으로 같으나 매개변수 타입을 다르게 정의하여 매개변수를 int, String 등 다른 형태로 넘겨도 똑같이 그 값이 출력되게 하는 것입니다.

 


 

 

 

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

JPA는 객체와 관계를 매핑하는 ORM 기술 표준으로 사용되는 인터페이스의 모음으로, 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크입니다. JPA는 애플리케이션과 JDBC 사이에서 동작하며 내부에서 JDBC API를 사용하여  SQL을 호출하고 데이터베이스와 통신합니다.

JPA를 사용하면 DDL문 생성, CRUD, SQL 작성 등을 개발자가 직접 하지 않아도 되기 때문에 생산성이 증가하며, 데이터베이스의 변경이 생기더라도 SQL을 모두 수정하지 않아도 되기 때문에 유지보수가 쉽습니다. 

하지만 자동으로 생성된 쿼리문으로 인해 성능저하가 발생하여 별도의 SQL문을 작성해야 하는 상황이 생길 수도 있으므로, 규모가 크고 복잡한 프로젝트의 경우는 JPA만을 사용하는 것이 어려울 수 있습니다.


실제로 mybatis 방식으로 학습할 당시 데이터베이스를 연결하는 mapper 작업을 하는데 시간이 많이 들고 조금이라도 오타가 날 경우 서버 자체가 구동이 안되는 어려움을 겪었습니다. JPA를 처음 사용할 당시에 mapper 작업과 SQL문 작성에 드는 시간을 절약할 수 있어 편리하였습니다.

하지만 최근에 한 프로젝트에서 JPA 방식으로 게시글 목록을 조회하는데 자동으로 생성된 쿼리문에서 N+1 문제가 발생하여 성능이 저하되었고 연관 관계에 있는 엔티티 테이블을 fetch join 하기 위해 별도의 SQL문을 작성해서 성능을 개선한 경험이 있습니다.

 

 

++ JPA를 사용할 때, 트랜잭션 어노테이션을 사용하는 이유?

보통 서비스 레이어에서 비즈니스 로직 처리 시 @Transactional 어노테이션을 사용하는데, 연산 중 오류가 발생하였을 때 ROLLBACK되어 데이터베이스에 반영하지 않기 위해 사용합니다.
예를 들어 계좌 송금하는 경우, 보내는 사람의 계좌에서 돈이 빠져나가고 받는 사람의 계좌에 그 금액만큼 돈이 추가되어야 합니다. 이 과정에서 오류가 생기게 되면 어느 한쪽에라도 변동 사항이 반영되지 않아야 하기 때문에 @Transactional 어노테이션을 사용한다고 볼 수 있습니다.

'++ > CS' 카테고리의 다른 글

[TIL] CS공부 5일차  (0) 2024.03.09
[TIL] CS공부 4일차  (0) 2024.03.08
[TIL] CS공부 3일차  (0) 2024.03.07
[TIL] CS공부 2일차  (0) 2024.03.06
주니어 자바 개발자를 위한 100가지 질문(1) - 기초  (0) 2023.12.20