인터페이스는 계열에 가깝다.
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)를 지원하지 않음 |
시간 복잡도 |
|
append(), insert(), delete() 연산 → O(1) |
|
공간 복잡 |
|
|
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. 간단하게 로그인페이지랑 회원가입 페이지를 만들고 싶다.
막상 만들려고 하니 디자인을 어떻게 해야 할지 감이 잡히지 않아 한동안 방황했다가, 여러 대학 도서관 사이트를 비교하며 천천히 만들었다.
'💡 URECA' 카테고리의 다른 글
[URECA] DAY14 | 자바(5) 재귀 (0) | 2025.02.13 |
---|---|
[URECA] Day 13 | 자바(5) | 컬렉션 API(ArrayList, HashSet, TreeSet, HashMap) 재귀 (0) | 2025.02.12 |
[URECA] DAY11 | 자바(3) (0) | 2025.02.10 |
[URECA] DAY 10 | 자바(2) (1) | 2025.02.07 |
[URECA] Day09 | 자바(1) (5) | 2025.02.06 |