💡 URECA

[URECA] DAY 12 | 자바(4)

코딩하세현 2025. 2. 11. 15:55
728x90

인터페이스는 계열에 가깝다. 

String (Java Platform SE 8 )

 

String (Java Platform SE 8 )

Compares two strings lexicographically. The comparison is based on the Unicode value of each character in the strings. The character sequence represented by this String object is compared lexicographically to the character sequence represented by the argum

docs.oracle.com

 

Serializable계열 <- 마커 인터페이스

                                 client                          server

                                 🖥️    ←(1byte씩 흐름)→ 🖥️ (양방향 통신)

                   이동(보내는)절차 필요             복원절차 필요

                   포장이사 가능(비용 ↑)

stream: 1byte 흐름

 

Interface ResultSet

Component -> reuse 설계

 

String/ StringBuffer/StringBuilder의 시간 복잡도와 공간 복잡도

 

  String(불변 객체, Immutable) StringBuffer (가변 객체, 동기화 지원) StringBuilder (가변 객체, 동기화 미지원)
정의 String 객체는 한 번 생성되면 변경할 수 없는 불변(Immutable) 객체 StringBuffer는 가변(Mutable) 객체이며, 멀티스레드 환경에서 안전하게 동작 StringBuilder는 StringBuffer와 동일한 가변 객체이지만, 동기화(Synchronization)를 지원하지 않음
시간 복잡도
  • String 객체를 새로 생성할 때 → O(n)
  • 기존 문자열과 새로운 문자열을 결합할 때(+ 연산자 사용) → O(n)
append(), insert(), delete() 연산 → O(1)
  • append(), insert(), delete() 연산 → O(1)
  • 동기화가 없기 때문에 StringBuffer보다 성능이 더 빠름
공간 복잡
  • 문자열을 변경할 때마다 새로운 객체가 생성되므로 공간 사용량 증가
  • 공간 복잡도 ↑ (높음)
  • String보다 공간 사용량이 적음 (기존 객체를 수정)
  • 내부적으로 버퍼(Buffer) 를 사용하여 변경 작업을 수행
  • 공간 복잡도 ↓ (낮음)
StringBuffer와 동일하게 낮음
언제 사용?  불변성이 필요하면 멀티스레드 환경이면 싱글스레드 환경에서 성능이 중요하면

String 객체는 한 번 생성되면 변경할 수 없는 불변 객체

public class StringTest3 {

	public static void main(String[] args) {
		String s1=new String("java");//시간복잡도 O(n), 공간복잡도 상승
		String s2="java"; //시간복잡도 O(1), 공간복잡도 저하
		//문자열 가공 시
		StringBuffer s3=new StringBuffer("java");//동시성 문제 있을 때 사용하세요
		StringBuilder s4=new StringBuilder("java");//동시성 문제 없을 때 사용하세요
		
		System.out.println(s1==s2);
		System.out.println(s1.toString());
		System.out.println(s2.toString());
		System.out.println(s3.toString());
		System.out.println(s4.toString());

	}

}

Wrapper class

primitive ==> class 로 제공

 

기본 데이터 타입(Primitive Type)을 객체(Class)로 감싸는 클래스

왜 필요? 객체로 변환하기 위해 

inner class

클래스 안에 정의된 또 다른 클래스

package notepad;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

public class Main  {
	TextField tf;
	TextArea ta;
	
	public Main() {
		Frame f=new Frame();
		Button b1=new Button("전송1");		
		Panel p=new Panel();
		tf=new TextField(25);
		ta=new TextArea();
		
		f.add(ta);
		f.add(p, BorderLayout.SOUTH);
		p.add(tf);
		p.add(b1);		
		
		MyButtonHandler btnHandler=new MyButtonHandler();		
		
		b1.addActionListener(btnHandler);		
		tf.addActionListener(btnHandler);	
		
		MyFrameHandler frameHandler=new MyFrameHandler();
		f.addWindowListener(frameHandler);
		
		f.setSize(400, 500);
		f.setBackground(Color.GREEN);
		f.setVisible(true);
	}

	public static void main(String[] args) {
		new Main();		
	}
	
	public class MyButtonHandler implements ActionListener{		
		@Override
		public void actionPerformed(ActionEvent e) {
			// 하고 싶은 일
			ta.append(tf.getText()+"\n");
			tf.setText("");
		}
	} //INNER CLASS
	
	public class MyFrameHandler extends WindowAdapter{
		
		@Override
		public void windowClosing(WindowEvent e) {
			System.exit(0);			
		}		
	}
	
}// OUTER CLASS

 

lambda 

익명함수, 간결한 방식으로 함수 표현할 수 있다.

자바에서는 람다표현식을 사용하면 불필요한 코드 없이 더 직관적인 방식으로 함수 정의 가능

 

람다 표현식의 기본 문법

(매개변수) -> { 실행할 코드 }

(int x, int y) -> { return x + y; }
package notepad;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.FileWriter;
import java.io.IOException;

public class Main  {
	TextField tf;
	TextArea ta;
	
	public Main() {
		Frame f=new Frame();
		Button b1=new Button("전송1");		
		Panel p=new Panel();
		tf=new TextField(25);
		ta=new TextArea();
		MenuBar mb=new MenuBar();
		Menu file_menu=new Menu("file");
		Menu edit_menu=new Menu("edit");
		MenuItem save_item=new MenuItem("save");
		MenuItem open_item=new MenuItem("open");
		
		f.setMenuBar(mb);
		mb.add(file_menu);
		mb.add(edit_menu);
		file_menu.add(open_item);
		file_menu.add(save_item);
		f.add(ta);
		f.add(p, BorderLayout.SOUTH);
		p.add(tf);
		p.add(b1);		
		
		
		save_item.addActionListener( e -> {
				// save_item이 클릭 되었을 때 실행되는 영역
			    // FileDialog를 열기
				FileDialog save_dialog=new FileDialog(f, "save", FileDialog.SAVE);
				save_dialog.setVisible(true);
				
				try {
					FileWriter fw=new FileWriter(save_dialog.getDirectory()+save_dialog.getFile());
					fw.write(ta.getText());
					fw.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		);
		
			
		tf.addActionListener(		
			e -> {
				// 하고 싶은 일
				ta.append(tf.getText()+"\n");
				tf.setText("");
			}
		);	
		
		
		f.addWindowListener(new WindowAdapter(){			
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);			
			}		
		});
		
		f.setSize(400, 500);
		f.setBackground(Color.GREEN);
		f.setVisible(true);
	}

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

	
	
	
}// OUTER CLASS

여기 코드에서는

				// save_item이 클릭 되었을 때 실행되는 영역
			    // FileDialog를 열기
				FileDialog save_dialog=new FileDialog(f, "save", FileDialog.SAVE);
				save_dialog.setVisible(true);
				
				try {
					FileWriter fw=new FileWriter(save_dialog.getDirectory()+save_dialog.getFile());
					fw.write(ta.getText());
					fw.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		e -> {
				// 하고 싶은 일
				ta.append(tf.getText()+"\n");
				tf.setText("");
			}

 

Generics

클래스나 메서드에서 사용할 데이터 타입을 나중에 지정할 수 있도록 하는 기능

package generic;

import java.awt.Button;
import java.util.ArrayList;

public class Test {

	public static void main(String[] args) {
		int []arr1= {1,2,3}; // homogeneous collection
		String []arr2= {"hello","hi","bye"};// homogeneous collection
		Object []arr3= new Object[3];//heterogeneous collection
		arr3[0]="hello";
		arr3[1]=new Test();
		arr3[2]=1;
		
		ArrayList<Integer> list=new ArrayList();//homogeneous collection
		list.add(1);
		list.add(new Integer(2));
		list.add(3);
		
		for (Integer i : list) {// no shadow effect
			//if(object instanceof Integer) {
			//	Integer i=(Integer)object;
				System.out.println(i.intValue());
			//}
			
		}
		

	}

}

그룹스터디 활동 시간

 

 

👩🏻‍🏫 notepad에 Id, Pw, 이름 추가한다음 배열에 넣기

 

 

 

 

 

 

 

 

기존 코드 

package notepad;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.FileWriter;
import java.io.IOException;

public class Main  {
	TextField tf;
	TextArea ta;
	
	public Main() {
		Frame f=new Frame();
		Button b1=new Button("전송1");		
		Panel p=new Panel();
		tf=new TextField(25);
		ta=new TextArea();
		MenuBar mb=new MenuBar();
		Menu file_menu=new Menu("file");
		Menu edit_menu=new Menu("edit");
		MenuItem save_item=new MenuItem("save");
		MenuItem open_item=new MenuItem("open");
		
		f.setMenuBar(mb);
		mb.add(file_menu);
		mb.add(edit_menu);
		file_menu.add(open_item);
		file_menu.add(save_item);
		f.add(ta);
		f.add(p, BorderLayout.SOUTH);
		p.add(tf);
		p.add(b1);		
		
		
		save_item.addActionListener( e -> {
				// save_item이 클릭 되었을 때 실행되는 영역
			    // FileDialog를 열기
				FileDialog save_dialog=new FileDialog(f, "save", FileDialog.SAVE);
				save_dialog.setVisible(true);
				
				try {
					FileWriter fw=new FileWriter(save_dialog.getDirectory()+save_dialog.getFile());
					fw.write(ta.getText());
					fw.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		);
		
			
		tf.addActionListener(		
			e -> {
				// 하고 싶은 일
				ta.append(tf.getText()+"\n");
				tf.setText("");
			}
		);	
		
		
		f.addWindowListener(new WindowAdapter(){			
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);			
			}		
		});
		
		f.setSize(400, 500);
		f.setBackground(Color.GREEN);
		f.setVisible(true);
	}

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

	
	
	
}// OUTER CLASS

 

변경 코드

package notepad;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

public class Main  {
	TextField tf, tfId, tfPw, tfName; //입력받는 필드
	TextArea ta;
	ArrayList<String[]> dataList = new ArrayList<>(); 
	
	public Main() {
		Frame f=new Frame();
		Button b1=new Button("전송");		
		Panel p=new Panel();
		
		
		// 입력 필드
		tfId = new TextField(10);
		tfPw = new TextField(10);
		tfName = new TextField(10);
		tf=new TextField(25);
		ta=new TextArea();
		
		// 메뉴 생성
		MenuBar mb=new MenuBar();
		Menu file_menu=new Menu("file");
		Menu edit_menu=new Menu("edit");
		MenuItem save_item=new MenuItem("save");
		MenuItem open_item=new MenuItem("open");
		
		f.setMenuBar(mb);
		mb.add(file_menu);
		mb.add(edit_menu);
		file_menu.add(open_item);
		file_menu.add(save_item);
		f.add(ta);
		f.add(p, BorderLayout.SOUTH);
		
		p.add(new Label("ID:"));
	    p.add(tfId);
	    p.add(new Label("PW:"));
	    p.add(tfPw);
	    p.add(new Label("이름:"));
	    p.add(tfName);
	    p.add(new Label("내용:"));
		p.add(tf);
		p.add(b1);		
		
		
		
		save_item.addActionListener( e -> {
				// save_item이 클릭 되었을 때 실행되는 영역
			    // FileDialog를 열기
				FileDialog save_dialog=new FileDialog(f, "save", FileDialog.SAVE);
				save_dialog.setVisible(true);
				
				try {
					FileWriter fw=new FileWriter(save_dialog.getDirectory()+save_dialog.getFile());
					fw.write(ta.getText());
					fw.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		);
		
	     
//			
//		tf.addActionListener(		
//			e -> {
//				// 하고 싶은 일
//				ta.append(tf.getText()+"\n");
//				tf.setText("");
//			}
//		);	
//		
		
		b1.addActionListener(e -> {
            String id = tfId.getText();
            String pw = tfPw.getText();
            String name = tfName.getText();
            String msg = tf.getText();

            String[] userData = {id, pw, name, msg};
            dataList.add(userData);
            
            ta.append("ID: " + id + ", PW: " + pw + ", 이름: " + name + " - " + msg + "\n");

            tf.setText("");
        });
	
		
		
		f.addWindowListener(new WindowAdapter(){			
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);			
			}		
		});
		
		f.setSize(800, 500);
		f.setBackground(Color.GREEN);
		f.setVisible(true);
	}

	public static void main(String[] args) {
		new Main();		
	}
	
}// OUTER CLASS

 

 

💭 자바도 공부해야겠다...

💭선생님 코드를 똑같이 따라 작성해도 내 코드에 오류가 꼭 나있다..🥲

 

 

 

 

 


과제

 

추가하거나 고치고 싶은점

1. 유레카 도서관에 오신걸 환영합니다 텍스트랑 검색 바 사이의 간격을 줄이고 싶다.

2. 베스트 셀러에 자바스크립트 기능을 추가해서 버튼을 누르면 책이 넘어가게 하고 싶다 <- 이건 공부해야한다.

3. 간단하게 로그인페이지랑 회원가입 페이지를 만들고 싶다.

 

막상 만들려고 하니 디자인을 어떻게 해야 할지 감이 잡히지 않아 한동안 방황했다가, 여러 대학 도서관 사이트를 비교하며 천천히 만들었다. 

 

728x90