[#12] Java 코드 성능 & 가독성 높이는 법

2025. 2. 11. 15:55·LG 유플러스 유레카 SW/Java
목차
  1. String/StringBuffer/StringBuilder 의 시간 복잡도와 공간복잡도
  2. Wrapper 클래스
  3. 🗒️ 노트 패드 만들기 실습
  4. Generic
  5. Comparator
  6. 스터디 - 노트 패드 실습 추가 구현
  7. 📚 과제

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
  1. String/StringBuffer/StringBuilder 의 시간 복잡도와 공간복잡도
  2. Wrapper 클래스
  3. 🗒️ 노트 패드 만들기 실습
  4. Generic
  5. Comparator
  6. 스터디 - 노트 패드 실습 추가 구현
  7. 📚 과제
'LG 유플러스 유레카 SW/Java' 카테고리의 다른 글
  • [#14] Java 재귀 & 배열 & Exception
  • [#13] Java Generic & Collection
  • [#11] Java 다형성 + Class 다이어그램 그려보기
  • [#10] Java 들어가기 + 알고리즘 스터디
nueos
nueos
  • nueos
    nueos 공부 기록
    nueos
  • 전체
    오늘
    어제
    • 분류 전체보기 (191)
      • 해커톤 (1)
      • 네이버 BoostCamp (6)
      • LG 유플러스 유레카 SW (3)
        • React (21)
        • TypeScript (2)
        • JavaScript (2)
        • HTML+CSS (5)
        • Spring (7)
        • Java (6)
        • SQL (2)
        • Algorithm (8)
        • CX (6)
        • Git (2)
        • 프로젝트 (2)
        • 스터디 (9)
        • 과제 (8)
        • 특강 (1)
      • React (3)
      • Next (0)
      • Javascript (2)
      • HTML (2)
      • CSS (9)
      • Algorithm (6)
      • Database (0)
      • OS (13)
      • C++ (24)
      • Python (1)
      • jQuery (1)
      • Django (1)
      • Git (1)
      • 개발 지식 (3)
      • 정보 보안 (22)
      • 포렌식 (1)
      • 암호 (2)
      • 기타 (4)
      • 패스트캠퍼스 FE 프로젝트십 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    디지털혁신
    큐
    exhaustive search
    완전 탐색
    heap
    힙
    기술로바꾸는세상
    디지랩챌린지
    Queue
    스택
    Stack
    제주해커톤
    제주지역혁신플랫폼지능형서비스사업단
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
nueos
[#12] Java 코드 성능 & 가독성 높이는 법
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.