이안의 평일코딩

JAVA의 정석 28일차 - java.lang패키지 Object클래스 본문

Back-end/Java

JAVA의 정석 28일차 - java.lang패키지 Object클래스

이안92 2020. 7. 22. 12:25
반응형

2020.07.22(수)

 

package com.sist.lang;
import java.util.*;
import java.sql.*;

public class MainClass {

	public static void main(String[] args) {
		java.util.Date date = new java.util.Date();
		//util, sql 패키지 둘다 date가 있어서 패키지 붙어서 사용하면 import 생략하도 가능
		javax.swing.JFrame f = new javax.swing.JFrame(); //import 생략가능
		
	}
}

 

1. java.lang

  = Object

     1) 최상위 클래스 => 모든 데이터형을 포함

        class A

        object obj = new A();

        object obj = 10.5;

        object[] obj = {new A(), 10.5, 100, 'A', "Hello"}

        double[] d = {10.5, 'A', 100, 10.5F}

     2) 모든 클래스(사용자 정의) => 상속을 내린다

        =============== Object가 가지고 있는 모든 기능을 사용할 수 있다

     3) 주요 기능(메소드)

         clone() => prototype : 복제(메모리 복제)

         

class A {
      int a = 10;
}

class B extends A {
      // int a;
      public B() {
         this.a=100; // 자신의 클래스
         super.a=200; // 상속을 내린 상위 클래스
       }
}

상속

  extends(단일 상속) ====> class로부터 상속

  implements(다중 상속) => interface로부터 상속

 

클래스

 1) new => 처음부터 시작

 2) 참조 => 클래스 => 매개변수로 전송

     메소드를 통해서 전송

 3) 복제 => 변경된 것부터 시작

 

package com.sist.lang;
class A implements Cloneable{
	int aa=10;
	public A clone() {
		A a = new A();
		try {
			a = (A)super.clone();
			/*
			 *  Object (double)
			 *  A (int)
			 *  
			 *  double d = 10;
			 *  int a = (int)10.5
			 *  A a = (A)new Object()
			 */
		}catch(Exception e) {}
		return a;
	}
}
public class MainClass {

	public static void main(String[] args) {
		A a = new A();
		a.aa=100;
		A b = new A();
		System.out.println(b.aa); // 10
		
		// 별칭, 같은 메모리를 참조
		A c = new A();
		System.out.println(c.aa); // 10
		
		c.aa=100;
		A d = c; // 동일한 저장 장소를 가지고 있다
		System.out.println(d.aa); // 100
		
		d.aa=1000;
		System.out.println(c.aa); // 1000
		
		A e = c.clone();
		System.out.println(e.aa); // 1000
	}
}

 

 class A {

    int aa = 10;

 }

 A aaa = new A();

   => display(aaa); ==> aaa.aa => 1000 : Call By Reference (참조에 의한 호출)

                                                       (Call By Value (값에 의한 호출))

 public void display(A a) {

    a.aa = 1000;

 }

 

* Call by value와 Call by reference

package com.sist.lang;
class Change{
	int x,y;
	/* 멤버변수들은 초기값을 갖고있다
	 * int => 0
	 * String => null
	 * class => null
	 * double => 0.0
	 * boolean => false
	 */
}
// Change => x=0, y=0
public class MainClass2 {
	public void swap2(Change c) {
		int temp = c.x;
		c.x = c.y;
		c.y = temp;
	}
	public void swap(int a, int b) {
		int temp = a;
		a = b;
		b = temp;
	}
	public static void main(String[] args) {
		MainClass2 m = new MainClass2();
		int x = 10;
		int y = 20;
		System.out.println("변경전:x="+x+" y="+y); //변경전:x=10 y=20
		m.swap(x,y);
		System.out.println("변경후:x="+x+" y="+y); //변경후:x=10 y=20
		//call by value 메모리가 다른 공간이라서 바뀌지 않음 일반변수가 넘어가면 (String은 일반변수 취급)
		
		Change c = new Change();
		c.x=10;
		c.y=20;
		System.out.println("변경전:x="+c.x+" y="+c.y); //변경전:x=10 y=20
		m.swap2(c);
		System.out.println("변경후:x="+c.x+" y="+c.y); //변경후:x=20 y=10
		//call by reference 주소값을 참조하기 때문에 넘겨준 클래스가 바뀜 (String제외 나머지 클래스 다 바뀜)
	}

}
package com.sist.lang;
class B{
	int x,y;
}

public class MainClass3 {

	public static void main(String[] args) {
		// Call By Value => 값을 전송 ==> 매개변수 전송법 (메모리 다른 메모리)
		int x=10;
		int y=20;
		
		int i=x;
		int j=y;
		
		int temp=i;
		i=j;
		j=temp;
		
		System.out.println("x="+x+",y="+y); //x=10,y=20
		System.out.println("i="+i+",j="+j); //i=20,j=10

		
		// Call By Reference => 주소 전송
		B b = new B();
		b.x = 10;
		b.y = 20;
		B c = b; // 참조 => swap(B c) ==> swap(b)
		c.x = 100;
		c.y = 200;
		System.out.println("b="+b); //b=com.sist.lang.B@15db9742
		System.out.println("c="+c); //c=com.sist.lang.B@15db9742 메모리 주소가 동일
		System.out.println(b.x); // 100
		System.out.println(b.y); // 200
		/*
		 *  매개변수 => class, 배열 ==> 원본 (->주소, 기존 값 변경됨)
		 *  매개변수 => 기본형 데이터, String ==> 복사본 (값 변경안됨) 
         *   ==>
		 *    메모리(클래스) => 같이 사용 (참조)
		 *    메모리(클래스) => 이미 만들어진 클래스를 사용 => 복제 => clone()
		 *    메모리(클래스) => 새로운 내용(처음부터 사용) => new
		 */
	}
}

 

  = String

  = StringBuffer

  = System

  = Math

  = Wrapper : 모든 데이터형을 사용하기 쉽게 클래스로 변경

     Double => double

     Byte => byte

     Integer => int

     Boolean => boolean

     ================ 박싱 / 언박싱

     Integer i = 10; =>박싱

     Integer i = new Interger(100); =>박싱

     int k = i; => 언박싱  

 

 

  인터페이스
   = 변수 => 상수형 변수  ===> public static final
                       int a =10;
   = 메소드 => 추상메소드 => public abstract
                      void display();
                      구현이 안된 메소드 => 메모리 할당이 불가능
   = 다중상속이 가능
   = 서로 다른 클래스를 연결이 가능
                       extends
   = 인터페이스 ======> 인터페이스 상속
                     implements
   = 인터페이스 ======> 클래스 상속

package com.sist.lang;
// toString() => 클래스 객체를 문자열로 변환 String toString()
// clone => Object clone()
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.table.*;

public class MainClass4 extends JFrame{ //Window
	JTable table;
	DefaultTableModel model;
	public MainClass4() {
		String[] col = {"이름", "나이", "주소"};
		String[][] row = new String[0][3]; //줄(추가시 add사용), 데이터
		
		model = new DefaultTableModel(row, col) { //내용 <tr> <td></td> </tr>
			// 메소드 재정의(Override) => 클릭시에 편집 방지
			public boolean isCellEditable(int r, int c) {
				return false;
			}
			//public void aaa() { //메소드 추가도 가능
			//}
		};
		
		table = new JTable(model); //껍데기(화면디자인) MV패턴(모델,뷰) <table></table>
		JScrollPane js = new JScrollPane(table);
		
		add("Center",js);
		for(int i=0; i<10; i++) {
			String[] data = {"홍길동"+(i+1), "30", "서울"};
			model.addRow(data);
		}
		// toString(), (String) 둘 중 하나 선택해서 문자열로 형변환
		
		setSize(350, 400);
		setVisible(true);
	}
	public static void main(String[] args) {
		new MainClass4();

	}
}

 


  2. java.lang
   1) Object (모든 데이터형을 받아서 저장)
     - clone : Spring
     - finalize() : 소멸자

package com.sist.lang;

class C{
	public void display() {
		System.out.println("C:display() Call...");
	}
	
	@Override //source - override Methods
	protected void finalize() throws Throwable {
		System.out.println("메모리 해제");
	}
	
}
public class MainClass5 {

	public static void main(String[] args) {
		C c =new C();
		c.display();
		//소멸
		c=null; //GC대상
		System.gc();
	}
}

 

    - toString() : 문자열 변환
   
   2) String
     - trim() 공백제거

     - substring() 문자자르기

     - length() 문자길이

     - indexOf() 문자찾기

     - lastIndexOf()

     - equals() 동일한지

     - valueOf() 문자로 데이터형 변경

     - contains() 포함

     - startsWith() 

     - endsWith() 

     - replace() 


   3) Math
     - random()

     - ceil() => 올림 (페이지 나누기) => 오라클


   4) System
     - println()
     - exit()
     - gc()
    
   5) StringBuffer
     - 문자열 결합 => append() 


   6) Thread
     - start(), run()

 

 

3. CGV

 

MovieVO (getter/setter)

package com.sist.cgv;
/*
블루 아워
예매율 8.7%
감독 : 하코타 유코 
배우 : 카호 ,  심은경
장르 : 드라마
기본 : 12세 이상, 092분, 일본
개봉 : 2020.07.22
 */
public class MovieVO {
	private int mno; //영화 고유번호
	private String title;
	private String reserve;
	private String director;
	private String actor;
	private String genre;
	private String grade;
	private String time;
	private String from;
	private String regdate;
	private String story;
	private String poster;
	
	//읽기쓰기 되야함 getter/setter 캡슐화
	
	public int getMno() {
		return mno;
	}
	public void setMno(int mno) {
		this.mno = mno;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getReserve() {
		return reserve;
	}
	public void setReserve(String reserve) {
		this.reserve = reserve;
	}
	public String getDirector() {
		return director;
	}
	public void setDirector(String director) {
		this.director = director;
	}
	public String getActor() {
		return actor;
	}
	public void setActor(String actor) {
		this.actor = actor;
	}
	public String getGenre() {
		return genre;
	}
	public void setGenre(String genre) {
		this.genre = genre;
	}
	public String getGrade() {
		return grade;
	}
	public void setGrade(String grade) {
		this.grade = grade;
	}
	public String getTime() {
		return time;
	}
	public void setTime(String time) {
		this.time = time;
	}
	public String getFrom() {
		return from;
	}
	public void setFrom(String from) {
		this.from = from;
	}
	public String getRegdate() {
		return regdate;
	}
	public void setRegdate(String regdate) {
		this.regdate = regdate;
	}
	public String getStory() {
		return story;
	}
	public void setStory(String story) {
		this.story = story;
	}
	public String getPoster() {
		return poster;
	}
	public void setPoster(String poster) {
		this.poster = poster;
	}
}

 

MovieManager (데이터 긁어오기 Build Path - External JARs - Jsoup)

package com.sist.cgv;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class MovieManager {
	static MovieVO[] movies = new MovieVO[7]; //데이터 채워오기
	static {
		try {
			Document doc = Jsoup.connect("http://www.cgv.co.kr/movies/").get();
			Elements link = doc.select("div.box-contents a");
			int j = 0;
			for(int i=0; i<7; i++) {
				movies[i] = new MovieVO();
				// <a href="/movies/detail-view/?midx=83160"></a> => attr()
				// <a>aaaa</a> => text()
				//System.out.println("http://www.cgv.co.kr"+link.get(j).attr("href"));
				Document doc2 = Jsoup.connect("http://www.cgv.co.kr"+link.get(j).attr("href")).get();
				Element title = doc2.selectFirst("div.title strong");//(Element 하나씩 가져옴)
									//select().get(0);
				Element poster = doc2.selectFirst("span.thumb-image img");
				Element grade = doc2.selectFirst("span.ico-grade");
				Element reserve = doc2.selectFirst("strong.percent span");
//				Elements dt = doc2.select("div.spec dd");
//				for(int k=0; k<dt.size(); k++) {
//					System.out.println("==========");
//					System.out.println(dt.get(k).text());
//					System.out.println("==========");
//				}
				Element director = doc2.select("div.spec dd").get(0);
				//System.out.println(director.text());
				movies[i].setDirector(director.text());
				
				Element actor=doc2.select("div.spec dd").get(2);
				//1번 프로듀서는 없는영화도있고 있는영화도 있는데 없는 영화는 공백으로 처리되어 있어서 2번 사용함
				//System.out.println(actor.text());
				movies[i].setActor(actor.text());
				
				Element etc=doc2.select("div.spec dd").get(4);
				//System.out.println(etc.text());
				String[] temp = etc.text().split(","); //전체, 124분, 이탈리아
				movies[i].setTime(temp[1].trim()); // 124분
				movies[i].setFrom(temp[2].trim()); // 이탈리아
				
				Element regdate=doc2.select("div.spec dd").get(5);
				//System.out.println(regdate.text());
				movies[i].setRegdate(regdate.text());
				
				if(i==0) { //반도만 프로듀서가 있어서 0번(반도)
					Element genre = doc2.select("div.spec dt").get(3);
					//System.out.println(genre.text());;
					movies[i].setGenre(genre.text().substring(genre.text().indexOf(":")+1).trim());
													//(장르 : )자르기
				}
				else {
					Element genre = doc2.select("div.spec dt").get(2);
					//System.out.println(genre.text());;
					movies[i].setGenre(genre.text().substring(genre.text().indexOf(":")+1).trim());
				}
				
				//System.out.println(title.text());
				movies[i].setTitle(title.text());
				//System.out.println(poster.attr("src"));
				movies[i].setPoster(poster.attr("src"));
				//System.out.println(grade.text());
				movies[i].setGrade(grade.text());
				//System.out.println(reserve.text());
				movies[i].setReserve(reserve.text());
				movies[i].setMno(i+1); //영화번호
				Element story = doc2.selectFirst("div.sect-story-movie");
				movies[i].setStory(story.text());
				
				j+=2;
			}
		}catch(Exception ex) {}
	}
	public static void main(String[] args) {
//		MovieManager m = new MovieManager();
//		for(MovieVO vo : movies) {
//			System.out.println("================");
//			System.out.println("영화번호:"+vo.getMno());
//			System.out.println("제목:"+vo.getTitle());
//			System.out.println("감독:"+vo.getDirector());
//			System.out.println("출연:"+vo.getActor());
//			System.out.println("장르:"+vo.getGenre());
//			System.out.println("등급:"+vo.getGrade());
//			System.out.println("상영시간:"+vo.getTime());
//			System.out.println("국가:"+vo.getFrom());
//			System.out.println("상영일:"+vo.getRegdate());
//			System.out.println("예매일:"+vo.getReserve());
//			System.out.println("줄거리:"+vo.getStory());
//		}
	}
}

 

MovieListPanel

package com.sist.cgv;
import java.awt.*;
import javax.swing.*;
import java.net.*;

public class MovieListPanel extends JPanel{
	JLabel[] poster = new JLabel[7];
	public MovieListPanel() {
		MovieVO[] movies = MovieManager.movies; //MovieManager의 static 자동호출
		setLayout(null);
		JPanel p = new JPanel();
		p.setLayout(new GridLayout(1,7,5,5)); //한줄에 7개 간격5
		int i = 0;
		for(MovieVO vo : movies) {
			try { //그림파일 외부에서 가져오므로 예외처리
				URL url = new URL(vo.getPoster());
				poster[i] = new JLabel();
				p.add(poster[i]);
				Image ii = getImage(new ImageIcon(url),
						105, 200);
				poster[i].setIcon(new ImageIcon(ii));
				i++;
			}catch(Exception ex){}
		}
		
		setLayout(null);
		p.setBounds(10, 15, 760, 300);
		add(p);
	}
	public static Image getImage(ImageIcon ii, int w, int h) { //크기 맞게 맞춰줌
		Image dimg = ii.getImage().getScaledInstance(w, h,
				Image.SCALE_SMOOTH);
		return dimg;
	}
}

 

CGVMainFrame

package com.sist.cgv;

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

public class CGVMainFrame extends JFrame{ //윈도우창에
	CardLayout card = new CardLayout();
	MovieListPanel mp = new MovieListPanel();
	public CGVMainFrame() {
		setLayout(card);
		add("MP",mp);
		setSize(800, 600);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE); //메모리 누적 방지
	}

	public static void main(String[] args) {
		new CGVMainFrame();
	}

}
반응형
Comments