본문 바로가기
수업 일지/JAVA

10일차 - [JAVA] do-while문/생성자/접근제한자/getter setter

by 쿠쿠씨 2022. 1. 12.
반응형

do-while문

 

형식: do {..실행문..} while(조건식);

먼저 do 중괄호 { } 내부를 실행하고 조건식이 true이면 다시 중괄호 내부를 반복 실행한다.

 

while문과 do-while문의 비교

while문: 조건식이 i<5일 때 실행문이 5번 실행된다.

do-while문: 조건식이 k<5일 때 실행문이 5번 실행된다.

while문: 조건식이 i>5일 때 실행문이 0번 실행된다.

do-while문: 조건식이 k>5일 때 실행문이 1번 실행된다.

 

while문은 조건식을 먼저 검사하고 참일 때 실행문이 실행된다.

do-while문은 조건식을 마지막에 검사하기 때문에 최소 1번은 실행문이 실행된다.

 

생성자

 

모든 클래스는 생성자가 반드시 존재한다.

생성자를 선언하지 않아도 컴파일러가 기본 생성자를 바이트 코드에 자동으로 추가한다.

생성자는 반환값은 없고 클래스 이름과 동일하다.

인자가 있을 수도 있고, 없을 수도 있다.

객체의 초기화를 담당한다.

생성자 메소드의 실행으로 객체가 만들어진다.

 

기본 생성자: 인자가 없는 형식의 생성자 ex.) MyClass1( )

커스텀 생성자: 필드값 초기화를 위해서 인자가 있는 형식의 생성자 ex.) MyClass1(int f1)

 

생성자 예제: MyClass1

9라인이 없다면 기본 생성자(MyClass1( ))를 호출해서 객체를 생성할 수 없다.

인자를 갖는 생성자에서는 인자를 입력하여 객체의 필드값을 초기화한다.

일반적으로 필드와 동일한 이름을 갖는 인자를 사용하기 때문에 이 경우 this를 사용한다.

this는 객체 자신의 참조이다. 'this.필드'는 this라는 참조 변수로 필드를 사용하는 것과 같다.

27라인 반환값이 없는 print() 메소드를 선언한다.

 

MyClass1Test

9라인 기본 생성자를 이용하여 객체를 생성한다.

11라인 Scanner 클래스는 기본 생성자 실행을 허용하지 않는다. → 인자가 필요하다.

12라인 String 클래스는 기본 생성자 실행을 허용한다.

14라인 MyClass1(int f1) 생성자를 이용하여 f1 필드를 초기화한다. cls2에 참조값 저장

16라인 출력 메소드로 출력해보면 f1 필드에 99가 저장되었다. 참조 타입인 f2, f3은 null로 출력

18라인 MyClass1(String f2) 생성자를 이용하여 f2 필드를 초기화한다.

19라인 3.14에 해당하는 인자의 형식이 없으므로 오류가 발생한다.

23라인 double형 배열 test를 선언하고 길이를 4로 한다.

24라인 MyClass1(double[] f3) 생성자를 이용하여 f3 필드를 초기화한다.

26라인 f3 값을 출력해보면 해시태그([D@372f7a8d)가 출력된다.

28라인 MyClass1(int f1, String f2, double[] f3) 생성자를 이용하여 f1, f2, f3 필드를 초기화한다.

29라인 출력한 값을 보면 f3 필드의 출력 값이 26라인에서의 출력값과 같다. 

32라인 cls4가 참조하는 f3[2] 필드의 값을 변경한다.

33라인 cls5가 참조하는 f3[2] 필드의 값이 변경한 값으로 출력된다.

 → cls4와 cls5가 참조하는 f3필드의 주소가 같기 때문에 변경한 값으로 출력된다.

34라인 cls5.f3[0]의 값은 초기화하지 않았기 때문에 0.0이 출력된다.

 

접근 제한자

 

public 접근 제한

→ 모든 패키지에서 즉, 어디서나 생성자를 호출하고 필드, 메소드를 사용할 수 있다.

→ 선언할 때 앞에 public을 작성한다. 

 

private 접근 제한

→ 오직 같은 클래스 내에서만 생성자를 호출하고 필드, 메소드를 사용할 수 있다.

→ 선언할 때 앞에 private를 작성한다.

 

protected 접근 제한

→ 같은 패키지 내에서는 생성자 호출과 필드, 메소드 사용에 제한이 없지만

  패키지가 다르다면 자식(상속 받은) 클래스에서만 생성자를 호출하고 필드, 메소드를 사용할 수 있다.

→ 선언할 때 앞에 protected를 작성한다.

 

default 접근 제한

→ 같은 패키지 내에서는 아무런 제한 없이 생성자 호출하고 필드, 메소드를 사용할 수 있다.

  다른 패키지에서는 생성자 호출과 필드, 메소드 사용이 불가능 하다.

→ 앞에 아무것도 작성하지 않는다면 default 접근 제한을 가진다.

 

Setter와 Getter 메소드

 

private 접근 제한을 하는 이유는 외부의 다른 클래스에서 이 필드를 직접 변경/사용을 못하게 하기 위해서이다.

Setter 메소드를 이용하여 객체의 필드값을 저장하고, Getter 메소드를 이용하여 필드값을 반환한다.

Setter 메소드는 반환값 형식은 없고 인자가 있다(형식은 필드의 타입). 이름은 set+필드이름(첫 글자는 대문자)이다.

Getter 메소드는 반환값 형식(필드의 타입)이 있고 인자가 없다.

 이름은 get+필드이름(첫 글자는 대문자)이고 boolean형의 경우 is+필드이름(첫 글자는 대문자)이다.

이클립스에서 필드 선언 후 우클릭 → Source → Generate Getters and Setters 메뉴를 이용하여

Setter와 Gertter 메소드를 자동 생성할 수 있다.

5,7라인 private 접근 제한을 갖는 int형 변수 age, String클래스 변수 name을 선언한다.

10라인 int형 필드 age 값을 받아 저장하는 setAge( )를 선언한다.

14라인 String 클래스 필드 name 값을 받아 저장하는 setName( )을 선언한다.

18라인 setAge( )로 받은 age 값을 반환하는 getAge( )를 선언한다.

22라인 setName( )로 받은 name 값을 반환하는 getName( )를 선언한다.

27라인 출력문이 있는 print() 메소드를 선언한다.

 

7라인 MyClass3 객체를 생성한다.

8라인 setter 메소드를 이용하여 age에 19를 저장한다.

9라인 MyClass3에 있는 print() 메소드를 호출한다.

10라인 변수 age를 선언하고 getter 메소드로 반환 받은 값을 입력한다.

11라인 age 값을 출력한다.

13라인 객체 필드에 직접 값을 입력하는 방법은 사용하지 않는다. 

 

연습 문제: 숫자 맞추기 게임2

 

문제: 9일차의 숫자 맞추기 게임을 클래스를 활용하여 만듭니다.

NumberGame클래스

11라인 참가자의 이름을 받아 초기값을 설정하는 커스텀 생성자를 선언한다.

16라인 결과를 출력할 print() 메소드를 선언한다.

21~23라인 난수 값을 반환할 makeNumber() 메소드를 선언한다.

 → 난수의 최소값, 최대값을 받아 .nextInt(max-min+1)+min을 반환한다.(min~max 범위의 난수 만드는 식)

필드의 getter와 setter 메소드를 선언한다.

 

NumberGameStart 클래스

10라인 게임 기록을 저장할 result 배열을 선언하고 길이를 5로 한다.

11라인 게임 횟수를 저장할 변수 k를 선언하고 0으로 초기화한다.

16라인 참가자의 이름을 변수 gamer에 저장한다.

18라인 do-while 문을 이용하여 사용자의 입력에 따라 게임을 반복할 수 있게 한다.

19라인 생성자를 호출하여 gamer 값을 저장하고 NumberGame 객체를 생성한다.

22라인 makeNumber 메소드를 입력하여 난수 범위를 결정한다.

25라인 do-while문을 한 번 더 이용하여 정답을 맞출 때까지 반복한다.

27라인 입력한 값을 numbers 배열에 저장한다.

28,29라인 난수가 입력값보다 크다면 "아닙니다. 더 큰 값입니다."를 출력한다.  

30,31라인 난수가 입력값보다 작다면 "아닙니다. 더 작은 값입니다."를 출력한다. 

32,33라인 정답이라면 setter메소드를 이용하여 isSucess 필드에 true를 저장한다.

35라인 i=10 즉 10번 동안 못 맞출 경우 반복문을 종료한다.

37라인 !isSuccess가 false면(정답을 맞췄다면) 반복문을 종료한다. 

40라인 시도한 횟수 i를 setter 메소드로 count에 저장한다.

41~44라인 정답을 맞췄다면 지금까지 시도한 숫자들을 출력한다.

45라인 숫자들 사이에 ,(쉼표)를 출력하고 마지막에는 출력하지 않기 위한 삼항 연산자이다.

47라인 정답을 맞추기 까지 시도한 횟수를 getter 메소드를 이용하여 출력한다.

48~50라인 정답을 못 맞췄다면 정답을 출력한다.

52,53라인 result 배열에 게임 정보를 저장하고 k값을 1 증가시킨다.

54라인 게임 5번이 끝났다면 while문을 종료한다.

56라인 사용자가 0을 입력하면 게임을 반복한다.

59~60라인 for문과 print()메소드를 이용하여 게임을 실행한 결과를 출력한다.

 

결과

 

반응형

댓글