코드 그라데이션

<보충> Day19. Has 관계 두 번째 예제 설명 슬라이드 파보기 본문

Java/Mega

<보충> Day19. Has 관계 두 번째 예제 설명 슬라이드 파보기

완벽한 장면 2023. 4. 25. 00:22

230411

HasTest2

package mega.backend_onemore.Day19.HT2;

class B {

}

class C {

  B[] b = new B[5]; //멤버변수 has 관계 (변수만 있으면 Has관계 가능하다)
  // 그러면 당연히 배열도 가능한 것이다.

}

class D {

  //has 관계?? 아니다!
  // 멤버변수로 갖는 거랑 메서드로 부르는 거랑 차이가 있으므로
  // 내가 실제로 가지고 있어야 한다.
  B make(B[] b) {
    b[2] = new B();
    return b[2];
  }
}


class E {

  D[][] d = new D[3][3];

  /*
  D[][] sendD(D[][][] d, int i, int j, int k) {
    return d[0];
    // 자료형으로 받고 싶은 만큼 뒤에서부터 소거(->리턴 부분에 적어준다)
  }
   */
  D[] sendD(D[][] d, int i, int j) {
    d[i][j] = new D();
    return d[i];
  }


  public class HasTest2 {

    public static void main(String[] args) {


      C c = new C();
      D d = new D();
      D[][] d1 = new D[3][3];

      B b = d.make(c.b);
      E e = new E();

      e.sendD(d1, 2, 0);
      // 이렇게 해주면 d[0][2]에만 객체가 있는 것이고 나머지에는 없는 것.

      // d1[2][0]은 객체가 있을까요 없을까요?
      // 있다 => d1 배열에 인덱스로 2,0에 매개변수로 넣어서 객체를 만들어줬으니까.
      // 그럼 d1[0][2]에는?
      // 없다!

      // 다시
      /*
      e.sendD(d1, 0, 2); 여기서 d1이 넘어가면 D[3][3]; 이게 넘어간 것이다.
      d1은 2차원 배열
      그리고 그 속에 있는 0행 2열에 객체 만들어 넣은 것*함수콜 의의
      그럼 뒤에 3열은 남겨놓고 앞에 3열은 먼저 가있는 상태가 되겠지.

      D[] d2 = e.sendD(d1, 0, 2);에서 객체에 있는 것을 출력하려면 어떻게 해야 되냐?
      일단 i를 보냈으니까 d[0] 보낸 것.
      d2[2]; 하면 된다.
      지금 d2가 d[0]으로 치환된 것.
       */
    }
  }
}

 

관련된 설명

 

오른쪽 코드부터 보면

d1은 2차원 배열이고

sendD가 뭔지는 모르겠지만, 의 리턴 결과가 1차원 배열이다.

인자로 2차원 배열을 넘기면 결과로 1차원 배열을 주는 애.

 

그리고 왼쪽 코드를 보니까, sendD()에서는 2차원 배열을 그대로 받았다.

그리고 그것의 [0][2] 즉 첫 번째 행의 세 번째 열 // 여기에 객체를 만든 것.

그래서 빨간색으로 0,2에 D가 생겨있음.

 

지금 전부 자료형이 클래스 타입(참조형)이니까, d1만 했을 때는 9개의 칸이 모두 null

 

그럼 sendD에서 하는 일을 보니까, i와 j를 받아서 그 행과 열에 새로운 객체를 꽂아주는 것을 함.

 

그런데 여기서 주의

2차원 배열이니까 대괄호 2개를 쓰면 하나의 원소를 의미한다.

그런데 리턴값에서 대괄호 하나만 썼지.(d[0])

이것의 의미는??

- 1개의 행!!!

 

1개의 행이란?

=> 하나의 행에는 여러 열들이 있지.

즉, 1차원 배열! 을 의미

(d1이 2차원 배열일 때만 가능한 이야기이다.)

즉, return으로 d에 1행을 반환한다는 이야기(인덱스 차이 주의)

 

오른쪽에서 d2라고 해도, d2는 변수명일 뿐이고, d2에 첫 번째 행이 담긴 것!!!

앞서 말한 것처럼 첫 번째 행은 1차원 배열이니까, 

1차원 배열에게 세 번째 칸(인덱스: 2)이 null인지 묻고 있는 것.

여기서는 newD() 해줬으니까 null 이 아니므로 else에 걸리겠지.

그래서 "객체가 있습니다" 가 출력된다.

 

 

 

 

728x90
Comments