튜터링 4일 차가 되었다 객체의 치환, 객체 배열, 메서드 , 접근 지정자 , static , final을 배웠다.
C++과 비슷한 부분이 많이 있지만 완전히 C++개념으로 이해하려다 보니 실수를 해서 오해했던 부분들이 있었다.
그럼에도 C++에서 객체에 대한 내용들을 배우고 자바를 배우니 확실히 이해하는데 많은 도움이 되고 있다.
※ 목차
▷메서드
▷과제
- 지난주 과제 보완
package Tutoring;
import java.util.Scanner;
public class Radom_num_game {
public static void main(String[] args) {
while (true) {
Scanner scanner = new Scanner(System.in);
int random_Num = (int) (Math.random() * 1000 + 1); // Math함수의 랜덤을 이용한 랜덤숫자 뽑기(1~1000)
int input_Num = 0; // 입력 숫자
int min_Num = 1; // 범위 최소값
int max_Num = 1000; // 범위 쵀대값
int count = 1; // 입력한 숫자 개수
char ans; // 계속,종료 답 저장할 변수
System.out.println("수를 결정하였습니다.맞추어 보세요.\n1~1000");
while (true) {
System.out.print(count + ">>");
try {
input_Num = scanner.nextInt(); // 입력숫자 입력
while (input_Num < min_Num || input_Num > max_Num) { // 입력숫자 범위를 벗어난 경우 실행
System.out.println("범위를 벗어났습니다.\n다시입력해주세요.");
System.out.print(count + ">>");
input_Num = scanner.nextInt();
}
} catch (java.util.InputMismatchException e) { // 문자를 잘못 입력시 실행
System.out.println("잘못 입력했습니다.");
break;
}
count++; // 입력된 숫자 개수 증가
if (input_Num == random_Num) { // 랜덤숫자와 입력숫자와 같은 경우
System.out.println("맞았습니다.");
while (true) {
System.out.print("다시하시겠습니까(y/n)>>");
ans = scanner.next().charAt(0); // 문자 1개를 입력받는 방법
if (ans == 'y') { // 게임 재시작
System.out.println("게임을 계속진행합니다.");
break;
} else if (ans == 'n') { // 게임 종료
System.out.println("종료합니다.");
scanner.close();
System.exit(0); // 프로그램 종료
} else { // y,n이 아닌경우
System.out.println("다시 입력해주세요.");
continue; // 잘못 입력한 경우 무한반복
}
}
if (ans == 'y') // 게임을 계속 진행
break; // 진행중인 게임을 종료하고 재시작
// 범위 초과 숫자 입력시 오류작동
} else if (input_Num > random_Num) { // 랜덤숫자가 입력숫자 보다 작은 경우
max_Num = input_Num; // 범위 최대값에 입력숫자 저장
System.out.println("더 낮은 수를 입력하세요 ");
System.out.println(min_Num + "~" + max_Num);
} else { // 랜덤숫자가 입력숫자 보다 큰 경우
min_Num = input_Num; // 범위 최소값에 입력숫자 저장
System.out.println("더 높은 수를 입력하세요 ");
System.out.println(min_Num + "~" + max_Num);
}
}
}
}
}
저번 주 과제에서 입력을 하다가 문자를 입력하면 오류가 나고 max_Num 이상의 숫자와 min_Num 이하의 숫자를 입력해도 게임이 이어져 나가는 오류가 발생해서 수정했다.
- 객체의 치환
객체의 치환은 말 그대로 객체를 치환하는 것이다.
Circle c1 = new Circle(1);
Circle c2;
c2 = c1; //객체 치환
객체 레퍼런스를 선언 후 객체를 입력시키면 된다.
- 객체 배열
int [] a;
a = new int[5];
for(int i=0; i<a.length; i++)
a[i] = new int(i); //배열에 데이터 저장
//우리가 주로 쓰던 배열과 형태는 같다.
Circle [] c; //클래스 레퍼런스 선언
c = new Circle[5]; //객체화
for(int i=0; i<c.length; i++)
c[i] = new Circle(i); //객체배열에 데이터 저장
기본 자료형으로 배열을 만들 수 있듯이 클래스 객체도 배열로 사용 가능하다.
- 메서드
C/C++에서 배운 함수 , 멤버 함수와 같다.
접근지정자 반환형 메서드이름(매개변수){
함수 내용
}
위와 같은 형식으로 사용된다.
- 접근 지정자
접근 지정자는 자바에서 public , protected , default , private 이 있다.
package P;
class A{
void f(){
B b = new B(); //B는 public이므로 접근 가능하다.
C c = new C(); //C는 default접근자 이므로 다른 패키지에서 접근 불가
}
}
package Q;
public class B{
...
}
class C{
void g(){ //B는 public이므로 접근 가능하다.
B b = new B();
}
}
class D{
void h(){ //C는 default접근자이지만 같은 클래스 내부에 있으므로 접근 가능하다
C = new C();
}
}
private class E{
...
}
public static void main(String args[]){
E e = new E(); //E는 private이므로 외부에서 접근이 불가능하다.
}
private = 외부에서 접근할 수 없고 내부에서만 접근 가능하다.
default = 동일 패키지 + 자식 클래스에서 접근 가능
protected = 동일 패키지만 접근 가능
public = 모든 클래스에서 접근 가능 (자유로움)
- static
static 간략히 설명하자면 static을 선언 시 공유 가능하다.
큰 특징으로는
- static → static은 서로 접근이 가능하다.
- static → nonstatic은 서로 접근이 불가능하다.
- nonstatic → nonstatic은 서로 접근이 가능하다.
- nonstatic → static은 서로 접근이 가능하다.
- static 메서드 내부에는 this사용이 불가능하다.
- final
final은 메서드 , 클래스 , 필드를 상수화를 시키는 것이다.
final class FinalClass {
...
}
final public void FinalClass {
...
}
final int a = 3;
final의 특징으로는 상속이 불가능하고 오버 라이딩이 불가능하다.
- 과제
import java.util.Scanner;
class Person{ //참여할 사람 이름저장할 클래스
private String name; // 이름 저장할 필드
public void insert_name(String name) { //입력받은 이름을 저장하는 함수
this.name = name;
}
public String Return_Name() { //저장된 이름 반환하는 함수
return this.name;
}
}
public class WordGameApp {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
System.out.println("끝말잇기 게임을 시작합니다...");
System.out.print("게임에 참가하는 인원은 몇 명입니까>>");
int num_P = sc.nextInt(); //참여자 수 입력
Person []Per_Arr = new Person[num_P]; //참여자 이름을 저장할 객체배열 생성
for(int i=0;i<num_P;i++) {
Per_Arr[i] = new Person(); //객체배열 초기화
}
for(int i=0;i<num_P;i++) { //입력받은 이름을 Person클래스에 객체별로 저장
System.out.print("참여자의 이름을 입력하세요>>");
String name= sc.next();
Per_Arr[i].insert_name(name);
}
//게임시작!!
System.out.println("시작하는 단어는 아버지입니다");
int next=0;
String word = "아버지"; //게임 시작단어
while(true) { //게임참여자가 질때까지 실행
int lastIndex = word.length() -1; //마지막 문자 인덱스
char lastChar = word.charAt(lastIndex); //마지막 문자
System.out.print(Per_Arr[next].Return_Name() + ">>" );//게임참여자 차례를 알려준다
word = sc.next(); //단어 입력받기
char firstChar = word.charAt(0); //입력받은 단어 첫글자
//입력한 첫번째 글자와 전차례 참여자가 입력한 마지막 글자와 다른 경우 실행
if(firstChar!=lastChar) {
System.out.println(Per_Arr[next].Return_Name()+"이 졌습니다.");
break; //게임종료
}
next++; //다음 사람으로 건너감
if(next == num_P) //마지막 참여자 차례가 끝난후 처음 참여자 차례로 돌아감
next=0;
}
sc.close();
}
}
nextLine을 반복문에서 쓰는 경우 Enter를 누르고 다시 nextLine 실행할 경우 Enter가 남아있어서 넘어가게 된다.
위 코드에서 next() 대신 nextLine()을 쓰는 경우 입력을 한번 받고 다음 입력은 건너뛰게 된다.
객체 배열을 이용하는 경우 입력을 받기 전에 초기화를 해줘야 한다.
이번에도 느낀 것이지만 머리로 알고 있어도 용어로 잘 설명할 줄 알아야 하는 게 중요한 것 같다.
열심히 하려고 노력하지만 공부하는 데 있어서 무언가 찜찜하다.
'JAVA' 카테고리의 다른 글
[JAVA] 공부 6일차! (2021-07-26) (0) | 2021.07.28 |
---|---|
[JAVA] 공부 5일차! (2021-07-23) (0) | 2021.07.24 |
[JAVA] 공부 3일! (2021-07-16) (0) | 2021.07.17 |
[JAVA] 공부 2일!! (2021-07-14) (0) | 2021.07.15 |
[JAVA] 공부시작! (2021-07-09) (0) | 2021.07.14 |