들어가기 전에...

처음 들어오신 분은 아래 페이지를 먼저 읽어보도록 합시다

https://ondolroom.tistory.com/265

 

자바 프로그램을 함수화(모듈화) 하기

*해당 문서는 본인의 사견이 포함되어 있으므로, 정석이 아닌 점을 참고해주세요. 프로그램과 모듈 1. 프로그램 main이 포함되어 있어서 실행이 가능한 코드를 프로그램이라고 한다. 2. 모듈 아래와 같이 main이..

ondolroom.tistory.com

https://ondolroom.tistory.com/266

 

공공데이터를 사용하기 요약

들어가기 전에... 먼저 프로그램은 모두 간단한 원리부터 파악하고 제작 해야한다. hello, world!를 출력하는 프로그램이나 공공데이터를 받아와서 출력 하는 프로그램이나 원리는 같다. 코드 길이가 조금 더 길어..

ondolroom.tistory.com

 

공공데이터 모듈 만들기

공공데이터 사용하기 내용에서 모듈을 살짝 바꾸었다

String을 리턴하는게 아닌

객체 그 자체를 리턴하도록 변경(안의 모든 데이터를 이용할 수 있기위함)

 

WindowBuilder로 GUI만들기

WindowBuilder를 이용하여

검색할 위치 + Jtextfield

검색버튼

출력될 내용을 보여줄  JtextArea를 제작

 

 

전역에서 필요한 기능을 미리 선언해두기

위 GUI에서 우리는

검색버튼을 누르면

JtextField의 내용을 가져와서 가공하여

JtextArea에 넣어줘야한다

 

JtextField의 내용을 가져오고
JtextArea에 내용을 넣기 위해서는 전역공간에 있어야한다는 점을 참고하자

 

 

JButton에 리스너 추가하기

기본 상태의 initialize() 모습.

우리는 여기서 JButton에 리스너를 추가해야한다

 

 

테스트

이제 실행시키면 잘 작동한다

들어가기 전에...

먼저 프로그램은 모두 간단한 원리부터 파악하고 제작 해야한다.

hello, world!를 출력하는 프로그램이나 공공데이터를 받아와서 출력 하는 프로그램이나 원리는 같다.

코드 길이가 조금 더 길어졌을 뿐이다.

공공데이터를 이용하든, String을 이용하든 결국엔 모듈화 하여 기능을 실행하게 된다.

https://ondolroom.tistory.com/265

 

자바 프로그램을 함수화(모듈화) 하기

*해당 문서는 본인의 사견이 포함되어 있으므로, 정석이 아닌 점을 참고해주세요. 프로그램과 모듈 1. 프로그램 main이 포함되어 있어서 실행이 가능한 코드를 프로그램이라고 한다. 2. 모듈 아래와 같이 main이..

ondolroom.tistory.com

위의 링크 내용을 숙지하고 아래 이미지를 보자

 

 

 

공공데이터 처리

1.순서

공공데이터 링크확인
http://www.jsonschema2pojo.org/ 으로 Class파일 쉽게 만들기
Gson으로 Json -> 자바객체 전환하기
이용하기

Gson 이 설치 되지 않으신 분들은 미리 설치하시고 시작해주세요

 

2. 적용 과정

1) 예시로 링크 주소는 공적 마스크 판매 약국 데이터로 한다

https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/stores/json?page=1

 

2) 해당 링크로 인터넷에서 접속해보면 아래와 같이 나온다

 

3) 해당 데이터를 이용해서 데이터를 담을 Class 를 만들어보자

아래 데이터를 긁어서 http://www.jsonschema2pojo.org/ 사이트에 넣어보자

{
  "count": 487,
  "page": "1",
  "storeInfos": [{
    "addr": "충청남도 홍성군 갈산면 상촌로 12-1",
    "code": "34840559",
    "lat": 36.6029863,
    "lng": 126.5489114,
    "name": "신신약국",
    "type": "01"
  }, {
    "addr": "대구광역시 달서구 달구벌대로 1736 1층 (두류동)",
    "code": "37844571",
    "lat": 35.856678,
    "lng": 128.5552778,
    "name": "밝은온누리약국",
    "type": "01"
  }],
  "totalCount": 26776,
  "totalPages": 54
}

 

 

Preview를 누르면 각각의 파일이름과 내용이 생성 된다

이클립스에 파일을 만들어서 각각 붙여넣기를 하자

 

4 ) 공공데이터 출력하기

 

위 코드에 아래 코드를 넣고 조금만 수정하면된다!

아래코드는 외울 필요 없이 어디 저장해놓고 두고두고 사용하자

		try {
			// 1번 주소 객체 만들기
			URL url = new URL("json링크 주소 입력");

			// 2번 스트림 연결
			HttpURLConnection con = (HttpURLConnection) url.openConnection();

			// 3번 버퍼 연결 (문자열)
			BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));

			// 4. 문자 더하기
			StringBuilder sb = new StringBuilder();

			// 스트링빌더에 버퍼에서 받은 문자열을 한줄씩 추가하기
			String input = "";
			while ((input = br.readLine()) != null) {
				sb.append(input);
			}
			
			// 입력이 잘 되었는지 테스트
			System.out.println(sb.toString());
			System.out.println();

			br.close(); // 버퍼 닫기
			con.disconnect(); // 스트림 닫기

			// 5. 자바 오브젝트로 변환
			Gson gson = new Gson();
			Air air = gson.fromJson(sb.toString(), Air.class);

		} catch (Exception e) {
			e.printStackTrace();
		}

 

우리가 바꿀 것은 몇가지 없다.

url 주소넣기
자바 오브젝트 이름을 내가 정한 이름으로 바꾸기
리턴해주기

 

3. main에서 출력하기!

*해당 문서는 본인의 사견이 포함되어 있으므로, 정석이 아닌 점을 참고해주세요.

프로그램과 모듈

1. 프로그램

main이 포함되어 있어서 실행이 가능한 코드를 프로그램이라고 한다.

 

2. 모듈

아래와 같이 main이 아닌 함수만 있어서 독립적으로 실행하지 못하는 코드를 모듈이라고 한다.

 

모듈을 이용하는 방법

1. 같은 파일 내에 있는 모듈

main에서 해당 기능이 있는 클래스.메서드() 를 이용하여 호출한다.

(이 파일에는 모듈도 있고 실행 시킬 수 있는 main이 있으니, 결과적으로 프로그램이다. )

 

2. 패키지는 같지만 다른 파일 내에 있는 모듈

아래 그림처럼 패키지는 같지만 다른 파일로 나뉘어 있을 경우

같은 파일에 있는 모듈을 사용하는 것 처럼 쉽게 이용가능하다.

Say.java
Function1.java

 

3. 패키지가 다른 모듈

아래 그림처럼 패키지가 다른 경우

모듈이 될 클래스나 기능들은 public으로 작성해야 불러올 수 있다. 

exModule.Say.java

 

main이 있는 파일에서는 모듈을 import 해와야 한다.

example.Function1.java

 

*exModule에 있는 코드에서 public을 제거 해보고 테스트도 해보자.

 

ps. 생성자를 함수처럼 사용 가능하다

아래 그림과 같이 Say의 생성자에 기능을 넣고 

main에서 해당 클래스를 인스턴스화 하면 생성자가 실행 된다.

스윙 컴포넌트

package ch11;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class JComponentEx extends JFrame {
	
	private JButton b1, b2, b3;
	
	
	public JComponentEx(){
		setTitle("JComponent의 공통 메소드 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		b1 = new JButton("Magenta/Yellow Button");
		b2 = new JButton("___Disabled Button___");
		b3 = new JButton("getX(), getY()");
		
		b1.setBackground(Color.YELLOW); // 백그라운드
		b1.setForeground(Color.MAGENTA); // 포그라운드
		b1.setFont(new Font("Arial", Font.ITALIC, 20));
		b2.setEnabled(false);
		b3.addActionListener(new ActionListener() {
			
			//타겟 (콜백되는)
			@Override
			public void actionPerformed(ActionEvent e) {
				//JButton b = (JButton)e.getSource(); // Object를 리턴하기 때문에 다운캐스팅!!
				b3.setText("hello");
				//JComponentEx frame = (JComponentEx)b.getTopLevelAncestor();
				//frame.setTitle(b.getX() + "," + b.getY());
			}
		});
		
		c.add(b1); c.add(b2); c.add(b3);
		
		setSize(260, 200);
		setVisible(true);
		
		
		
	}
	
	public static void main(String[] args) {
		new JComponentEx();
	}
}

 

여러 버튼에 같은 리스너 적용

package ch11;

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

import javax.swing.JButton;
import javax.swing.JFrame;

public class JComponentEx01 extends JFrame implements ActionListener{

	private JButton b1, b2, b3;
	
	// 타겟
	@Override
	public void actionPerformed(ActionEvent e) {
		JButton b = (JButton) e.getSource();
		b.setText("Hello");
	}
	
	public JComponentEx01() {
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		b1 = new JButton("b1");
		b2 = new JButton("b2");
		b3 = new JButton("b3");
		
		b1.addActionListener(this);
		b2.addActionListener(this);
		b3.addActionListener(this);
		
		c.add(b1);
		c.add(b2);
		c.add(b3);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(260, 200);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new JComponentEx01();
	}

}

.

다양한 시간 포맷팅 방법

package dateex;

import java.util.Calendar;

public class CalenderEx {
	// 2020-03-18
	public static void printCalender(String msg, Calendar cal) {
		int year = cal.get(Calendar.YEAR); // 2020 
		
		int month = cal.get(Calendar.MONTH) + 1; // 1월은 0으로 나온다. 그래서 +1해줘야함
		String mon = (month < 10)?"0" + month:"" + month;
		
		int day = cal.get(Calendar.DAY_OF_MONTH);
		String day1 = (day < 10)?"0" + day:"" + day;
		
		int hour = cal.get(Calendar.HOUR_OF_DAY);
		String hour1 = (hour < 10)?"0" + hour:"" + hour;
		
		int minute = cal.get(Calendar.MINUTE);
		String minute1 = (minute < 10)?"0" + minute:"" + minute;
		
		int second = cal.get(Calendar.SECOND);
		String second1 = (second < 10)?"0" + second:"" + second;
		
		System.out.println(msg + " " + year+"-"+mon+"-"+day+":"+hour1+":"+minute1+":"+second1);
		
	}
	
	public static void main(String[] args) {
		Calendar a = Calendar.getInstance(); // 싱글톤
		
		printCalender("현재", a);
	}
}

 

Calender

 

java.util.Date

getDay()의 빨간줄은 더 이상 사용하지 말라는 뜻(유예를 주는 것)

 

java.sql.Date

 

 

java.sql.Timestamp

 

LocalDate

 

자바에서 시간을 만들어서 DB에 넣는 것이 IO가 줄어들어서 빠르게 작동한다

HashSet // TreeSet

package dateex;

import java.util.HashSet;
import java.util.Random;

public class Lotto {
	public static void main(String[] args) {
		
		
		// HashSet 순서가 없음 (엄청빠름)
		// TreeSet 순서대로 정렬 (HashSet보다 느림)
		HashSet<Integer> lotto = new HashSet<>();
		Random r = new Random();
		
		while (lotto.size() < 6) {
			int value = r.nextInt(45) + 1;
			lotto.add(value);
		}

		System.out.println(lotto);
		
	}
}

.

StringTokenizer

package dateex;

import java.util.StringTokenizer;

public class StringTokenizer1 {
	public static void main(String[] args) {
		
		StringTokenizer st = new StringTokenizer("a=3,b=5,c=6", ","); // 구분자로 ',' 사용
		
		while (st.hasMoreTokens()) {
			System.out.println(st.nextToken());
		}
		
	}
}

.

------------------------------

클래스 구성
1. 멤버변수
2. 생성자 메서드
3. 일반 메서드
4. 내부 클래스

------------------------------

생성자의 역할

멤버변수에 대한 초기화

------------------------------

메서드의 역할

 

------------------------------

스태틱 메서드를 쓰는 이유

프로그램에서 공통적으로 사용하는 기능

공유를 위함

스태틱 멤버변수를 쓰기 위하여 사용

------------------------------

try catch를 쓰는 이유

에러에는 컴파일에러 / 런타임에러가  있다

컴파일 에러는 코드 작성시에 고칠 수 있지만
런타임 에러는 미리 예측하기가 어렵다

예측하기 어려운 런타임 에러를 대응하기 위해
try catch를 사용한다

엄밀하게는 if문 등을 이용해서 예외를 없도록 만드는 것이 좋으나
자바는 예외처리가 필요한 기능은 무조건 try catch를 써야한다

------------------------------

입력

1. System -> 자바에서 System 클래스는 Console OS를 말한다 (System.in)
2. 파일 입출력
3. 네트워크 입출력

------------------------------

ip 는 네트워크의 주소다 (랜카드 기준)

맥어드레스 - 랜카드의 고유한 번호

여러 아이피를 쓰려면 랜카드를 여러개 꽂으면 된다

------------------------------

드라이버

컴퓨터는 여러회사의 부품이 섞여있다.

그러므로 운영체제가 모든 하드웨어의 정보를 알 수 없다.
드라이버를 설치하면 운영체제가 하드웨어를 제어할 수 있게 된다.

자바에서도 마찬가지다.

자바에 오라클DB에 대한 드라이버를 설치하면
자바에서 오라클DB를 연동해서 사용할 수 있다. 

DB를 위한 자바클래스
1.Connection -> 연결
2.Statement -> 질의
3.ResultSet -> 응답 (결과 집합)

받아온 데이터를 String으로 변환

sql디벨로퍼의 폴더 안에 ojdbc.jar 를 찾는다

+ 자바 lib폴더에 넣고 빌드패스

 

'Programming Language > Java' 카테고리의 다른 글

자바 HashSet // TreeSet  (0) 2020.04.24
자바 StringTokenizer  (0) 2020.04.24
자바 그래프 만들기 (xml, json, gson, 공공데이터, SWING)  (0) 2020.04.22
자바 SWING 리스너  (0) 2020.04.22
20200421  (0) 2020.04.21

+ Recent posts