설명은 주석으로.
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Window {
public static void main(String[] args) {
JFrame frame = new JFrame("첫 GUI 프로그램"); //자바프레임 제목
JLabel label = new JLabel("Hello World"); //자바프레임 라벨 내용
JButton button = new JButton("누르지마"); //자바프레임 버튼에 쓰일 내용
button.addActionListener(new ActionListener() { //자바프레임 버튼을 눌렀을 때 동작
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("누르지말라고"); // 콘솔창에 출력.
label.setText("눌러버렸구만"); // 자바프레임 라벨내용 변경.
}
});
frame.getContentPane().setLayout(new FlowLayout()); //컨텐트팬에 flowlayout 설정.라벨이나 버튼 놓을 공간을 형성한다 생각하자. 참고로 이걸 안적으면 라벨이 있을 칸이 전부 버튼이 차지한다.
frame.getContentPane().add(label); //컨텐트팬에 라벨포함.
frame.getContentPane().add(button); //컨텐트팬에 버튼포함.
//setDefaultCloseOperation은 system 의 exit 메소드를 사용해 어플리케이션을 종료한다. 어플리케이션으로만 사용.
//이를 지정하지 않으면 메인프레임을 닫았는데도 JFrame객체는 JVM에서 계속 살아서 실행된다.
// 즉 사용자에게 보여지는 View는 종료되었지만 프로그램은 계속 실행중인 상태가 된다. 라고 함.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 100); //프레임 크기 조절.
frame.setVisible(true); //프레임을 화면에 보여줄 것인가? 없으면 안나옴.
}
}
<결과>

package com.day_14;
import java.io.FileWriter;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
public class Main {
public static void main(String[] args) throws Exception {
URL url = new URL("https://www.naver.com");
InputStream inputStream = url.openStream(); //url의 Stream을 반환.
int i = inputStream.read(); //스트림으로부터 한 바이트를 읽고 int값으로 반환한다.(문자의 아스키코드 int형번호)
FileWriter fw = new FileWriter("naver.html"); //naver.html 파일 생성. naver.txt라 적으면 txt파일 생성.
while (i != -1){ // url 내용이 끝날 때까지 읽는다.하나씩 읽음. inputStream.read()에서 읽을내용이 없으면 -1 반환함.
char ch = (char) i; // int형 아스키코드를 char 으로 변환 ex)33 -> ! / c -> 99
System.out.print(ch); // 콘솔창에 출력.
//System.out.println(i); // i와 ch가 아스키코드인지 확인용.
fw.write(ch); //naver.html 파일에 내용 입력.
i = inputStream.read(); //inputStream.read()를 할때마다 저장된 Stream을 순차적으로 읽는다.
}
fw.close();
}
}



Filewriter.close를 쓰는 이유
파일은 파일시스템이나 기타 다른 곳에 있으므로 이 내용을 스트림으로 읽어 들이는데 메모리를 소모합니다. 작업이 끝나면 close()를 호출하여 스트림을 닫아 종료된 작업에 대해 메모리를 확보해야 합니다.
출처: https://yangbox.tistory.com/64 [양's World]
- 설치방법 : https://dev-hanryangee.tistory.com/12 참고
- 오늘 한거 찾을 키워드
(1) 안드로이드 스튜디오 Device Manager / 가상 디바이스
(2) 안드로이드 스튜디오 my application(https://devlog-h.tistory.com/25)참고- ※기억안나는 사용방법은 필요하면 찾아서 공부해서 알아보자. 책보고 일일히 공부하는것보다 필요한 부분만 찾아서 해보고 공부하는게 나은 것 같다.
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Map<Integer, Integer> pictures = new HashMap<>();
Map<Integer, String> name = new HashMap<>();
pictures.put(1, R.drawable.img);
pictures.put(2, R.drawable.img_1);
pictures.put(3, R.drawable.img_2);
name.put(1,"수지"); //res-drawable파일에 따로 저장해놓음.
name.put(2,"나은");
name.put(3,"윤아");
Button button = findViewById(R.id.button);
TextView textView = findViewById(R.id.textView);
ImageView imageView = findViewById(R.id.imageView2);
Random random = new Random();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Toast.makeText(MainActivity.this, "뭐라할까", Toast.LENGTH_SHORT).show();
int num = random.nextInt(3) + 1;
textView.setText("num = " + num);
imageView.setImageResource(pictures.get(num));
Toast.makeText(MainActivity.this, name.get(num), Toast.LENGTH_SHORT).show();
}
});
}
}
<참고>
1.MainActivity.java

2.activity.main.xml - activity 화면 출력조정 UI기능

머신러닝 관련 툴. 미디어파이프 홈페이지에 나온 기능 거의 다 있는 듯.
https://github.com/googlesamples/mlkit 들어가서 다운받고 해보기. 하는법은 구글링.
참고로 실제폰에도 적용가능.