이안의 평일코딩

JAVA의 정석 20일차 - 클래스 생성 본문

Back-end/Java

JAVA의 정석 20일차 - 클래스 생성

이안92 2020. 7. 10. 13:35
반응형

2020.07.10 (금)

 

1. 클래스 생성
    ====
   1) 변수 => 여러개를 저장 할 때 (반드시 공통으로 들어가는 데이터)
                             => 추상화 작업 (공통만 뽑아냄)
   예)
      영화 정보
      =>영화명, 감독, 출연, 장르, 개봉, 줄거리(, 음악) =>음악은 몇몇 영화에만 존재한다고 치면

                                                                       추상화 작업을 통해. 필요로 의해 따로 만듦. 
    2) 변수의 종류 246page
       (1) 멤버변수 => new를 사용할 때마다 따로 저장되는 변수 (인스턴스변수)

          * 메모리 만들어지는 시점 => new를 이용해야 메모리공간 생성됨

          * heap : 프로그래머가 관리하는 영역 (자동처리가 안된다)

                     메모리를 사용하지 않을 경우 (직접처리, GC가비지컬렉터)

       (2) 공유변수 => 메모리가 한개 => 공통으로 사용되는 변수 (정적변수) => static

          * 컴파일러가 컴파일할 때 자동으로 생성

          * 메소드영역 (static, 메소드)

   => 멤버변수, 공유변수는 프로그램 종료 시 사라짐

 

       (3) 지역변수 => 지역변수, 매개변수

          * 메모리 생성 시점 => 메소드 호출시에

          * 메모리가 자체 관리 {}을 벗어나면 자동 회수 (없어짐) => stack(LIFO) Last In, First Out

            int a;

            int b;

            int c; => 제거

    3) 생성자

         => 멤버변수의 초기값 부여

         => 제어문을 이용하거나, 파일 읽기 ....

              구현하고 데이터값을 가지고 올 때, 보안

              => 생성자는 반드시 필요하다

              => 생략 가능 (자동으로 컴파일러가 추가 => default 생성자 => 매개변수가 없는 생성자)

class Student{
	// 학생 1명에 대한 정보 ==> 메모리 공간 여러개 만들 수 있다(new)
	String name;
	String subject;
	int year;
	// 292page
	// Student(){} 기본 생성자. 클래스에 정의된 생성자가 하나도 없을 때 추가
}

              => 메모리에 저장(클래스) ==> 호출되는 메소드

                   ========= new 생성자() => 한번만 호출한다 => this(자신)

class A {
	int a;
    A(int a) {
    this.a = a
    }
}   


    4) 메소드 : 기능

         => 메소드 : 선언부, 구현부

              리턴형 메소드명(매개변수....) {  => 선언부

                                                       =>구현부

              } => 선언부+구현부 = 저장

         = 인스턴스 메소드 => 클래스마다 따로 사용하는 메소드

         = 정적 메소드 => static => 모든 클래스 공통으로 사용되는 메소드

         = 추상 메소드 => 선언부만 존재(377page)

             구현이 안된 메소드 => 프로그래머가 구현후 사용

class Student{
	// 학생 1명에 대한 정보 ==> 메모리 공간 여러개 만들 수 있다(new)
	String name;
	String subject;
	int year;
	static String school; // 메모리에 저장
	// 292page
	// Student(){}
	
}
public class MainClass {

	public static void main(String[] args) {
		//static 변수 사용
		Student.school="SIST";
		Student s = new Student(); // name, year, subject => 저장 (s라는 주소에 저장)
		System.out.println(s);
		//Student@15db9742
		System.out.println(s.name); // null
		System.out.println(s.subject); // null
		System.out.println(s.year); // 0
		
		s.name="홍길동";
		s.subject="개발과";
		s.year=3;
		// 메소드도 동일
		System.out.println(s.name);
		System.out.println(s.subject);
		System.out.println(s.year);
		System.out.println(Student.school); // SIST
		Student s1=new Student(); //하나 더 저장 가능. 다른 공간
		System.out.println(s1);
		//Student@6d06d69c
		
		System.out.println(s1.name); // null
		System.out.println(s1.subject); // null
		System.out.println(s1.year); // 0
		s1.name="심청이";
		s1.subject="광고과";
		s1.year=2;
		System.out.println(s1.name);
		System.out.println(s1.subject);
		System.out.println(s1.year);
		System.out.println(Student.school); // SIST. static은 동일
	}
}

 

 대상이 없음 클래스이름으로 접근 클래스명.메소드() => static메소드

 String.valueOf(10);

 (Math.random()*3);

 

 대상이 있고(값을 가지고 있음) 구별해야함 => 인스턴스

 String ss="Hello Java";

 String ss1="123456789";

 ss.replace('H', 'K');

 

 

2. 클래스 구성요소

 1) 메소드: 기능, 행위, 동작

   자판기

      동전, 음료수 => 변수(눈에 보이는 것)

      동전투입시 처리 => 메소드(동작하는 것)

      버튼 누를때 처리

 

public static void main(String[] args)

컴파일러가 메소드가 여러개면 어디서부터 시작해야 되는 지 모르니

어디서 부터 시작할 지 알려주는 것은 => main메소드 (컴파일러가 호출)

main은 static이 되어 있어야함 그래야 마음대로 끌어다 쓸 수 있음

결과값을 넘겨받고 하지 않고 출력만 하므로 void.

command line => String[] 문자열 여러개 받음

 

변수 설정 : 초기값

 = 선언과 동시에 값 주입

 = 생성자

 = 초기화블록

     = 인스턴스 초기화

          class A {

             int a; {

                a=10;

             }

          }

     = static 초기화

          class A {

            static int a;

                static {

                a=10;

                }

          }

       ==> 명시적 초기화

 

      class A {

         int a = 10; {

               a=100;

         }

         A(){

           a=1000;

         }

      }

 

순서 : 명시적초기값 1번째 => 초기화블럭 2번째 => 생성자 3번쨰

                                        ======================== 같이 사용하는 빈도가 거의 없다

 

MovieManager

import java.io.*; //파일 입출력, input&output
import java.util.*;
public class MovieManager {
	static MovieVO[] movies = new MovieVO[1938]; //null값, 저장공간 생성
	// static 모든 클래스에서 공유를 할 경우
	// 프로그램이 구동이 되면 자동으로 => 파일을 읽어서 배열에 저장
	// 초기화 블럭 {}
	static StringBuffer data = new StringBuffer();
	static {
		try {
			StringBuffer data = new StringBuffer();
			// file을 읽는 경우에는 반드시 예외처리, throws Exception은 (메소드 뒤에 붙음) 시스템에게 맡기고 회피.
			FileReader fr = new FileReader("c:\\javaDev\\movie.txt");
			
			int i=0;
			while((i=fr.read())!=-1) { // -1 EOF(End Of File)파일끝날때까지 읽어오기. read 한글자씩.
				data.append(String.valueOf((char)i)); // char => String
			}
			fr.close();
			
			String[] movieData = data.toString().split("\n"); // \n한줄씩
			int k = 0;
			for(String s:movieData) {
				String[] ss = s.split("\\|");
				
				movies[k]=new MovieVO(); // 메모리에 저장
				movies[k].mno=Integer.parseInt(ss[0]); // String[] ss이라서 1이 "1"이됨. 문자열을 정수로 바꿈
				movies[k].title=ss[1];
				movies[k].genre=ss[2];
				movies[k].poster=ss[3];
				movies[k].actor=ss[4];
				movies[k].regdate=ss[5];
				movies[k].grade=ss[6];
				movies[k].director=ss[7];
				k++;
			}
			/*
			 * 1|쇼생크 탈출|드라마|https://movie-phinf.pstatic.net/20160119_278/14531650465287bcuk_JPEG/movie_image.jpg?type=m77_110_2
			 * |팀 로빈스(앤디 듀프레인), 모건 프리먼(엘리스 보이드 레드 레딩)|2016 .02.24 재개봉, 1995 .01.28 개봉|15세 관람가|프랭크 다라본트
			 */
		}catch(Exception ex) {}
	}
	// 페이지 나누기
	static MovieVO[] movieListData(int page) {
		MovieVO[] m = new MovieVO[10];
		int i=0; //10개씩 나눠주는 변수
		int j=0; //for 횟수
		int rowSize=10; // 각 페이지당  몇개
		int pagecnt=(page*rowSize)-rowSize; //시작 위치
		/*
		 * 1 page => 0 ~ 9 배열번호 0부터 9까지 => 영화번호 1~10번
		 * 2 page => 10 ~ 19
		 */
		for(MovieVO vo:movies) {
			if(i>10) break;
			if(i<10 && j>=pagecnt) {
				m[i]=vo;
				i++;
			}
			j++;
		}
		return m;
	}
	
	static MovieVO[] movieFindData(int page) {
		MovieVO[] m = new MovieVO[50];
		int i=0; //50개씩 나눠주는 변수
		int j=0; //for 횟수
		int rowSize=50; // 각 페이지당  몇개
		int pagecnt=(page*rowSize)-rowSize; //시작 위치
		for(MovieVO vo:movies) {
			if(i>50) break;
			if(i<50 && j>=pagecnt) {
				m[i]=vo;
				i++;
			}
			j++;
		}
		return m;
	}
	
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.print("페이지 입력:");
		int page=scan.nextInt();
		MovieVO[] movie = movieListData(page);
		for(MovieVO vo : movie) {
			System.out.println("영화번호:"+vo.mno);
			System.out.println("영화명:"+vo.title);
			System.out.println("==================");
		}
	}
//public static void main(String[] args) {
//	for(MovieVO vo:movies) {
//		System.out.println("영화번호:"+vo.mno);
//		System.out.println("영화명:"+vo.title);
//		System.out.println("장르:"+vo.genre);
//		System.out.println("출연:"+vo.actor);
//		System.out.println("감독:"+vo.director);
//		System.out.println("등급:"+vo.grade);
//		System.out.println("개봉일:"+vo.regdate);
//		System.out.println("==============================");
//	}
//}
}

 

MovieList

import java.awt.*;
import javax.swing.*;

public class MovieList extends JPanel{
	JLabel la = new JLabel("영화 목록", JLabel.CENTER);
	JLabel[][] movie = new JLabel[2][5]; // 2행5열 선언(초기화x)
	// JLabel => 구분, 이미지 출력
	JLabel pLa = new JLabel("0 pages / 0 pages");
	JPanel pan = new JPanel();
	JButton b1 = new JButton("이전");
	JButton b2 = new JButton("다음");
	
	MovieList() {
		setLayout(null);
		la.setFont(new Font("굴림체", Font.BOLD, 45));
		la.setBounds(10, 15, 1260, 50);;
		add(la);
		
		pan.setLayout(new GridLayout(2,5,5,5)); //2행5열 간격 5씩
		for(int i=0; i<2; i++) {
			for(int j=0; j<5; j++) {
				movie[i][j] = new JLabel();
				//movie[i][j].setOpaque(true);
				//movie[i][j].setBackground(new Color((int)(Math.random()*256),(int)(Math.random()*256),(int)(Math.random()*256)));
				pan.add(movie[i][j]);
			}
		}
		
		//배치
		pan.setBounds(10, 75, 1260, 800);
		add(pan);
		
		JPanel p = new JPanel();
		p.add(b1);
		p.add(pLa);
		p.add(b2);
		
		p.setBounds(10, 885, 1260, 35);
		add(p);
	}
}

 

MovieFind

import java.awt.Color;
import java.awt.Font;
import javax.swing.table.*;
import javax.swing.*;

public class MovieFind extends JPanel{
	JLabel la = new JLabel("영화 검색",JLabel.CENTER);
	JLabel la2 = new JLabel("Search");
	JTextField tf=new JTextField();//검색창
	JTable table;
	DefaultTableModel model;
	TableColumn column;
	
	MovieFind(){
		setLayout(null);
		la.setFont(new Font("굴림체", Font.BOLD, 45));
		la.setBounds(10, 15, 1260, 50);;
		add(la);
		
		la2.setBounds(10, 75, 100, 35);
		add(la2);
		tf.setBounds(205, 75, 300, 35);
		add(tf);
		
		String[] col = {"순위","영화명","감독","장르","출연"};
		String[][] row = new String[0][5];
		
		model = new DefaultTableModel(row,col);
		table = new JTable(model);
		table.setRowHeight(40); //기본이 30
		table.getTableHeader().setReorderingAllowed(false); //테이블고정
		JScrollPane js = new JScrollPane(table); //스크롤바
		
		MovieVO[] movies=MovieManager.movieFindData(1);
		
		for(MovieVO vo:movies) {
			String[] temp = {
					String.valueOf(vo.mno),
					vo.title,
					vo.director,
					vo.genre,
					vo.actor
					};
			model.addRow(temp);
		}
		
		js.setBounds(10, 120, 1260, 750);
		add(js);
		
		for(int i=0; i<5; i++) {
			column = table.getColumnModel().getColumn(i);
			//TableCellRenderer render = column.getCellRenderer();
			if(i==0) {
				column.setPreferredWidth(50);
				
			}
			else if(i==1) {
				column.setPreferredWidth(250);
			}
			else if(i==2) {
				column.setPreferredWidth(220);
			}
			else if(i==3) {
				column.setPreferredWidth(150);
			}
			else if(i==4) {
				column.setPreferredWidth(450);
			}
		}
	}
}

 

MovieMainForm

import javax.swing.*; // 윈도우 관련 클래스
import javax.swing.border.LineBorder;

import java.awt.*; // 레이아웃 (화면 배치)
import java.awt.event.*; // 버튼, 텍스트에 엔터 => 행위(이벤트)
import java.net.URL;
// 자바에서 지원하는 윈도우의 모든 기능을 사용한다 JFrame이 윈도우이름
// 자바에서 상속은 한개만 가능 (단일 상속)

public class MovieMainForm extends JFrame implements ActionListener,MouseListener{
	JMenuBar bar = new JMenuBar();
	JMenuItem home = new JMenuItem("Home");
	JMenuItem find = new JMenuItem("찾기");
	JMenuItem exit = new JMenuItem("종료");
	// 실행 => 윈도우를 보여준다 => 생성자
	CardLayout card = new CardLayout();
	MovieList ml = new MovieList();
	MovieDetail md = new MovieDetail();
	MovieFind mf = new MovieFind();
	
	int curpage=1; //현재페이지
	int totalpage=194; //총페이지
	//명시적인 초기화
	
	MovieMainForm() {
		// 메뉴 설정
		JMenu menu = new JMenu("메뉴");
		menu.add(home);
		menu.add(find);
		menu.addSeparator(); // 구분선
		menu.add(exit);
		bar.add(menu);
		
		//윈도우에 설정
		setJMenuBar(bar);
		
		//레이아웃 설정
		setLayout(card);
		add("ML",ml);
		add("MF",mf);
		add("MD",md);
		
		//윈도우 크기 결정
		setSize(1300, 1000);
		
		//윈도우 보여준다
		setVisible(true);
		
		home.addActionListener(this);
		find.addActionListener(this);
		exit.addActionListener(this);
		
		ml.b1.addActionListener(this); //이전
		ml.b2.addActionListener(this); //다음 
		
		moviePrint(1);
		
		for(int i=0; i<2; i++) {
			for(int j=0; j<5; j++) {
				ml.movie[i][j].addMouseListener(this);
			}
		}
	} 
	
	void moviePrint(int page) {
		MovieVO[] movies=MovieManager.movieListData(page);
		int k=0;
		/*             1차원          2차원  (컬럼갯수만큼 나눠주고 나머지)
		 * 0 [0][0] 0/5 = 0 0%5 = 0
		 * 1 [0][1] 1/5 = 0 1%5 = 1
		 * 2 [0][2] 2/5 = 0 2%5 = 2
		 * 3 [0][3] 3/5 = 0 3%5 = 3
		 * 4 [0][4] 4/5 = 0 4%5 = 4
		 * 
		 * 5 [1][0] 5/5 = 1 5%5 = 0
		 * 6 [1][1] 6/5 = 1 6%5 = 1
		 * 7 [1][2] 7/5 = 1 7%5 = 2
		 * 8 [1][3] 8/5 = 1 8%5 = 3
		 * 9 [1][4] 9/5 = 1 9%5 = 4
		 */
		for(MovieVO vo:movies) {
			try {
				//포스터를 읽기
				URL url = new URL(vo.poster);
				Image img = getImage(new ImageIcon(url), //본인 클래스에 있기 때문에 (MovieMainForm.생략)getImage
						ml.movie[0][0].getWidth(), ml.movie[0][0].getHeight()); //크기에 맡게 이미즈 사이즈 축소
				ml.movie[k/5][k%5].setIcon(new ImageIcon(img));
				k++;
			}catch(Exception ex) {System.out.println(ex.getMessage());}
		}
		
		ml.pLa.setText(curpage+" page / "+totalpage+" pages");
	}
	static Image getImage(ImageIcon ii, int w, int h) {
		Image dimg = ii.getImage().getScaledInstance(w, h,
				Image.SCALE_SMOOTH);
		return dimg;
	}
	public static void main(String[] args) throws Exception{
		UIManager.setLookAndFeel("com.jtattoo.plaf.hifi.HiFiLookAndFeel");
		new MovieMainForm(); //생성자는 반드시 new 생성자()

	}
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==home) { //home을 클릭했다면
			card.show(getContentPane(), "ML");
		}
		else if(e.getSource()==find) { //find를 클릭했다면
			card.show(getContentPane(), "MF");
		}
		else if(e.getSource()==exit) { //exit를 클릭하면 꺼짐
			System.exit(0);
		}
		else if(e.getSource()==ml.b1) {//이전버튼 눌렸을때
			if(curpage>1) {
				curpage--;
				moviePrint(curpage);
			}
		}
		else if(e.getSource()==ml.b2) { //다음버튼 눌렸을때
			if(curpage<totalpage) {
				curpage++;
				moviePrint(curpage);
			}
		}
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		
		
	}

	@Override
	public void mousePressed(MouseEvent e) { // 마우스 눌렀을때
		
	}

	@Override
	public void mouseReleased(MouseEvent e) { // 마우스 눌리고 뗐을때

		
	}

	@Override
	public void mouseEntered(MouseEvent e) {// 마우스 갖다댔을때
		for(int i=0; i<2; i++) {
			for(int j=0; j<5; j++) {
				if(e.getSource()==ml.movie[i][j]) {
					LineBorder line = new LineBorder(Color.orange,5);
					ml.movie[i][j].setBorder(line);
				}
			}
		}
	}

	@Override
	public void mouseExited(MouseEvent e) { // 마우스 벗어나면 원상복귀
		for(int i=0; i<2; i++) {
			for(int j=0; j<5; j++) {
				ml.movie[i][j].setBorder(null);
			}
		}
	}

}

 

반응형
Comments