Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원/4월

22. 04. 20 - this, 객체 배열, 인자 값 받는 메소드

giggs 2022. 4. 22. 21:15

 

 

this : 현재 객체를 의미

 

 

  • 클래스 변수 public String name; 선언해준 뒤
  • 클래스 함수 introduce( ){ } 안에 String name이라는 변수 사용해보기

 

 

 

컴파일 오류 없이 사용 가능한 점 Check !

 

 

 

 

- 멤버 변수 String name은 빨간 테두리 안에서 어디든지 갈 수 있고, 다 돌아다니는데

- 멤버 함수 introduce( ) 안에 똑같은 String name을 썼네?

 

 

> 근데 작동되네? why?

> 다른 공간이라서 그렇다. 넹?

> 파란색은 지역변수 - 

> 빨간색은 멤버 변수 -

> 클래스 변수 - 멤버 변수는heap메모리에 name이라는 애로 존재

> 빨간색 변수 - 지역변수는 stack메모리에 name이라는 애로 존재

> 별개의 영역에 존재하기 때문에 전혀 다른 것이다. 괜찮다!

 

 

 

this 

 

> 현재 해당 메소드가 속해있는 객체를 가리킨다.

> this생략이 가능하지만

> 지역변수와 인스턴스 변수 동시에 존재하면 지역변수가 우선순위가 더 높다.

 

 

> this를 사용한 16번Line 에서 지금 name 은 9 Line name을 가리킨다.

 

 

 

introduce() 함수 { } 안에있는 지역변수 name 이 아닌 - this. 해주면 - 클래스 변수 name을 가리킨다.

 

 

 

> this 자체가 현재 객체를 가리키는 것이므로!

> this (.) 하는 순간 객체를 가리키는 것으로 객체의 변수/함수 이런 식으로 가리킨다!

 

 

 

> this를 삭제한 16번Line –에서 지금 name 15Linename을 가리킨다.

 

 

 

똑같은 변수명일 경우에 - this 없으면 지역 변수가 우선 순위!

 

 

 

 

 

 

 

 

 

  • this를 붙여주는 것이 기본이고
  • 중복된 이름이 없다면 생략 가능 되긴하는데 안 되는 것이라고 생각하자
  • 마치 클래스 이름을 대문자로 시작해야 되지만 안 해도 되는 것처럼!!

 

 

---

 

 

Q. this가 현재 객체?

  • 자기자신(== 객체)
  • 철수야, 주문받아~~~ 명령하면 하는 이 동작은 메소드
  • 객체야, 메소드실행해~
  • 메소드 안의 this는? (주문받아 메서드 안에 this가 포함되어있으면 )
  • 철수가 해야 하는 동작 - 즉, 자기 자신이 해야 하는 동작을 의미

 

 

 

 

 

 

  • 메서드라는 것은 – 객체가 실행하는 것이므로
  • 객체에 종속되어있는 것이므로
  • 메소드 안에 this 가 있다면 현재 객체를 의미하는 것
  • 현재 객체라는 의미는 = 자기 자신 현재 그 메서드를 실행하는 자기 자신을 의미!

 

 

 

 

 


 

 

 

 

객체 배열

 

실습 시작

 

 

 

1. 세팅

- person.main 패키지에 PersonArrayMain 클래스 추가

 

 

 

2. 개념 세팅

  • 배열 : 여러 개의 데이터 관리하려고 등장 ( 같은 타입 )
  • 우리 반 30명 학생의 시험 점수( int로 가능 )
  • 우리 반 30명 학생의 정보( 이름, 나이)를 관리하고 싶다
  • 배열로 불가능(int30칸 String30칸 해서 매칭 시켜서 관리할 수도 있겠지만.. no! - 2개 별개의 데이터이다.
  • 구조체(java에는 없음) : 여러 개의 데이터 관리 등장 ( 타입 상관 X )
  • 기존의 구조체는 가지고 있는 데이터에 하나하나 접근해서 출력하던지 사용했어야 했다.
  • C의 구조체 단점을 보완-발전시킨 java에서 클래스 등장! ( data + method )
  • 클래스 : 여러 개의 데이터 + 메소드
  • 구조체의 데이터에 +기능!을 추가한 클래스 등장 ( 기능 == 동작 == 메소드)
  • 따라서 여러 개의 데이터 타입을 관리할 수 있고 기능도 사용할 수 있다.
  • - 객체 배열 : 여러 개의 객체를 관리하려고 등장( 같은 타입 )

 

 

 

3. 객체 배열 만들어 보기

 

 

1. 객체 만들기

  • Person p1 = new Person();
  • Person p2 = new Person();

 

 

2. 이름 대입 ( . name = " " ) 해주고 introduce( ); 자기소개해주기

 

 

 

3. 객체 배열 만들기 ( 5개의 Person타입 객체를 관리할 예정 )

 

 

- Person[] pArray = new Person[5];

  • Person객체를 관리할 5칸의 공간을 생성해서 -
  • 이 공간의 주소 값을 저장할 Person 배열 타입 변수 pArray에 주수 값 저장

 

- pArray[0] = new Person(); ---

  • Person 객체를 생성해서 - Person 타입 배열 저장 공간의 0번째 칸에 할당

 

 

 

 

 

이 부분 반복문으로 수정 가능하다== 훨씬 편하게 관리할 수 있다!

 

 

 

 

 

 

 

 

+@ for i < 5; 해주는 부분

  • 조건을 왜 < 5라고 하는지?
  • 5개 사용할 거라는 가독성 때문에
  • pArray.length = 5라는 것과 일치하기 때문에~

 

 

 

 


 

 

 

 

객체 배열 만드는 것은

  • int 배열 만드는 거랑 전~혀 다를 것이 없다
  • 다만 데이터 타입이 int가 아닌 내가 만든 클래스 타입이 온다는 점만 다르다~

 

 

 

 

 

배웠던 다차원 배열이랑 다를 것이 없다!

 

 

 

 

 

다차원 배열할 때는

  • 각 칸에는 어딘가에 존재하는 배열이 들어있었다.

 

객체 배열에서

  • 각 칸에는 어딘가에 존재하는 Person 객체가 들어있다~ ( +@ 배열도 객체였다! )

 

 

객체 배열 끝!

 

 

 

 


 

 

 

 

 

맥도날드 실습 시작!

  • 배운 내용 실습하면서 ( 객체 생성, 객체로 메소드 호출, this )
  • 인자 값을 받는 메소드 추가로 배워보기 

 

 

 

 

1. 기본 세팅

  • macdonald.main 패키지 – RunMcDonald 클래스 생성
  • macdonald.emp 패키지 - 직원 클래스 < 카운터, 주방, 배달 > 3개 클래스 생성
  • 카운터 직원 데이터와 메서드(기능) 입력 
  • 주방 직원 데이터와 메소드 입력 
  • 배달 직원 데이터와 메소드 입력

 

 


 

 

 

2. 객체 만들기

  • macdonald.main 패키지 - RunMcDonald 클래스에서 -

 

 

main 메소드안에 각각의 직원(객체) 생성

 

 

 


 

 

3. 주문 -> 요리 -> 배달 프로세스 만들기

 

카운터 직원이 주문받고, 주방 직원이 요리하고, 라이더 직원이 배달가는 기능 수행

 

 


 

4. 메소드 수정 – 카운터 직원 클래스의 order( ) 메소드, calc() 메소드

  • 사용자한테 입력받은 메뉴 만드는 것으로 수정
  • 사용자한테 입력받은 돈으로 받은 것으로 수정

 

18~19번 Line 과 26~28번 Line 체크!

 

 

 

+@ 스캐너 도구 생성 부분을 필드 부분에 하나만 써주기

 

 

 

> 메서드 내에서 만든 도구 사용 X, 필드에 있는 도구 사용

> 필드에 있는 sc변수를 사용해서 하려면 this.sc.nextLine() 처럼 사용하는 것이 정석이지만

> 누가 봐도 클래스 변수 인애들- 딱 봐도 지역변수로 안 만든다 판단되는 애들은 -

> this 생략해도 괜찮다. sc.nextLine() 해도 괜찮다.

 

 

 


 

 

5. 메소드 수정 2탄 - 카운터 직원 클래스 order( ) 메소드의 리턴 값 추가

  • CounterEmp 클래스의 order( ) 메소드 - 리턴 값 주도록 추가해주자.
  • 입력받은 메뉴를 리턴하도록 해주자
  • public String order() { return ham; }

 

 

15번 Line - void에서 String 으로 수정 // 20번 Line - return ham; 추가

 

 

 

+@ return ham;

  • 리턴해주면 햄버거 이름 “상하이” 문자열만 주는 것이다. 
  • 데이터만 주는 것이다. - 그릇의 이름인 ham을 리턴해주는 것이 아니다!
  • ham이라는 변수가 유지되는 것이 아니다!

 

 


 

 

6. counter01.order( ); 메소드 출력 Test

 

  • 이렇게 하면 메인 메소드에 counter01.order( ); 메소드는
  • 사용자가 입력한 햄버거의 이름을 반환해준다.

 

내가 입력한 "상하이"를 받아서 반환해준다!

 

 

 


 

 

 

7. String ham 변수에 담아주자

 

  • counter1.order( ) 메소드의 결과를 담을 String 타입 변수 ham을 만들어서 담아주자

 

 

 

  • couner1.order(); 의 리턴 값은 == "상하이" 
  • 내가 입력한 문자열만 반환해준다. 뒤에 있는 " 주문받았습니다~ " 는 전달 X

 

 


 

8. CookEmp 클래스 – cook( ) 메소드 수정

 

 

  • 현재 cook()는 입력받는 값, 반환하는 값이 없다.

수정 전 주방직원 클래스의 cook() 메소드

 

 

  • 입력받는 값 - 추가해 주자

String 타입 매개 변수 1개 받도록 수정!

 

 

 

  • main메소드에서 cook( ) 인자 값 추가

메인 메소드에서 cook( ) 메소드를 찾아갈 때 전달받은 " " 문자열 들고 찾아가도록 해줄 수 있다.

 

 

 


 

 

9. RiderEmp 클래스 – delivery () 메소드 수정

  • 똑같은 단계로 진행~
  • 입력받는 값 추가해주고 ( String ham )
  • main 메소드에서 delivery( ham );

 

 


 

 

10. 출력 Test 

 

  • 카운터 객체 counter1 이 고객에게 직접 입력 주문받은 문자열을 가지고 
  • 나머지 객체들의 메소드의 매개변수로 전달
  • 각 작업이 연결되어서 잘 수행됨을 확인!

 

 

 

 

 

 

 

 


 

 

 

 


review

this의 개념을 정확히 알 수 있어서 좋았다.
그동안 그냥 this는 그 객체다라고 사전적으로만 이해하고
사용하고 있었는데 this를 써주면
그 객체가 가지고 있는 { } 실행구역 안에 존재하는
지역변수가 아닌! 객체가 가지고있는
멤버 변수 / 멤버 함수를 의미하는 것이라고 이해했더니
코드를 이해하는 것이 더 용이해졌다.

객체 배열을 이해하는 부분에서는
배웠던 다차원 배열과 공통적인 부분을
예시로 들어 설명해주는 것이 이해하기 더 수월해서 좋았다.
 
마지막 실습을 통해 배운 내용을 다시 복습하고
인자 값을 받는 메소드를 만드는 방법도 해보았다.

아직까진 크게 어려운 부분이 없이 잘 따라가고 있다.
새로 알게 되는 내용이나 부족했던 개념 채워나가는 중!