인프런 커뮤니티 질문&답변

동민님의 프로필 이미지
동민

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

메소드에 객체형(?) 변수 넣는 것이 잘 이해가 가지 않습니다.

해결된 질문

작성

·

1.4K

0

함수형 인터페이스(전반전) 강의를 듣는 도중

pulbic static void convertUSD(Convertible converter, int USD) {

converter.convert(USD); }

메소드가 어떤식으로 동작되는지 궁금합니다.

 

추가로 클래스를 생성하고 객체 생성 후 객체를 어떠한 메소드의 변수로 넣었을 때 어떤 식으로 동작되는지 어떨때 사용하는지 예시로 알려주신다면 정말 감사합니다..

답변 1

0

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?
기본 자료형과 참조 자료형에 대한 이해가 필요합니다. 다음과 같이 코드를 작성하게 되면 변수 a는 1이라는 값을, b도 1이라는 값을 가집니다.

int a = 1;
int b = a;

이때 아래 문장을 실행하면 a, b 의 값은 어떻게 될까요?

a = 2;

값을 출력해보면 a는 2을, b는 1을 갖게 됩니다.

System.out.println(a); // 2
System.out.println(b); // 1

a의 값은 2로 변경하지만 b는 영향을 받지 않게 되지요. 기본 자료형은 이렇게 서로 독립적인 값을 가지고 있습니다.

반면에 참조 자료형은 아래 클래스를 예로 들어볼게요.

class Point {
    int p;
}

다음과 같이 코드를 작성해 보겠습니다.

Point p1 = new Point();
p1.p = 1;

Point p2 = p1;

그리고 출력을 해볼게요.

System.out.println(p1.p); // 1
System.out.println(p2.p); // 1

그랬더니 모두 1이라는 값을 출력하네요.

이때 아래 문장을 실행하면 p1.p 와 p2.p 의 값은 어떻게 될까요?

p1.p = 2;

결과를 확인해보겠습니다.

System.out.println(p1.p); // 2
System.out.println(p2.p); // 2

분명 p1.p 만 바꿨을 뿐인데 p2.p 도 2라고 출력이 되네요.
참조 자료형은 손가락으로 가리킨다고 이해하시면 좋습니다.

Point p1 = new Point();

라는 문장에 의해 p1 은 새로운 Point 객체가 만들어진 곳을 가리키게 됩니다.

Point p2 = p1;

라는 문장에 의해 p2 는 p1 이 가리키는 것을 가리키게 됩니다. 즉 p1 과 p2 는 동일한 곳을 가리키게 되는 것이죠.

p1 과 p2 를 각각 학생이라고 해볼까요? 그리고 p1 과 p2 가 가리키는 곳이 칠판이라고 해보겠습니다. 칠판에 1이라는 숫자가 써져 있었는데, p1 학생이 1을 지우고 2로 바꾸게 되면 어떻게 될까요? 칠판에는 더 이상 1을 찾아볼 수 없게 되고 2만 남게 됩니다. p1 과 p2 는 같은 칠판을 가리키고 있었으므로 이들이 가리키는 칠판에 써져 있는 값은 모두 2가 됩니다. 같은 곳을 가리키고 있었거든요.

이때 p3 이라는 새로운 학생이 나타나서 p1 이 가리키는 칠판을 똑같이 가리킨다고 해보겠습니다. 그런 다음에 p3 학생이 칠판에 써져 있는 숫자 2를 지우고 3을 쓰겠습니다. 그러면 p1 과 p2 입장에서는 칠판의 숫자가 3으로 바껴있는 걸 확인할 수 있겠죠. 모두 같은 칠판을 가리키고 있었으니까요.

이게 바로 참조 자료형입니다. 참조는 값을 직접 가지는 것이 아니라 다른 누군가가 가리키는 곳을 동일하게 가리키기 때문에 다른 누군가가 값을 바꾸면 자기 자신도 영향을 받게 됩니다. 그리고 메소드에 참조 변수를 전달하고 메소드 내에서 이를 전달받아 사용한다는 것은 p3 와 같이 그냥 새로운 참조 변수를 하나 만들어서 같은 곳을 참조하는 것과 다를 바가 없습니다.

그래서 아래 문장에서 p2 가 p1 이 가리키는 곳을 참조한다면,

Point p1 = new Point();
p1.p = 1;

Point p2 = p1;

아래 문장에서는 p3 가 p1 이 가리키는 곳을 참조합니다.

public static void main_메소드() {
    Point p1 = new Point();
    p1.p = 1;

    어떤_메소드(p1);
}

public static void 어떤_메소드(Point p3) {
    ...
}

지금까지 드린 설명을 코드로 적어보도록 할게요.

public static void main(String[] args) {
    Point p1 = new Point();
    p1.p = 1;

    Point p2 = p1;

    System.out.println(p1.p); // 1
    System.out.println(p2.p); // 1

    p1.p = 2;

    System.out.println(p1.p); // 2
    System.out.println(p2.p); // 2

    어떤_메소드(p1); // p1 이 가리키는 칠판을 p3 도 가리키기 (메소드 내 동작 체크)

    System.out.println(p1.p); // 3
    System.out.println(p2.p); // 3
}

public static void 어떤_메소드(Point p3) {
    p3.p = 3; // p3 이 가리키는 칠판에 2 지우고 3 쓰기
}

주석의 설명과 함께 하나씩 따라 읽어보시면 이해에 도움되실거에요 😊
감사합니다.

동민님의 프로필 이미지
동민

작성한 질문수

질문하기