JAVA

[JAVA] 공부 4일차! (2021-07-21)

HJ39 2021. 7. 22. 01:18

튜터링 4일 차가 되었다 객체의 치환, 객체 배열, 메서드 , 접근 지정자 , static , final을 배웠다.

C++과 비슷한 부분이 많이 있지만 완전히 C++개념으로 이해하려다 보니 실수를 해서 오해했던 부분들이 있었다.

그럼에도 C++에서 객체에 대한 내용들을 배우고 자바를 배우니 확실히 이해하는데 많은 도움이 되고 있다.

 

※ 목차

지난주 과제 보완

객체의 치환

객체 배열

메서드

접근 지정자

static

final

과제

 

  • 지난주 과제 보완
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을 선언 시 공유 가능하다.

큰 특징으로는

  1. static → static은 서로 접근이 가능하다.
  2. static → nonstatic은 서로 접근이 불가능하다.
  3. nonstatic → nonstatic은 서로 접근이 가능하다.
  4. nonstatic → static은 서로 접근이 가능하다.
  5. 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