String/StringBuffer/StringBuilder 의 시간 복잡도와 공간복잡도
package com.kse.basic;
public class StringTest3 {
public static void main(String[] args) {
String s1 = new String("java"); // 시간복잡도 O(n), 공간복잡도 상승(매번 다른 공간)
String s2 = "java"; // 시간복잡도 O(1), 공간복잡도 저하
System.out.println(s1 == s2); // 주소 비교
System.out.println(s1); // toString(): 내용값 제공 메서드가 자동으로 호출
System.out.println(s2.toString());
System.out.println(s1.toString() == s2.toString()); // false
// 문자열 가공 시 StringBuffer/StringBuilder 사용
StringBuffer s3 = new StringBuffer("java"); // 공유, lock 시스템 -> 느림, 동시성 문제가 있을 때 사용
StringBuilder s4 = new StringBuilder("java"); // 동시성 문제가 없을 때 사용
System.out.println(s3);
System.out.println(s4);
}
}
Wrapper 클래스
- primitive 타입을 class 로 제공하는 것
🗒️ 노트 패드 만들기 실습
1️⃣ 기존 코드
- 인터페이스를 implements하여 구현 ➡️ 메서드를 만들어서 파라미터를 전달해야 함
package notepad;
import java.awt.*;
public class Main {
public static void main(String[] args) {
Frame f=new Frame();
Button b1=new Button("전송1");
Panel p=new Panel();
TextField tf=new TextField(25);
TextArea ta=new TextArea();
f.add(ta);
f.add(p, BorderLayout.SOUTH);
p.add(tf);
p.add(b1);
MyButtonHandler btnHandler=new MyButtonHandler();
btnHandler.setTextField(tf);
btnHandler.setTextArea(ta);
b1.addActionListener(btnHandler);
tf.addActionListener(btnHandler);
f.setSize(400, 500);
f.setBackground(Color.GREEN);
f.setVisible(true);
}
}
package notepad;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyButtonHandler implements ActionListener{
TextField tf;
TextArea ta;
public void setTextField(TextField tf) {
this.tf=tf;
}
public void setTextArea(TextArea ta) {
this.ta=ta;
}
@Override
public void actionPerformed(ActionEvent e) {
// 하고 싶은 일
ta.append(tf.getText()+"\n"); // TextArea에 입력한 텍스트 출력
tf.setText(""); // 텍스트 입력 후 비우기
}
}
2️⃣ Inner 클래스 및 생성자 활용
- 다른 클래스로 자기 멤버를 계속 전달해 주는 비용을 아낌
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
3️⃣ 익명 Inner 클래스 활용
- 한 번만 사용할 때, 변수를 선언하면 메모리를 차지하기 때문에 변수 선언 없이 익명 클래스로 성능 및 가독성 향상
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);
// 익명 Inner 클래스 - 이름 없이 super 타입으로 하는 클래스 객체 생성, 가독성 향상
tf.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// 하고 싶은 일
ta.append(tf.getText()+"\n");
tf.setText("");
}
});
// WindowAdapter가 중간 다리 역할 - WindowListener를 implements 하고 있음
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
4️⃣ lambda 식 표현
- anonymous 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;
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();
}
}
);
// lambda 식 사용 - ActionListener가 하나의 메서드만 가지고 있기 때문(추론할 수 있을 때만 사용하기)
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
Generic
homogeneous collection의 성능 개선을 위한 기법
package generic;
import java.util.ArrayList;
import java.util.Comparator;
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; // 주소만 들어갈 수 있지만, primitive data가 들어갈 수 있는 이유는 auto boxing 때문(자동으로 객체: new Integer(1) 수행)
for (Object object : arr3) {
System.out.println(object);
}
ArrayList<Integer> list = new ArrayList(); // generic으로 homogeneous collection으로 만들어 타입 제한
list.add(1);
list.add(new Integer(20));
list.add(new Test()); // X
list.add("hello"); // X
// for-each 문
for (Integer i : list) { // no shadow effect
System.out.println(i);
}
// for 문
for(int i =0; i<list.size(); i++ ) {
System.out.println(list.get(i));
}
System.out.println(list); // toString() 메서드가 오버라이딩 돼서 내용값이 출력됨
}
}
Comparator
정렬
package generic;
import java.util.ArrayList;
import java.util.Comparator;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList(); // generic으로 homogeneous collection으로 만들어 타입 제한
list.add(1);
list.add(new Integer(20));
// 가독성을 위해 lambda 식 표현 사용
list.sort((o1, o2) -> o2 - o1); // 내림차순
System.out.println(list);
}
}
스터디 - 노트 패드 실습 추가 구현
- id, pw, name 필드 추가
- 가입하기 버튼을 누르면 id, pw, name이 묶여 ArrayList에 저장
- 전체 고객 정보 보기 버튼을 누르면 ArrayList에 저장된 내역 보여주기
package notepad2;
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 tf1,tf2,tf3; // id, pw, name 입력 받는 필드
TextArea ta;
public Main() {
Frame f=new Frame();
Button b1=new Button("가입");
Button b2=new Button("전체고객 정보보기");
Panel p=new Panel();
Panel p2=new Panel();
tf1=new TextField(8);
tf2=new TextField(8);
tf3=new TextField(8);
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);
f.add(p2, BorderLayout.NORTH);
p.add(tf1);
p.add(tf2);
p.add(tf3);
p.add(b1);
p2.add(b2);
ArrayList<String[]> users = new ArrayList<>(); // 고객 정보를 담을 ArrayList
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) {
e1.printStackTrace();
}
}
);
b1.addActionListener(e->{
users.add(new String[]{tf1.getText(),tf2.getText(),tf3.getText()}); // 입력한 텍스트들을 문자열 배열로 만든 후 ArrayList에 추가
System.out.println(users);
tf1.setText("");
tf2.setText("");
tf3.setText("");
ta.setText("");
});
b2.addActionListener(e->{
for (String[] user : users) { // 추가된 ArrayList를 순회
ta.append("아이디: " + user[0] + ", 비밀번호: " + user[1] + ", 이름: " + user[2] + "\n"); // TextArea에 추가
}
});
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
📚 과제
클래스 다이어그램으로 만든 쇼핑몰 첫 화면 UI 간단 구현 (feat. bootstrap)
728x90
반응형
'LG 유플러스 유레카 SW > Java' 카테고리의 다른 글
[#14] Java 재귀 & 배열 & Exception (0) | 2025.02.13 |
---|---|
[#13] Java Generic & Collection (0) | 2025.02.12 |
[#11] Java 다형성 + Class 다이어그램 그려보기 (0) | 2025.02.10 |
[#10] Java 들어가기 + 알고리즘 스터디 (0) | 2025.02.07 |
[#9] Java 들어가기 전에.. (0) | 2025.02.06 |