이안의 평일코딩

JAVA의 정석 23일차 - 객체지향 본문

Back-end/Java

JAVA의 정석 23일차 - 객체지향

이안92 2020. 7. 15. 09:53
반응형

2020.07.15(수)

 

=[복습]=

1. 클래스의 종류

 1) 추상클래스 ==> 미완성 클래스 => 반드시 구현해서 사용

 2) 인터페이스(Spring의 기반) ==> 미완성 클래스 => 반드시 구현해서 사용

 3) 내부클래스 => 쓰레드, 윈도우, 네트워크

   => 멤버클래스 지역클래스 익명의클래스

 4) 종단클래스(Final Class) => 확장이 불가능 => final(String, Math, System)

 

2. 데이터 저장

 1) 변수 정수(int, long), 실수(double), 논리(boolean), 문자

 2) 참조변수 => 4byte (메모리주소만 저장됨) => 배열(1차원배열)

                                                                 예) int[] arr = new int[5]

                                                                 클래스(사용자 정의 데이터형)

Movie m = new Movie()

               ==> new가 Movie 메모리 크기 확인 (4byte 4개 => 16byte)

예) class Movie { => heap 사용자 정의 데이터가 저장되는 위치

 String title;

 String director;

 String actor;

 int rank;

}

클래스는 .(주소접근연산자)를 통해서 (m.title)

자바메모리 구조 : JVM(가상머신: 관리)

Class (Method, static)
Stack (지역변수, 매개변수) => { }끝날 때 자동으로 사라짐 => 메모리 관리
heap (멤버변수 클래스밖에서선언) => new(저장공간 만들어줌)

 

3. 데이터 처리

 1) 연산자

   (1) 단항연산자 : 증감연산자(++, --), 부정연산자(!), 캐스팅연산자((type))

   (2) 산술연산자 : +, -, *, /, %

   (3) 비교연산자 : ==, !=, <, >, <=, >=

   (4) 논리연산자 : &&, ||

   (5) 대입연산자 : =, +=, -=

 2) 제어문 => 조건문(if, if~else, if~else if~else if~else) 반복문(while, for, for~each) 반복제어문(break)

명령문(;세미콜론) => 메소드 (한개의 기능, 재사용) => 클래스 => 패키지 => .jar(라이브러리)

 

4. 메소드

 1) 사용자로부터 받는 값 => 매개변수

 2) 처리한 후 결과값 => 리턴형 (결과값 없을 때 void)

* 데이터베이스 CURD (create, update, read, delete)

==========================================================

 

1. 메소드

 = 리턴값

 = 매개변수 : 애매한 경우

    printf("%d%d%d",10,20,30)

    printf("%d",100)

   ============== 가변매개변수... (갯수 확인안될 때 "..." 사용)

   String... a

   Object... obj (데이터형, 갯수 둘다 모를 때)

 

Object (데이터형 통합) => 어떤 값이 들어와도 됨

	public static void main(String[] args) {
		Object o=10;
		Object o1=0.5;
		Object o2='A';
		Object o3="aaaaa";
		Object o4=new 메소드();
	}
package com.sist.method;

public class 메소드 {
	public static void concat(String s, String... s1) {
		for(String ss:s1) { //for~each사용
			s+=ss;
		}
		System.out.println(s);
	}

	public static void main(String[] args) {
		concat("Hello","홍길동","심청이","박문수","춘향이","이순신");
	}
}

 

display(int, int)

display(String, String, int)

display(String, int, double)

=> display(Object...arg) =>데이터형이 섞여있을때 Object. 오버로딩보다 가변매개변수가 더 편함

                                                                            (오버로딩은 갯수만큼 만들어야 되기 때문에)

 

display(int, int)

display(int, int, int)

display(int, int, int)

=> display(int...arg) =>데이터형이 하나로 통일됐을때

package com.sist.method;

import java.lang.reflect.Method;

class A{
	public void display1(String name) {
		System.out.println("Hello~~\n"+name);
	}
	public void display2(String name) {
		System.out.println("Hello~~\n"+name);
	}
}
public class 메소드2 {

	public static void main(String[] args) {
		//A a = new A();
		//a.display("홍길동");
		
		try { // new대신 메모리할당 가능
			Class clsName = Class.forName("com.sist.method.A");
			Object obj = clsName.newInstance();
			//System.out.println(obj);
			
			//A a = (A)obj; //클래스 형변환
			//a.display("심청이");
			Method[] method = clsName.getDeclaredMethods();
			//method[0].invoke(obj, "이순신"); //invoke로 메소드 호출
			
			for(Method m:method) {
				System.out.println(m.getName()); //display1, display2
			}
		}catch(Exception ex) {}
	}

}

 

class AA{
	//메소드는 리턴형이 있어야함
	public void AA() { //일반 인스턴스 메소드
		System.out.println("AA() Call...");
		// void자체가 리턴형(결과값이 존재하지 않는다)
	}
	public AA() {//생성자 데이터형, 리턴형 붙으면 안됨 :특수메소드=>메모리에 저장
		System.out.println("AA() Call...");
	}
}

 

명시적 => 초기화 블록(자동으로 가능) => 생성자(호출해야 가능)

생성자, 초기화블럭, static은 상속되지 않는다.

 

 

 1) 퍼즐게임

package com.sist.client;
// 생성자 => 변수
// GridLayout
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
// 윈도우창 => JFrame
/*
 * break
 * continue
 * ========= 반복문 한개만 제어
 * for(int i=1; j<=5; i++) {
 * 	for(int j=1; j<=5; j++) { //25바퀴임 원래
 * 		if(j==2) 
 * 			break; // i=1일때 
 *  }
 * }
 */
public class PuzzleGame extends JFrame implements ActionListener{
	JButton b1,b2;
	JButton[][] pan = new JButton[3][3];
	int[][] panCount=new int[3][3];
	int brow = 0;
	int bcol = 0;
	
	// 0~8 난수 발생
	public void getRand() {
		int[] com = new int[9]; //중복없는 난수값을 저장
		int su = 0; //난수발생시 저장한 변수
		boolean bCheck = false; //중복여부 확인
		for(int i=0; i<9; i++) {
			//난수 발생
			bCheck=true;
			while(bCheck) {
				su=(int)(Math.random()*9); //0~8
				bCheck=false;
				// 검색 => 저장된 데이터가 중복여부 확인
				for(int j=0; j<i; j++) {
					if(su==com[j]) {// 같은 수가 저장
						// while을 다시 수행
						bCheck=true; // 같은수가 있다면 break되고 다시 while문으로
						break; //자기 소속 for제어문 j만 가능 while문은 i는 계속 반복됨
					}
				}
			}
			com[i]=su;
			
			panCount[i/3][i%3]=su;
			
			if(su==8) {
				brow=i/3;
				bcol=1%3;
			}
		}
	}
	// 배치 함수
	public void display() {
		for(int i=0; i<3; i++) {
			for(int j=0; j<3; j++) {
				if(i==brow && j==bcol) {
					pan[i][j].setText("");
					pan[i][j].setEnabled(false); //비활성화
				}
				else {
					pan[i][j].setText(String.valueOf(panCount[i][j]+1));
					pan[i][j].setEnabled(true); //활성화
				}
				
			}
		}
	}
	
	// 버튼 클릭
	
	
	
	public PuzzleGame() { //생성자 => 클래스를 메모리에 저장할 때 가장 먼저 호출되는 메소드
		// 배치
		b1 = new JButton("시작");
		b2 = new JButton("종료");
		JPanel p = new JPanel();
		p.add(b1);p.add(b2);
		add("South",p);
		
		
		JPanel p2 = new JPanel();
		p2.setLayout(new GridLayout(3,3,5,5)); //
		int k=1;
		for(int i=0; i<3; i++) {
			for(int j=0; j<3; j++) {
				pan[i][j] = new JButton(String.valueOf(k));
				pan[i][j].setFont(new Font("굴림체",Font.BOLD,50));
				p2.add(pan[i][j]);
				pan[i][j].addActionListener(this);
				k++;
			}
		}
		
		add("Center",p2);
		
		getRand();
		display();
		
		setSize(350, 400);
		setVisible(true);
		
		b1.addActionListener(this); // 이벤트 등록
	}
	public static void main(String[] args) {
		new PuzzleGame();
		//생성자 호출시에는 반드시 앞에 new를 붙임
	}
	
	//종료여부 확인
	public boolean isEnd() {
		int k=0;
		for(int i=0; i<3; i++) {
			for(int j=0; j<3; j++) {
				if(panCount[i][j]!=k)
					return false;
				k++;
			}
		}
		return true;
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==b1) {
			getRand();
			display();
		}
		for(int i=0; i<3; i++) {
			for(int j=0; j<3; j++) {
				if(e.getSource()==pan[i][j]) {
					panCount[brow][bcol]=panCount[i][j];
					panCount[i][j]=8;
					brow=i;
					bcol=j;
					
					display();
					if(isEnd()) {
						JOptionPane.showMessageDialog(this, "Game Over!!");
						System.exit(0);
					}
				}
			}
		}
	}

}

 

 

2)

Server

package com.sist.server;
import com.sist.common.*;
import java.net.*;

public class Server {
	//시작하면 => 서버가 가동
	public static void main(String[] args) {
	}
}

 

Fuction

package com.sist.common;

public class Function {
	public final int LOGIN=100;
	public final int MYLOG=110;
	public final int CHAT=200;
	public final int RESERVE=300;
	public final int EXIT=900;
	public final int MYEXIT=910;
}

 

RecipeForm

package com.sist.client;
import java.awt.*;
import javax.swing.*;
public class RecipeForm extends JPanel{
	JLabel poster = new JLabel();
	JLabel title = new JLabel();
	JLabel chef = new JLabel();
	JLabel score = new JLabel();
	
	// 초기화
	public RecipeForm() {
		setLayout(null);
		poster.setBounds(5, 5, 300, 170);
		poster.setOpaque(true);
		poster.setBackground(Color.pink);
		
		title.setBounds(5, 180, 300, 30);
		title.setOpaque(true);
		title.setBackground(Color.orange);
		
		chef.setBounds(5, 215, 300, 30);
		chef.setOpaque(true);
		chef.setBackground(Color.cyan);

		score.setBounds(5, 250, 300, 30);
		score.setOpaque(true);
		score.setBackground(Color.magenta);
		
		add(poster);add(title);add(chef);add(score);
	}
}

 

RecipeManager

package com.sist.client;
import java.awt.*;
import javax.swing.*;
public class RecipeManager extends JPanel{
	RecipeForm[] recipes = new RecipeForm[9];
	public RecipeManager() {
		setLayout(null);
		JPanel p = new JPanel();
		p.setLayout(new GridLayout(3,3,5,5));
		for(int i=0; i<9; i++) {
			recipes[i]=new RecipeForm();
			p.add(recipes[i]);
		}
		
		p.setBounds(10, 15, 1000, 900);
		add(p);
	}
}

 

RecipeMainFrame

package com.sist.client;
import com.sist.common.*;
import java.awt.*;
import java.awt.event.*; //버튼 클릭할때 처리하는 내용포함
import javax.swing.*;

public class RecipeMainFrame extends JFrame implements ActionListener{ //창 따로 만들지않고 윈도우창 하나에다가
	//JFrame f = new JFrame();
	//배치
	CardLayout card = new CardLayout();
	login login=new login();
	JoinForm join=new JoinForm();
	RecipeManager rm=new RecipeManager();
	public RecipeMainFrame() {
		//생성자 : GUI의 화면 디자인, 변수 초기화, 데이터베이스 연결, 서버연결, 쓰레드 동작
		//Layout => 화면 배치
		setLayout(card);
		
		// 화면추가
		add("RM",rm);
		add("LOGIN",login);
		add("JOIN",join);
		setSize(1024, 960);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE); //메모리회수
		
		login.b2.addActionListener(this);
		join.b3.addActionListener(this);
	}
	public static void main(String[] args) throws Exception{
		UIManager.setLookAndFeel("com.jtattoo.plaf.mcwin.McWinLookAndFeel");
		new RecipeMainFrame();

	}
	@Override
	public void actionPerformed(ActionEvent e) { //창이동
		if(e.getSource()==login.b2) {
			card.show(getContentPane(), "JOIN");
		}
		else if(e.getSource()==join.b3) {
			card.show(getContentPane(), "LOGIN");
		}
		
	}

}
반응형
Comments