일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 정보처리기사실기요약
- Java의정석
- react
- 타입스크립트
- 자바스크립트
- spring
- 스프링
- javascript
- 정보처리기사정리
- 정보처리기사요약
- 이안의평일코딩
- 코딩테스트
- 정보처리기사실기정리
- 국비코딩
- php
- 국비IT
- 오라클
- 정보처리기사실기
- Oracle
- ReactNative
- 리액트네이티브
- CSS
- 리액트
- 평일코딩
- typescript
- 자바의정석
- 자바스크립트 코딩테스트
- 정보처리기사
- 자스코테
- VUE
- Today
- Total
이안의 평일코딩
JAVA의 정석 20일차 - 클래스 생성 본문
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);
}
}
}
}
'Back-end > Java' 카테고리의 다른 글
JAVA의 정석 22일차 - 객체지향 다형성 (0) | 2020.07.14 |
---|---|
JAVA의 정석 21일차 - 객체지향 캡슐화, 상속 (0) | 2020.07.13 |
JAVA의 정석 18일차 - 멤버변수와 공유변수 (0) | 2020.07.08 |
JAVA의 정석 17일차 - 메소드 응용 (0) | 2020.07.07 |
JAVA의 정석 16일차 - 메소드 (0) | 2020.07.06 |