(9.28) - 자바 모르는 부분 복습

지환·2023년 10월 1일
0

JAVA

목록 보기
14/39
post-thumbnail

Ste1~Step3 몰아보기

참조 파라미터, 리턴값 연습(1)

package com.step21;
class A{
	//첫번째 학생 점수를 담을 변수 선언
	//전변은 유지 된다.- A a = new A(); a = null;(다시 초기화-디폴트값-모른다, 결정되지않음) a = new A();
	//미묘한 문제가 발생됨 - 재생성을 했다 - 복사본이 한 개 더 만들어졌다. 이전에 참조하던 클래스는 날아갔다.
	int n1 = 70;
	int n2 = 80;
	int n3 = 90;
	int tot = 0;
	void hap1() {//처리하기 부른다. - 리턴타입 void-> int, 또는 전변을 굳이 지변(파라미터자리)으로 처리하기
		//tot는 지변이라서 다른 외부의 클래스 에서는 사용이  불가하다. - 문제제기 - 재사용성이 떨어짐 코드임
		int tot = n1 + n2 + n3;//이것을 JVM에게 시킨다.
		//원시형 타입은 한 번에 한가지의 값만 담김 - 만일 여러번 하면 덮어쓰기가 되는 것임
		this.tot = tot;//0-> 240
	}
}
public class Amain {

	public static void main(String[] args) {
		A a  = new A();
		System.out.println(a.n1);
		//insert here - 위치 -  기초가 아니다
		//아래 메소드 호출이 되어야 13번 라인이 실행 기회를 가짐
		//메소드를 선언할 때는 좌중괄호와 우중괄호로 끝남
		a.hap1();//메소드가 호출될때는 세미콜론으로 끝난다.
		System.out.println(a.tot);//tot는 지변이라서 외부의 다른 클래스에서 재사용이 불가함

	}

}
/*
 생각하기 - 말하기(녹음, 끄적임) - 낱말카드 작성 - class A{}
 main메소드가 필요한 클래스인가? -> 전변선언- 타입과 갯수 결정할 수  있나? - 판단, 기준
세 학생의 점수를 입력 받아서...... -> 변수 3개가 필요하다 -> 타입은 뭘로 할까? -> 전변으로 할까?|지변으로 해도 되나
전변 -  초기화 생략가능함,  하나의 클래스를 대표하는 값이다.(인스턴스변수.변수명)


*/

---------------------
70
240
  • this.tot와 a.hap 그 관계를 잘 보기 70,0으로 생각했었음 포인트는 this라는 키워드를 통해서 전역 변수에 값을 입력했고, 그 값을 토대로 전체 전역변수 값이 바뀌었다는 것.

참조 파라미터, 리턴값 연습(2)

package com.step21;
class C{
	int n1 = 70;
	int n2 = 80;
	int n3 = 90;
}

class C1{
	int hap1() {
		
		C c = new C();
		int hap = c.n1 + c.n2 + c.n3;
		return hap;
	}
	int hap1(C c ) {
		int hap = c.n1 + c.n2 + c.n3;
		return hap;
	}	
}
public class Cmain {
	public static void main(String[] args) {
		C c = new C();
		C1 a = new C1();
		int hap = a.hap1();
		System.out.println(hap); 
		c.n1 = 50;
		c.n2 = 60;
		c.n3 = 50;
		hap = a.hap1(c);
		System.out.println(hap);
	}

}
----------------------------------------
240
160
  • 여기서 볼 포인트는 hap = a.hap1(c) 이 부분에서 c라는 객체가 생성되어 c.n1/c.n2/c.n3의 원본 값을 바꾸고 hap에 넣었을 때, 그대로 객체를 참조하여 int hap1메소드에서 hap를 리턴했다는 것,

Scanner 인스턴스화

package com.step21;

import java.util.Scanner;

class E {
	Scanner sc = new Scanner(System.in);
	public int getFirst() {
		int num = 0;
		num = sc.nextInt();
		return num;
	}
	public int getSecond() {
		int num = 0;
		num = sc.nextInt();
		return num;
	}
	public int add(int first, int second) {
		return first+second;
	}
	public int minus(int first, int second) {
		return first-second;
	}
	public int multi(int first, int second) {
		return first*second;
	}
	public double divid(int first, int second) {
		return first/(double)second;
	}
}
public class Emain {
	public static void main(String[] args) {
		E e = new E();
		System.out.println("첫번째 숫자를 입력하세요.");
		int first = e.getFirst();
		System.out.println("첫번째 입력 받은 숫자는 " + first + " 입니다.");
		System.out.println("두번째 숫자를 입력하세요.");
		int second = e.getSecond();//메소드 호출이다.
		System.out.println("두번째 입력 받은 숫자는 " + second + " 입니다.");
	}
}

  • 스캐너를 인스턴스화 해서 이 값을 메소드화해서 main에서 사용 할 생각을 못 했음

BaseBall 게임

package com.step3;

import java.util.*;

public class BallGame {
	int[] random = new int[3]; 
	
	// 랜덤 3자리 구하는 메소드
	public void getRandom() {
		int[] random = new int[3];//1부터 9까지의 임의의 숫자를 채번해서 초기화하기
		Random r = new Random();
		for(int i=0; i<3; i++) {
			random[i] = r.nextInt(9)+1;//중복검사 안됨
			for(int j = 0; j<i; j++) {
				if(random[i] == random[j]) {
					i--;
				}else {
					this.random = random;
				}
			}
		}
		System.out.println(random[0]+"+"+random[1]+"+" + random[2]);
	}
	
	// 유저한테 3자리 입력받는 메소드
	public int[] getNum() {
		int[] user = new int[3];
		Scanner sc = new Scanner(System.in);
		System.out.println("숫자 3개를 입력하세요 : ");
		for(int i = 0; i < 3; i++) {
			user[i] = sc.nextInt();
		}
		return user;
	}
	
	// account
	public void account(int[]user, int strikeCnt, int ballCnt) {
		System.out.println(" Strike : " + strikeCnt);
		System.out.println(" Ball : " + ballCnt);
		if(strikeCnt == 3) {
			System.out.println("정답입니다!.");
		} else if(strikeCnt !=3) {
			int[] user1 = getNum();
			playGame(user1);
		}
	
	}
	
	//랜덤숫자와 유저숫자 비교 메소드
	public void playGame(int[] user) {
		int strikeCnt=0;
		int ballCnt=0;
		for(int i = 0; i < 3; i++) {
			if(random[i] == user[i]) {
				strikeCnt++;
			}
			for(int j =0; j < 3; j++)
				if (random[i] != user[i] && random[i] == user[j]) {
					ballCnt++;
				}
		}
		account(user, strikeCnt, ballCnt);
	}

	public static void main(String[] args) {
		BallGame bg = new BallGame();
		bg.getRandom();
		int[] user = bg.getNum();
		bg.playGame(user);
	}
}

  • 내가 구현한 코드보다 더 배울점이 많음. (메소드의 파라미터) 중심으로 볼 것.
  • 메소드 설계 중점적으로 보기

BaseBall 게임(2)

package com.step3;

import java.util.Random;
import java.util.Scanner;
/*
 아직 3자리의 숫자를 한번에 확인하고 수정하는걸 모르겠음.. 각자 자릿수의 숫자를 확인하는방법? 
*/
public class BaseBallGame {
	int dap1, dap2, dap3 = -1; // 랜덤 숫자 변수-	1차배열
	int num1 , num2, num3 = 0; //유저가 적는 숫자 1차배열
	int gameCount = 0; //게임 카운터
	int strike = 0; //스트라이크 갯수
	int ball = 0; //볼 갯수
	Scanner sc = new Scanner(System.in);
	
	void newNumber() {//랜덤 숫자 정하기
		Random r = new Random();
		while(true) {
			dap1 = r.nextInt(10);// 일의자리 숫자 채번
			dap2 = r.nextInt(10);// 십의자리 숫자 채번
			dap3 = r.nextInt(10);// 백의자리 숫자 채번
			if(!(dap1==dap2 || dap1==dap3 || dap3==dap1)) {				
				break;
			}
		}
		System.out.println("새로운 숫자는 "+ dap3 + dap2 + dap1 +" 입니다.");//실제 게임일땐 보이면 안됨
	}
	
	void inserNumber() { //사용자가 숫자 입력
		System.out.println("일의 자리 숫자를 입력해주세요");
		num1 = sc.nextInt();
		System.out.println("십의 자리 숫자를 입력해주세요");
		num2 = sc.nextInt();
		System.out.println("백의 자리 숫자를 입력해주세요");
		num3 = sc.nextInt();
	}
	
	void chackNum() {//숫자 체크하기
		if(dap1 == num1) strike = strike + 1;// strike 체크
		if(dap2 == num2) strike = strike + 1;
		if(dap3 == num3) strike = strike + 1;

		if(num1 == dap2 || num1 == dap3) ball = ball + 1;// ball 체크
		if(num2 == dap1 || num2 == dap3) ball = ball + 1;
		if(num3 == dap1 || num3 == dap2) ball = ball + 1;
		
	}
	
	public static void main(String[] args) {
		BaseBallGame bbg = new BaseBallGame();
		System.out.println("게임을 시작할까요? (Y/N)");
		if("Y".equals(bbg.sc.next())) {
			System.out.println("게임을 시작합니다. 기회는 총 10번입니다.");
			bbg.newNumber();
			while(true) {//무한 루프
				bbg.ball = 0;
				bbg.strike = 0;
				bbg.gameCount++; // 게임 카운트 증가 
				System.out.println("=========================="+bbg.gameCount+"번째 기회입니다.==========================");
				bbg.inserNumber();
				bbg.chackNum();
				if(bbg.strike == 3) {
					System.out.println(+ bbg.gameCount + "번째 기회에 세개의 숫자가 모두 맞았습니다");
					break;
				}else{
					System.out.println(bbg.strike + "스트라이크 " + bbg.ball + "볼 입니다.");
					if(bbg.gameCount == 10) {//기회는 10번으로 주어짐
						System.out.println("모든 기회를 소모하였습니다.");
						break;
					}
				}
			}
		}else {
			System.out.println("게임을 종료합니다.");
		}

	}

}

주소록(AddressBook)

package com.week2;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
//클래스 선언하기
//ActionListener는 인터페이스 이라서 추상메소드를 가지고 있다.
//추상메소드란 선언만 되어있고 좌중괄호와 우중괄호가 없는 메소드 말함
public class AddressBook implements ActionListener{
	//선언부
	JFrame jf = new JFrame();
	AddressDialog aDialog = new AddressDialog();//생성부가 생성자를 호출한다.
	JPanel jp_north = new JPanel();//버튼 4개 배치하는데 사용함-단독으로 모양이 없다
	JButton btnSelect = new JButton("조회");
	JButton btnInsert = new JButton("입력");
	JButton btnUpdate = new JButton("수정");
	JButton btnDelete = new JButton("삭제");
	//생성자
	public AddressBook() {}
	//화면처리 구현
	public void initDisplay() {
		//이벤트 처리 3단계 -  버튼의 이벤트를 지원하는 인터페이스를 implements한다. - ActionListener
		//해당 인터페이스가 선언하고 있는 메소드를 오버라이딩 해야한다. - actionPerformed(ActionEvent e)
		//이벤트소스와 이벤트 처리를 담당하는 클래스를 매칭해줌
		btnSelect.addActionListener(this);
		btnInsert.addActionListener(this);
		btnUpdate.addActionListener(this);
		btnDelete.addActionListener(this);
		jp_north.add(btnSelect);
		jp_north.add(btnInsert);
		jp_north.add(btnUpdate);
		jp_north.add(btnDelete);
		jf.add("North", jp_north);
		jf.setTitle("주소록 Ver1.0");
		jf.setSize(800,500);
		jf.setVisible(true);
		aDialog.initDisplay();
		aDialog.jdg_address.setVisible(false);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	//메인메소드
	public static void main(String[] args) {
		AddressBook abook = new AddressBook();//기본
		abook.initDisplay();
	}
	//아래 메소드는 ActionListener인터페이스에 이름이 정해져 있다.
	//구현체 클래스인 너가 재정의하여 구현해라
	//현재 코드에서 actionPerformed메소드를 호출하는 코드는 어디에도 없다.
	//그런데 54번 라인은 어떻게 실행되는 걸까요?
	//actionPerformed메소드는 마치 main메소드 처럼 버튼이 눌려지고 눌려졌다는 사실을 JVM이 감지하면
	//그때 자동으로 호출되는 메소드 입니다. - 콜백메소드(callback)
	@Override
	public void actionPerformed(ActionEvent e) {
		//눌려진 버튼의 문자열을 읽어온다. - 언제 버튼이 눌렸을 때 - 버튼을 누르는건 사용자 이지만 
		//눌렸다는 느끼는건 JVM만이 알수 있다.- 파라미터 자리에 e가지고 getActionCommand()호출하면 String타입의 라벨 출력함
		String command = e.getActionCommand();
		System.out.println(command);//조회,수정,입력,삭제
		//너  조회를 원해?
		if("조회".equals(command)) {
			System.out.println("조회버튼을 클릭하였습니다.");
			aDialog.set(command, true);
		}
		//너  입력하려고?
		else if("입력".equals(command)) {
			aDialog.set(command, true);
		}
		//너 수정할거니?
		else if("수정".equals(command)) {
			aDialog.set(command, true);
		}
		//너 삭제할래?
	}
}









주소록 AddressDialog

package com.week2;

import javax.swing.JDialog;

public class AddressDialog {
	//선언부 - 전역변수 자리임
	JDialog jdg_address = new JDialog();
	public AddressDialog() {
		//initDisplay();
	}
	//메소드 설계를 통해서 반복되는 코드와 제어권은 AddressBook에 가지면서도
	//그 변화된 부분은 AddressDialog에서 처리하는 방법을 알아보자.
	//버튼이 눌리는 건 AddressBook 클래스에서 알고 있다. - actionPerformed가 있음
	//그런데 그 버튼이 눌렸을 AddressDialog클래스의 title값을 변경해야 한다.
	//AddressBook에서 눌린 버튼의 라벨값을 set메소드의 파라미터를 통해서 
	//받아오고 setTitle메소드를 호출하여 이 문제를 해결할  수 있다.
	//조회버튼을 감지하는 if문 안에서 set메소드를 호출하시오.
	public void set(String title, boolean isView) {
		jdg_address.setTitle(title);
		jdg_address.setVisible(isView);
	}
	//화면처리부
	public void initDisplay() {
		jdg_address.setSize(400, 500);
		//jdg_address.setVisible(true);
	}
	//인스턴스화를 한다.
	//인스턴스화 위치를 선택한다.- 전역으로 한다. 아니다 지역으로 할수도 있다.
	//메인메소드
	/*
	public static void main(String[] args) {
		AddressDialog ad = new AddressDialog();
		ad.initDisplay();
	}
	*/

}

컬렉션프레임워크

Set<String> set = new HashSet<>();

여기에서 new HashSet<>()는 HashSet 클래스의 생성자를 호출하여 새로운 HashSet 객체를 생성한다.

그런 다음 이 객체는 Set<String> 유형의 참조 변수 set에 할당한다.

결과적으로 실제로 HashSet의 객체가 생성되며, 이 객체를 Set 인터페이스를 통해 사용할 수 있다.

Hash

package 배열과_컬렉션프레임워크.제네릭과_컬렉션프레임워크;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Objects;
import java.util.Set;

public class SetExam2 {
    public static void main(String[] args) {
        // Hash 라는 알고리즘이 나오면 Object가 가지고 있는 equals와 hashCode 메소드를 오버라이딩 해야한다.
        Set<MyData> mySet = new HashSet<>();
        mySet.add(new MyData("kim", 500));
        mySet.add(new MyData("lee", 200));
        mySet.add(new MyData("hong", 700));
        // equals 와 hashcode 가 있어서 중복된 값이 안나옴
        mySet.add(new MyData("hong", 700));


        // Iterator를 사용하는 패턴
        Iterator<MyData> iterator = mySet.iterator();
        while (iterator.hasNext()){
            MyData myData = iterator.next();
            System.out.println(myData);
        }
    }
}

class MyData {
    private String name;
    private int value;

    public MyData(String name, int value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public int getValue() {
        return value;
    }

    @Override
    public boolean equals(Object o) {
        System.out.println("equals!!!");
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MyData myData = (MyData) o;
        return value == myData.value && Objects.equals(name, myData.name);
    }

    @Override
    public int hashCode() {
        System.out.println("hashcode!!!");
        return Objects.hash(name, value);
    }

    // toString 메소드를 오버라이딩해야 정상적인 값을 출력할 수 있음

    @Override
    public String toString() {
        return "MyData{" +
                "name='" + name + '\'' +
                ", value=" + value +
                '}';
    }
}

Map2

package 배열과_컬렉션프레임워크.제네릭과_컬렉션프레임워크;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapExam2 {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("k1", "hello");
        map.put("k2", "hi");
        map.put("k3", "안녕");

        Set<String> keySet = map.keySet();
        Iterator<String> iterator = keySet.iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            String value = map.get(key);

            System.out.println(key+" : "+value);
        }
    }
}
  • Set : keySet 부분 다시 보기

정렬하기

package 배열과_컬렉션프레임워크.제네릭과_컬렉션프레임워크;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SortExam {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("kim");
        list.add("lee");
        list.add("hong");

        // 자료구조에서 유용한 메소드를을 모아둔 클래스
        Collections.sort(list);

        for(int i=0; i< list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}
profile
아는만큼보인다.

0개의 댓글