코드 그라데이션

Day19. HasTest2(Has관계) 두 번째 예제 설명 본문

Java/Mega

Day19. HasTest2(Has관계) 두 번째 예제 설명

완벽한 장면 2023. 4. 8. 19:03

// 주석참고!!!

package megait.backend_lecture.Day19;

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]으로 치환된 것.
       */
    }
  }
}

 

헷갈리는 부분, 

다차원 배열의 자료형을 어떻게 체크할 것인가에 대한 고민.

 

가장 뒤에 것 배열 기준으로, 딱 하나만 가지고 남은 것을 보자. 이 배열이 의미하는 건 

앞에 있는 것들이 여러 개 있다는 소리죠.

 

예)

int[] 이면

[] 하나 빼면, int 남잖아. "아 정수가 여러 개구나.

 

int[][] 이면

[] 하나 빼면 int[] 남잖아. 아 자료형은 int배열이구나.

 

그럼 이제 리턴값과 자료형은 어떻게 구분을 하냐.

이부분이 가장 헷갈렸던 것 같다.

 

그냥 단순하게 이런 코드가 있다고 하면

 

int[ ] array = sendD(int[ ][ ] d)

return d[0]

이러한 상황에서

array라는 2차원 배열에게는

array[0] 을 해야 이게 1차원 배열이 되지(빨간색 사각형 배열)

그래서 이 빨간 사각형만 똑 떼서 준 것이다.

 

그럼 받는 사람 입장에서는 d[0] 이라는건 sendD() 안에서의 일이지

그냥 int[ ] 로 받는 것이거든요.

그럼 받는 사람의 입장에서는 빨간 사각형 배열만 존재하는 것(다른 전체 2차원 배열은 없다.)

 

그니까 주는 사람의 입장에서는 많고 많은 배열 중에 빨간 사각형 배열 부분만 주는 것이고

(return 값이겠지)

받는 사람의 입장에서는 빨간 사각형 배열이 세상의 전부이다.

 

따라서 줄 때는 내 꺼 많고 많은데 그중에 첫번째꺼 줄게(빨간 사각형 배열)

받을 때는 자기가 받은 게 세상의 전부니까 1차원 배열(only 빨간 사각형 배열 단 하나) 밖에 모르는 것이다.

 

그래서 받아서 사용하면, 1차원 배열인 것처럼 써야한다.

 

그럼 결론적으로 리턴 값과 실제 받아서 사용하는 값은 다른 게 된다!!!!!

 

코드로 정리하면

int[] test(int[][] d) {
	return d[0];   // 이건 하나의 정수 배열 (주는 값)
}    

void test2() {
	int[] result = test(new int[][] d) 
    
    return[0]; // 이건 하나의 정수 (실제 받아서 쓰는 값)
}

 

그래서 위는 배열에 담을 수 있고, 

아래는 int에 담을 수 있다.

int[] test(int[][] d) {
	int[] re = d[0];  
}    

void test2() {
	int[] result = test(new int[][] d) 
    
    int re = return[0]; 
   
}

조금 짜치는 감은 있지만 요런 식으로...

 

마지막 정리

int[] test(int[][] d) {
	return d[0];   // 이건 하나의 정수 배열 (주는 값)
}    

void test2() {
	int[] result = test(new int[][] d) 
    
    return[0]; // 이건 하나의 정수 (실제 받아서 쓰는 값)
}

지금 이 상황에서 d[0]은 result와 같다.

(리턴 받은 걸 그대로 쓰는 것이니까)

 

d[ ] -> result 이런 상황이지

그럼 result에 괄호를 또 붙이면(result[ ])?

d[ ][ ] 와 똑같다는 것.

 

그래서 위에 것을 하나의 정수로 바꿔주고 싶다면

int[] test(int[][] d) {
	return d[0][0];   // 이건 하나의 정수로 바뀜...!!!
}    

void test2() {
	int[] result = test(new int[][] d) 
    
    return[0]; // 이건 하나의 정수 (실제 받아서 쓰는 값)
}

 

 

-----------------------

다시 hasTest2 조금 더 보면

class B {

}

class C {

  B[] b = new B[5]; 

}

class D {

  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) {
    d[i][j] = new D();
    return d[i];
  }


  public class HasTest2 {

    public static void main(String[] args) {


      C c = new C();
      // 따라가보면
      /*
      C는 B 배열까지 가지고 있는 것은 맞다.
      그런데 이 상태에서는 각각의 칸에 객체는 없는 것.
      */
      D d = new D();
      D[][] d1 = new D[3][3];

      B b = d.make(c.b);
      // b의 3번째 칸에만 객체를 만들어서 쏙 넣어줬다는 소리, 나머지는 비어있고.
      E e = new E();

      e.sendD(d1, 0, 2);

    }
  }
}

728x90

'Java > Mega' 카테고리의 다른 글

Day16. HasTest 보충  (0) 2023.04.09
Day16 makeB() 자료 보충공부  (0) 2023.04.08
Day19. 문방구 퀴즈 <제품 구매> 공통 코드  (0) 2023.04.08
Has 관계 예제  (0) 2023.04.05
Day16 (2). 생성자(2), HAS 관계  (0) 2023.04.05
Comments