[기술면접 대비] Call by reference란 무엇이고, 보통 어떻게 쓰이나요?

김엄지·2024년 4월 4일
0

기술면접

목록 보기
1/4

[ 공부 목표 ]

  • 대답은 간단하게, 지식 습득은 깊이있게
    - 가능하다면 짧고 간결하게 대답하자.
    - 세부적인 지식에 대한 꼬리질문의 가능성을 생각해 깊이 있게 공부하자.
  • 음성메모를 활용하기
    - 두괄식으로 말하자.
    - 어떤 내용이나 주장이 분명하게 전달이 되었는지 확인하자.
    - 이해한 것을 바탕으로 자연스럽게 설명하는 연습을 하자.
    - 목소리의 강도, 발음 등 개선점 찾자.

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

  • 함수 호출 방식 중 하나로, 메모리 주소를 전달하여 값이 아닌 변수의 참조를 전달하는 방식입니다.
  • 인자로 전달된 변수의 원본 값을 변경할 수 있도록 합니다.
  • 대표적으로 call by reference가 사용되는 경우로 3가지가 있습니다.
    1) 함수 내부에서 여러 개의 값을 반환해야 할 때
    2) 함수 호출 시 매우 큰 데이터 구조를 전달해야 할 때
    3) 전역 변수를 변경하거나 수정해야 할 때가 있습니다.
    .
  • (C++, Java, Python 등의 언어에서는 일반적으로 주소를 사용하여 call by reference를 구현합니다. 이를 통해 함수가 호출될 때 해당 변수의 원본이 직접 수정될 수 있습니다)

✅ Call by reference

참조에 의한 호출을 의미한다.
함수가 호출될 때,

  • 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다. 함수가 종료되는 해당 공간은 사라진다.
  • 메모리 주소를 전달하여 값이 아닌 변수의 참조를 전달하는 방식이다.
  • 인자로 전달되는 변수의 레퍼런스를 전달한다.
  • 따라서 함수 안에서 인자의 값이 변경되면, 아규먼트로 전달된 객체의 값도 함께 변경된다.
  • 예시) 메모장 원본바로가기를 만들어보면, 원본을 수정하면 바로가기 파일도 수정이 되어있다.

✅ Call by value

값에 의한 호출을 의미한다.
함수가 호출될 때,

  • 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다. 함수가 종료되면 해당 공간은 사라진다.
  • 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다. (해당 변수를 가르킨다.)
  • 복사된 인자는 함수 안에서 지역적으로 사용되는 local value의 특성을 가진다.
  • 따라서 함수 안에서 인자의 값이 변경되어도, 외부의 변수의 값은 변경되지 않는다.
  • 예시) 메모장 원본복사하면, 원본을 수정해도 복사된 파일은 수정되어 있지 않다.

✅ Java의 경우,

함수에 전달되는 인자의 데이터 타입에 따라서 함수 호출 방식이 달라진다.

원시 자료형(primitive type) : Call by value로 동작

데이터를 저장하기 위해 사용되는 자료형을 의미하며 변수에 “실제 값”을 가지는 것을 의미한다.

  • 고정된 저장 공간을 차지하는 데이터이다.
  • 기본 데이터형이라고도 한다.
  • 종류는 총 8가지가 있다.
    • 정수형(byte, int, short, long)
    • 문자열(char)
    • 부동소수점(Float, Double)
    • 논리형(boolean)

참조 자료형(reference type) : Call by reference로 동작

실제 값을 갖는것이 아닌 데이터가 저장된 메모리의 “주소 값”을 가지는 자료형이며, 해당 값은 객체를 참조하는 변수 타입을 의미한다.

  • 기본 자료형을 기초로 만들어진 자료형이다.

  • 기본 자료형과 달리 메서드를 가질 수 있다.

  • 기본값은null이니, 참조형 객체가 초기화되지 않으면 nullPointerException이 발생한다.

    • 클래스 Class(String, ArrayList, HashMap, HashSet, LinkedList, Stack)
    • 인터페이스 Interface(Queue)
    • 열거형 Enum
  • Object
    모든 ClassEnumObject 클래스를 상속한다. 다시말해 Object는 모든 Class와 Enum의 일반화된 타입이다.

  • String
    char의 배열로 구현된 참조 자료형이다.
    Java가 String형을 따로 제공하는 이유는 문자열에 유용한 메서드를 제공하기 위해서이다.

    • charAt, concat, equals, indexOf, split와 같은 메서드를 이용하면 문자열을 쉽게 조작할 수 있다.
  • Wrapper 클래스
    Wrapper Class는 기본 자료형을 감싼 클래스이다.
    기본 자료형을 ‘객체(Object)’로 다루기 위해서 비 객체를 객체화 시키는 클래스로 “기본타입의 객체화”를 의미한다.

    • 대표적으로 Byte, Short, Integer, Long, Float, Double, Character, Boolean이 있다.
      기본 자료형을 클래스로 랩핑하여 유용한 메서드를 제공하기 위해서 이다.
  • 더 중요한 이유는 제네릭에 있다. 제네릭에 사용된 매개변수 TObject 자료형만 받을 수 있다. 다시 말해 클래스로 정의된 객체만을 전달받는다는 것이다. 참고 자료에 의하면, 코드를 짜다보면 제네릭을 기본 자료형에 적용해야 하는 경우에, Wrapper Class를 이용하면 문제가 해소된다고 한다.

    즉, 제네릭을 통한 유연한 프로그래밍을 기본 자료형에서도 적용할 수 있게 하기 위해 Wrapper Class를 제공한다고 생각하면 이해하기 쉬울 것이다.

Java에서 객체 참조를 통한 Call by reference 예시

public class CallByReferenceExample {

    // 객체의 속성을 변경하는 메서드 changeValue
    // MyObject 객체를 인자로 받아 해당 객체의 value 속성을 변경합니다. 
    public static void changeValue(MyObject obj) {
        obj.setValue(100);
    }

		// main 메서드에서 obj 객체를 생성하고, 이를 changeValue 메서드에 전달합니다.
    public static void main(String[] args) {
        MyObject obj = new MyObject(10);
        System.out.println("Before: " + obj.getValue()); // 출력 결과: Before: 10

        // 참조를 통해 객체의 속성을 변경
        changeValue(obj);
        System.out.println("After: " + obj.getValue()); // 출력 결과: After: 100
    }
}

// MyObject 클래스는 value라는 private 속성을 가지고 있습니다. 
class MyObject {
    private int value;

    public MyObject(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}
// 객체의 참조가 전달되므로 changeValue 메서드에서 value 속성을 변경하면 main 메서드에서도 변경된 값을 확인할 수 있습니다.

마무리

추가적으로 Wrapper 클래스에 대해서 자세하게 알아보자.


참고자료

profile
나만의 무언가를 가진 프로그래머가 되자

0개의 댓글