본문 바로가기
백엔드/자바

자바 - 9

by study_yeon 2023. 5. 9.

2023.05.09

1교시

* 복습 - 책258p

* 메소드 호출
- 클래스 내,외부의 호출에 의해 실행됨
- 내부 : 단순한 메소드 이름으로 호출

ex) void run() {}

      run();
- 외부 : 클래스에서 생성한 객체와 참조변수 이용 [ 객체.메소드() ] 

ex) Car car = new Car();

      car.run(); 

    객체 메소드

 

* 객체생성

// 객체 생성
클래스 참조변수 = new 클래스(매개값, ...);
Car myCar = new Car();

// 호출
참조변수.메소드(매개값, ...);  			 // 리턴값 없음, 또는 받지 않음
myCar.run();
타입 변수 = 참조변수,메소드(매개값, ...);  // 리턴값 있음 , 또는 받고 싶음
int speed = myCar.getSpeed();

- 메소드 이름은 짧게 / 변수 이름은 길게- 식별 가능한 정도로(두 단어 정도)
- 메소드에 기능을 작게 담기 - 오류 방지

* 메소드 안에 메소드를 넣기 가능

public class ClassName {
	void methodA( String x, int y ) {
    }
    void methodB() {   // 메소드A를 호출
    	methodA( "김철수" , 10 );
    }
}

 

* 메소드 :  리턴값 있는경우, 없는 경우(void) 

- 리턴값이 있는 메소드를 호출하고 리턴값을 받고싶다면 다음과 같이 변수를 선언하고 리턴값을 대입

타입 변수 = 메소드 ( 매개값, ...);


2교시

* 오버라이드 : 기존의 것을 재활용 
* 오버로딩 : 중첩함수, 메소드 이름이 같고 매개변수(개수, 타입)가 다름, 리턴타입은 상관없음
-> 매개값을 다양하게 받아 처리 가능(활용법)

* 자동형변환 
- 작은 쪽에서 큰 쪽으로 감
- 상속 또는 기본형에서 이뤄짐

int x = 10;
double y = 10.5;
add(x, y);  // 자동형변환

- int 가 double로 형변환 됨

* 선언부 = 헤더 = 시그니처 = 정의부
- 리턴타입, 메소드이름, 매개변수선언부분으로 구성

void (리턴값 없음)  - 실습(extend_class)

package extend_class;

public class CheckReturnClass {   //public이 붙으면 클래스이름과 파일이름이 같아야함

	public void add(int x, int y) {  
		System.out.printf("%d + %d = %d\n", x, y, (x + y));
		return;
	}
	void add(double x, double y) {
		System.out.printf("%f + %f = %f\n", x, y, (x + y));
		return;
	}
	
}

- public이 붙으면 클래스이름과 파일이름이 같아야함

실행클래스
package extend_class;

public class CheckReturnClassApp {

	public static void main(String[] args) {
		CheckReturnClass crc = new CheckReturnClass();  // 객체생성
		
		crc.add(100, 100);  // 메소드 호출
		crc.add(100.0, 100.0);
	}

}

결과 값

-> void에서 리턴값 적어줘도 결과가 나옴


※ 파일이름 바꾸기 


- 오른쪽마우스 > Refactor > Rename

 

※  변경내역 보기

- 오른쪽마우스 > Compare With > Local History

 

* 중요한 코드는 백업하기 
* 새로운 코드를 작성하면 저장하기
-> 형상관리 습관화


인스턴스 멤버와 정적 멤버 - 271p

 

* 인스턴스멤버

- 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드

- 인스턴드 필드(변수), 인스턴스 메소드로 구성

- 객체에 소속된 멤버이기 때문에 객체 없이는 사용 불가

- 객체를 생성하고 참조변수로 접근- (외부 클래스에서 사용할 경우)

- 객체 내부의 인스턴스 멤버는 this(객체 자기자신)로 접근

- this는 주로 생성자와 메소드의 매개변수이름이 필드와 동일한경우 인스턴스 멤버인 필드임을 명시하고자 할 때 사용

 

* 정적 멤버와 static 

- 정적 : '고정된'

- 클래스에 고정된 멤버로 객체를 생성하지 않고 사용할 수 있는 필드와 메소드

- 정적 필드(변수), 정적 메소드로 구성

- 공통의 것들을 공유 
- 모든 객체(대상) 중 하나
- 외부의 static만 불러올 수 있음

* 활용
메인은 하나만 있으면 되니까 static - 최초의 실행 

 

* 인스턴스와 정적의 판단기준

- 객체마다 가지고 있어야 할 데이터라면 인스턴스, 객체 공용의 데이터라면 정적으로 선언

예시) 인스턴스 - 색상 / 정적 -  π (계산할때 필요한 고정값)


3교시

● game클래스

 

※ 클래스 상단에 정보 적는 것이 기본

/*
 * 클래스명 : Dice
 * 개발자  : 구름
 * 작성일자 : 2023-05-09
 * 프로그램설명 : 주사위 클래스
 * 멤버변수 :
 * 멤버함수 : 
 * */


* Dice 클래스 만들기

- 주사위 4번 던져서 각각의 값이 어떤 값이 나오는지 구하는 게임

package game;

public class Dice {
	// 1. 멤버변수(색상, 선택된 숫자) - private 처리 필수
	private String color;         // 주사위 색
	private int selectedNumber;   // 주사위에서 선택된(보이는) 숫자
	
	// 2. 메소드
	// roll() : 주사위가 굴러가서 나오는 난수발생장치 - return값 필요 없음	 
	void roll() { // 0.0 ~ 1.0의 난수(소수)* 6 => 0.0 ~ 6.0 => 강제 정수화(int)
		selectedNumber = 
				(int)(Math.random() * 6) + 1;
	}
    // choice() : 주사위가 생성한 난수값 확인 - 내부의 변수가 있으면 return값 필요 없음
 	int choice() {
		return selectedNumber;
	}
 	
 	// 모든 객체는 로그기능을 가져야함.
 	// 로그기능에 해당하는 메소드가 toString() 메소드이다.
 	@Override
 	public String toString() {
 		String msg = 
 			"주사위의 번호 : " + selectedNumber + "\n";
 		return msg;
 	}
    // 멤버변수에 접근하게 하기위한 메소드 (get, set)
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public int getSelectedNumber() {
		return selectedNumber;
	}
	private void setSelectedNumber(int selectedNumber) {
		this.selectedNumber = selectedNumber;
	}	

}

 

* Math.random - 단순한 경우(주사위 등)에 활용

범위 0.0 < 난수 < 1.0 

* toString 
- log를 남기는 메소드 (모든 객체는 로그기능을 가져야함.)

- 모든 메소드 오버라이딩하기

- 모든 자바클래스의 조상클래스인 Object에 있는 기본메소드
- @Override란 어노테이션을 붙이고 시작


4교시 

● DiceApp 만들기

실행클래스 - 개별 ver
package game;

public class DiceApp {

	public static void main(String[] args) {
		// 무대(실행)에 Dice 연기할 수 있는 dice 배우변수 출연
		// = Dice 데이터형식의 dice 참조변수 선언
        
		// 1. dice 배우 / 배우는 무대에 등장한다
		Dice dice = new Dice(); // 자바가 만들어주는 기본생성자 사용
		dice.roll();  // 주사위 굴리기
		int selectedDiceNumber = dice.choice();
		// view
		System.out.println("선택된 1번 주사위 눈금은 : " + selectedDiceNumber);
		//dice객체의 로그기능 이용
		System.out.println(dice.toString());
		
		// 2. dice2 배우 
		Dice dice2 = new Dice();
		dice2.roll();
		int selectedDiceNumber2 = dice2.choice();
		System.out.println("선택된 2번 주사위 눈금은 : " + selectedDiceNumber2);
		System.out.println(dice2.toString());
		
		// 3. dice3 배우
		Dice dice3 = new Dice();
		dice3.roll();
		int selectedDiceNumber3 = dice3.choice();
		System.out.println("선택된 3번 주사위 눈금은 : " + selectedDiceNumber3);
		System.out.println(dice3.toString());
		
		// 4. dice4 배우
		Dice dice4 = new Dice();
		dice4.roll();
		int selectedDiceNumber4 = dice4.choice();
		System.out.println("선택된 4번 주사위 눈금은 : " + selectedDiceNumber4);
		System.out.println(dice4.toString());
	}

}

 

결과값

- static이 붙으면 static만 부를 수 있음(동일 레벨만 가능)
- main은 static이라 static이 아닌 메소드는 호출 불가


5교시

● DiceApp 배열로 개선하기

-> 같은 자료형사용 반복문 => 배열사용

 

1. 틀 작성 후 작동 확인

틀 작성
// 메인 - 메소드 호출
 public static void main(String[] args) {
	playDiceByArray();	
}
// 메소드 
public static void playDiceByArray() {
	System.out.println("정상작동");
}

2. DiceApp 작성

실행클래스 - 배열 ver
public class DiceApp {

	public static void main(String[] args) {
		playDiceByArray();  // 메소드 호출		
		System.out.println("### Fin ###"); // 프로그램 종료
	}
    
// 메소드 
	public static void playDiceByArray() {
		System.out.println("정상작동");
		// 전체 Dice배열이 차지하는 건물 1개(배열의 인덱스는 변수 하나임)
		Dice[] dices = new Dice[4];
		
		for (int i = 0; i < dices.length; i++) {
			dices[i] = new Dice();  // 각 인덱스의 Dice배열요소가 차지하는 실제 방(4개가 만들어짐)
			dices[i].selectColor();
            dices[i].roll();  // 주사위 굴리기(행동 메서드)
			
			// 선택된 값 가져오기
			// 속성 메서드 - choice의 역할 
			System.out.printf(
					"[%s] 선택된 값 : %s\n",
                    dices[i].getColor(),
					dices[i].toString());
		}
	}
}
메인 - 메소드 호출
public static void main(String[] args) {
		playDiceByArray();  // 메소드 호출
		System.out.println("### Fin ###"); // 프로그램 종료
	}
        
메소드 - 주사위 게임 시작
	public static void playDiceByArray() {
		Dice[] dices = new Dice[4];
		// 다이스객체 추가 루프
		for (int i = 0; i < dices.length; i++) {  // for 시작
        
			...
            
		}  // for 끝
		
        // 객체의 증감 나타내기
		System.out.println("------------------------------");
		// 다이스객체 2개 제거(배열의 요소 감소)
		System.out.println("dice 객체 2개 제거\n");
		Dice.decrease();  // static 
		Dice.decrease();
		System.out.println(
				"현재 dice객체의 수 : " + Dice.getCount());
		// 다이스객체 3개 증가 
        System.out.println("dice 객체 3개 증가\n");
		Dice.increase();
		Dice.increase();
		Dice.increase();
		System.out.println(
				"현재 dice객체의 수 : " + Dice.getCount());
	}

 

● 배열에 색 집어넣기 
1. 직접 집어 넣기

dices[i].setColor( "빨강" );

 

- 데이터 클래스에 get, set 함수 작성

데이터 클래스
public class Dice {
    public String getColor() {
            return color;
        }
        public void setColor(String color) {
            this.color = color;
        }
        public int getSelectedNumber() {
            return selectedNumber;
        }
        private void setSelectedNumber(int selectedNumber) {
            this.selectedNumber = selectedNumber;
        }
}


2. 색 바꾸기 (내부에 넣기) 
-주사위 색 변경 메소드 만들기 - scanner 활용
- 외부에서 주사위 색상을 선택하는 경우를 시뮬레이션(= 모델링)하는 경우이므로
=> public 제한자

 

- Scanner 만들기

public class Dice {

	public void selectColor() {
		// 눈으로 보고 선택하는 경우를 키보드 입력으로 대체
		Scanner sc = new Scanner(System.in); 
		
		System.out.println(   // 안내문 출력
				"색상 선택 ( 빨강, 파랑, 노랑, 녹색 ) : > ");
		this.color = sc.nextLine();
	}
}


- DiceApp 메소드 부분의 for 문의 실행문 부분에 dices[i].selectColor(); 작성

public static void playDiceByArray() {
		Dice[] dices = new Dice[4];
		// 다이스객체 추가 루프
		for (int i = 0; i < dices.length; i++) {
			dices[i] = new Dice();  
			dices[i].selectColor();
			dices[i].roll(); // 주사위 굴리기(행동 메서드)
			
			// 속성 메서드 - choice의 역할 
			System.out.printf(
					"[%s] 선택된 값 : %s\n",
					dices[i].getColor(), 
					dices[i].toString());	
		}

6교시 

* 멤버변수는 외부에서 접근 금지
- private 활용
- 외부에서 접근하려면 인터페이스 만들어주기

● 주사위의 개수가 몇개인지 아는 법(내부적으로)
- 클래스의 정적멤버 또는 정적메소드 이용
- 정적멤버는 같은 참조데이터형 사이의 정보공유용으로 사용
- 정적메소드는 같은 공유멤버의 데이터 변경용으로 사용

· for 루프등의 카운터 변수 이용 x
· 외부적으로 아는 방법(배열의 개수) : dices.length


1) int count; 변수 선언

private static int count; // 전체 객체(=클래스 = 참조 데이터형)에서 공유 - 1개만 필요


2) 생성자 추가 

// 생성자 추가
Dice() {
		count++; // 생성자에서 만들어진 객체의 수를 계산
				 // 기존 count = count + 1
        }
        
// 외부에서 접근하게 하기위한 메소드
static int getCount() {
	return count;
}


3) toString() 내용 변경

@Override
 	public String toString() {
 		String msg = 
 			"주사위의 번호 : " + selectedNumber + "\n" + 
 			"생성된 다이스 객체의 수 : " + count;   // 추가
 		return msg;
 	}

 

● 주사위 변동 개수 확인

 

- Dice 클래스에서 증감 메소드 만들기

public class Dice {
    private static int count; 
        Dice() {
            count++; // 생성자에서 만들어진 객체의 수를 계산
                     // 기존 count = count + 1
        }
        // 외부에서 접근하게 하기위한 메소드
        static int getCount() {
            return count;
        }
        // 현재 다이스 객체를 하나 줄이기
        static void decrease() {    // 리턴값은 get 에서 해주니까 리턴값 없어도 됨
            count--;
        }
        // 현재 다이스 객체를 하나 늘리기
        static void increase() {
            count++;
        }
}

- 실행클래스에서 메소드 호출하기

public class DiceApp {
	System.out.println("------------------------------");
		// 다이스객체 2개 제거(배열의 요소 감소)
		System.out.println("dice 객체 2개 제거\n");
		Dice.decrease(); // static 
		Dice.decrease();
		System.out.println(
				"현재 dice객체의 수 : " + Dice.getCount());
		
		Dice.increase();
		Dice.increase();
		Dice.increase();
		System.out.println(
				"현재 dice객체의 수 : " + Dice.getCount());
	}
}

결과값


* 객체자기자신 this로 접근 - 고유의 뜻
* 전체가 공유하는 것(static) 클래스 이름으로 접근
- 외부에서 접근할때 클래스명으로 접근

* 클래스는 1개 / 객체는 여러개(서로 다른)
- 클래스는 프로그램이 실행되며 자동으로 만들어짐
- 객체는 내가 필요할때마다 만든다
-> 클래스를 통해 공유


* 모든 데이터형에서 하나만 존재한다(한번만 만든다) - class
- 모든 데이터형에서 공유하는 멤버
- 선언시 static 붙이기
* static(공통, 우리)의 경우 this(각각이 다를 때 사용함)는 사용 불가

* 정적
-클래스멤버변수
-클래스메소드

* static 클래스 멤버
현재 클래스 데이터형 을 대표

* 클래스 정적 멤버변수를 바꾸는 기능 = 클래스의 정적메소드


7교시

w3school - 자료제공터(학습사이트)
https://www.w3schools.com/

● 데이터베이스 맛보기

* SQL은 데이터베이스에서 데이터를 저장, 조작 및 검색하기 위한 표준 언어

* SELECT FROM Customers;
- 가져와라 모든 것을 Customers로부터

* 명령은 대문자로 작성
* 변수는 대소문자 구분하지 않음 
* 문자열은 '  ' 안에 작성

* SELECT 5 + 5; 계산기기능 

* 테이블에서 가로 = 로우 = 튜풀


◎ 완성 본

* 데이터클래스 - 주사위를 던지는 역할 (기능)

package game;

import java.util.Scanner;
// 데이터클래스 - 주사위를 던지는 역할 

public class Dice {

	// 1. 멤버변수(색상, 선택된 숫자) - private 처리 필수
	private String color; // 주사위 색
	private int selectedNumber;   // 주사위에서 선택된(보이는) 숫자
	private static int count; // 전체 객체(=클래스 = 참조 데이터형)에서 공유 - 1개만 필요
	
	Dice() {
		count++; // 생성자에서 만들어진 객체의 수를 계산
				 // 기존 count = count + 1
	}
	// 외부에서 접근하게 하기위한 메소드
	static int getCount() {
		return count;
	}
	// 현재 다이스 객체를 하나 줄이기
	static void decrease() { // 리턴값은 get 에서 해주니까 리턴값 없어도 됨
		count--;
	}
	// 현재 다이스 객체를 하나 늘리기
	static void increase() {
		count++;
	}
	// 2. 메소드
	/* roll() : 주사위가 굴러가서 나오는 난수발생장치 - return값 필요 없음
	 * choice() : 주사위가 생성한 난수값 확인 - 내부의 변수가 있으면 return값 필요 없음
	 */
	void roll() { // 0.0 ~ 1.0의 난수(소수)* 6 => 0.0 ~ 6.0 => 강제 정수화(int)
		selectedNumber = 
				(int)(Math.random() * 6) + 1;
	}
	// 내부멤버변수 seclectedNumber에 저장하면 됨 - return 없어도 됨
 	int choice() {
		return selectedNumber;
	}
 	
 	// 모든 객체는 로그기능을 가져야함.
 	// 로그기능에 해당하는 메소드가 toString() 메소드이다.
 	// 모든 자바클래스의 조상클래스인 Object에 있는 기본메소드
 	// 이 메소드를 개선할 것 (개선 : 기본기능을 확장하여 고치겠다)
 	// @Override란 어노테이션을 붙이고 시작
 	@Override
 	public String toString() {
 		String msg = 
 			"주사위의 번호 : " + selectedNumber + "\n" + 
 			"생성된 다이스 객체의 수 : " + count;
 		return msg;
 	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public int getSelectedNumber() {
		return selectedNumber;
	}
	private void setSelectedNumber(int selectedNumber) {
		this.selectedNumber = selectedNumber;
	}
	
	// 주사위 색 변경 메소드 만들기 - scanner 활용
	// 외부에서 주사위 색상을 선택하는 경우를 시뮬레이션(= 모델링)하는 경우이므로
	// => public 제한자
	public void selectColor() {
		// 눈으로 보고 선택하는 경우를 키보드 입력으로 대체
		Scanner sc = new Scanner(System.in); // 눈 대신
		// 안내문 출력
		
		System.out.println(
				"색상 선택 ( 빨강, 파랑, 노랑, 녹색 ) : > ");
		this.color = sc.nextLine();
	} 	

}

 

* 실행 클래스 - 게임이 열리는 룸

1. public static void main(String[] args)  - 메소드 호출
2. public static void playDiceByArray()   - 주사위 게임 시작(배열식)
3. public static void playDiceIndividual() - 주사위 게임 시작(개별변수 방식)

-> 2,3 번 중에 하나만 작성하면 됨 (별도의 DiceGame이라는 클래스를 만들어서 작성 가능)

package game;

public class DiceApp {
// 게임이 열리는 룸

	public static void main(String[] args) {
		// playDiceIndividual(); - 개선 전
		playDiceByArray();  // 메소드 호출
		
		// 지금까지 출연한 dice는 총 몇개의 주사위인가?
		
		// 프로그램 종료
		System.out.println("### Fin ###");
	}
	// 메소드 - 주사위 게임 시작
	public static void playDiceByArray() {
		System.out.println("정상작동");
		// 같은 자료형사용 반복문 => 배열사용
		// 전체 Dice배열이 차지하는 건물 1개(배열의 인덱스는 변수 하나임)
		Dice[] dices = new Dice[4];
		// 다이스객체 추가 루프
		for (int i = 0; i < dices.length; i++) {  // for 시작
			dices[i] = new Dice();  // 각 인덱스의 Dice배열요소가 차지하는 실제 방(4개가 만들어짐)
			dices[i].selectColor();
			dices[i].roll(); // 주사위 굴리기(행동 메서드)
			
			// 선택된 값 가져오기
			// 속성 메서드 - choice의 역할 
			System.out.printf(
					"[%s] 선택된 값 : %s\n",
					dices[i].getColor(), 
					dices[i].toString());	
		}  // for 끝
		
		System.out.println("------------------------------");
		// 다이스객체 2개 제거(배열의 요소 감소)
		System.out.println("dice 객체 2개 제거\n");
		Dice.decrease(); // static 
		Dice.decrease();
		System.out.println(
				"현재 dice객체의 수 : " + Dice.getCount());
		System.out.println("dice 객체 3개 추가\n");
		Dice.increase();
		Dice.increase();
		Dice.increase();
		System.out.println(
				"현재 dice객체의 수 : " + Dice.getCount());
	}
	
	public static void playDiceIndividual() {
		// 주사위 게임 시작 - 개별변수 방식
		// 무대(실행)에 Dice 연기할 수 있는 dice 배우변수 출연
		// = Dice 데이터형식의 dice 참조변수 선언
		// 1. dice 배우
		Dice dice = new Dice(); // 자바가 만들어주는 기본생성자 사용
		dice.roll();  // 주사위 굴리기
		int selectedDiceNumber = dice.choice();
		
		// view
		System.out.println("선택된 1번 주사위 눈금은 : " + selectedDiceNumber);
		//dice객체의 로그기능 이용
		System.out.println(dice.toString());
		
		// 2. dice2 배우 / 배우는 무대에 등장한다
		Dice dice2 = new Dice();
		dice2.roll();
		int selectedDiceNumber2 = dice2.choice();
		
		System.out.println("선택된 2번 주사위 눈금은 : " + selectedDiceNumber2);
		System.out.println(dice2.toString());
		
		// 3. dice3 배우
		Dice dice3 = new Dice();
		dice3.roll();
		int selectedDiceNumber3 = dice3.choice();
		
		System.out.println("선택된 3번 주사위 눈금은 : " + selectedDiceNumber3);
		System.out.println(dice3.toString());
		
		// 4. dice4 배우
		Dice dice4 = new Dice();
		dice4.roll();
		int selectedDiceNumber4 = dice4.choice();
		
		System.out.println("선택된 4번 주사위 눈금은 : " + selectedDiceNumber4);
		System.out.println(dice4.toString());
	}
}

 

출력값

- 파란 부분 : App의 View 부분

- 노란 부분 : toString 활용하여 출력된 부분

 

'백엔드 > 자바' 카테고리의 다른 글

자바 - 11  (0) 2023.05.11
자바 - 10  (0) 2023.05.10
자바 - 8  (0) 2023.05.08
자바 - 7  (0) 2023.05.04
자바 - 6  (0) 2023.05.03