작성 : 2024. 4. 15. 

 

문자열을 다루는 법

package etc0411;

public class StringTest0415 {
//0415
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		
		// 문자열을 더하는 방법
		String str = "hello";  // str은 주소값을 받음
		str += "world";  // 기존의 "hello"에 더해지는 게 아니라 아예 새로운 곳에 메모리를 할당함 
		// 메모리 효율성이 떨어짐, 하지만 보통 이렇게 쓰곤 함..
		
		String str2 = new String("hello"); // 정석의 방법
		
		String str1 = "hello";
		String str2 = "world";
		
		
		// 문자열이 같은지 같지 않은지 비교
		if (str1.equals(str2)) {   
			System.out.println("같다");
		} else {
			System.out.println("다르다");
		}
		
		// --------------------------------------------------------------------------
		
		// 배열을 선언
		char[] cArr = {'h', 'e', 'l', 'l','o'};
		String str = new String(cArr); // "hello"
		
		System.out.println(str);
		
		// 문자열을 문자로 쪼개기
		String str2 = "hello";  // 문자열은 인덱스 번호로 부여됨
		
		System.out.println(str2.charAt(0)); 
		
		// 문자열 배열 안에 있는 값 꺼내기
		for (int i = 0; i < str2.length(); i++) {
			System.out.println(str2.charAt(i));  
		}
		
		String str3 = "world";
		// 문자의 인덱스 번호 알아보기 (위치값)
		System.out.println(str3.indexOf('r'));
		// 전체 구성에서 시작 인덱스의 값을 받을 수도 있음
		System.out.println(str3.indexOf("ld"));
		
		// 전체 문자에서 .split(",") 기준으로 쪼개기 -> (",") 안에 들어가는 것을 기준으로 값이 쪼개짐
		String str4 = "cat, dog, bear";
		String[] arr = str4.split(",");
		
		// 전체 문자열의 일부분을 사용하고 싶을 때
		String str5 = "java.lang.Object";
		System.out.println(str5.substring(5, 9));   // 시작 인덱스, 마지막 인덱스 + 1 
		
		// valueOf 는 모든 타입을 문자열로 바꿔줌
		int x = 100;
		String is = String.valueOf(x);  // boolean, int , long, float ...
		System.out.println(is);  // 문자열로 바꿔줌
		
		String is2 = x + "";  // String is = String.valueOf(x); 와 같은 뜻
		// 간단하게 위와 같이 많이 씀
		System.out.println(is2);  // 100 이 나옴, 결과는 같음.
		
		// 문자열을 그냥 가지고 와 사용할 수도 있음
		if ("hello".equals("hello")) {
			System.out.println("같다");
		}
		
		
	}

}
// 예제) 문자열 쪼개기 (나누기)
		String fullName = "hello.java";
		int idx = fullName.indexOf('.');
		
		String filelName = fullName.substring(0, idx); // 시작값과 끝값을 가지고 오기
		String ext = fullName.substring(idx + 1);

		System.out.println(filelName);
		System.out.println(ext);

 

  • StringBuffer / StringBuilder 의 차이와 장단점 알아두기
String은 짧은 문자열을 더할 경우 사용합니다.StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋습니다.StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋습니다. 단순히 성능만 놓고 본다면 연산이 많은 경우, StringBuilder > StringBuffer >>> String 입니다.

 

출저)

 

[자바] String, StringBuilder, StringBuffer의 차이

* String, StringBuffer, StringBuilder 차이점과 장단점. Java를 사용하면 종종 접하게 되는 문자열 클래스들입니다. (기술면접시 만나게 되는 문제 중 하나.) String, StringBuffer, StringBuilder.. 모두 문자열을 저

12bme.tistory.com

 

아래 StringBuffer를 쓰는 방법 코드

// 효율성을 높이기 위해 만들어진 클래스
		// StringBuffer / StringBuilder
		// 동기화         / 동기화 안됨
		// 둘 다 생성하는 과정을 거쳐 사용해야 함.
		
//		StringBuffer sd = new StringBuffer("abc");  // 메모리를 새로 할당하지 않음
//		System.out.println(sd);  
//		
//		sd.append("001");
//		System.out.println(sd);
//		
//		System.out.println(sd.length());  // 길이 알기
//		sd.delete(1, 3);  // 지우기
//		System.out.println(sd);
//		System.out.println(sd.length());
		
		
		// 동일 타입, 문자열 값 같음
		StringBuffer sd1 = new StringBuffer("abc");
		StringBuffer sd2 = new StringBuffer("abc");
		
		// StringBuffer 는 equals 가 오버라이딩이 안되어 있어 같다고 나오지 않음
		if (sd1.equals(sd2)) {
			System.out.println("같다");
		} else {
			System.out.println("다르다");
		}
		
		
		// String 은 equals 가 오버라이딩되어 있어 같다고 나옴.
		String str1 = sd1.toString();
		String str2 = sd2.toString();
		
		if (str1.equals(str2)) {
			System.out.println("같다");
		} else {
			System.out.println("다르다");
		}
		
		
	}

}

 

 

  • 오토박싱
package etc0411;

public class WrapperTest {
//0415 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// Wrapper 클래스
		// 기본형과 참조형 간 형변환을 위한 클래스 
		// 형변환 - 기본형끼리 형변환 가능, 참조형끼리 형변환 가능(상속), 
		// 기본형과 참조형은 형변환이 불가능 , 단 예외로 Wrapper 클래스인 경우에는 가능!
		// 이 경우 형변환이라고 안하고 오토박싱 이라고 함. (박싱, 언박싱)
		// 기본형을 참조형으로 형변환 한다.
		// 기본형이 8개이니, Wrapper 클래스는 총 8개
		// Boolean, Byte, Short,, Character, Integer, Long, Float, Double 값의 범위만 다르고 쓰는 방법은 같음.
		
		int i = 10;
		Integer it = new Integer(20);
		// int i2 = it.intValue();  // 20 이라는 값을 가지고 와 줌.
		int i2 = it;  // 위와 같은 의미 
		
		System.out.println(i2);
		
		Integer it2 = i;  // 원래는 이렇게 써야 하지만 (Integer)i; 자동으로 변환됨 -> 박싱이라고 함.
		
		int x = 100;
		Integer it3 = 200; 
		System.out.println(x + it3);  // 언박싱이 발생함.
		
		int y = new Integer(30); // 오토박싱
		System.out.println(y);
		
		String s = "1000"; // 숫자가 아니면 오류남
		int z = Integer.parseInt(s); // 문자열을 숫자로 바꿔줌
		
		System.out.println(z);
		
		
		// 오브젝트 타입의 언박싱 사용 방법을 알아둘 필요가 있음
		int i = 10; 
		
		Object obj;  // 오브젝트도 오토박싱이 될까? -> 됨
		obj = i;  // new Integer(i); 실제 들어가는 값
		
		int result = (Integer)obj;  // 오브젝트는 캐스팅없이 언박싱 불가
		System.out.println(result);

	}

}

 

자바 수업은 오전까지 하면 끝이 납니다. 오후에는 시험 봅니다.

웹 수업하기 전 자바2 를 할 예정입니다. 뒷부분이 굉장히 중요합니다.

 

내일부터는 Html, css, 자바스크립트 시작.

css, 자바스크립트 시작 → 잘 알아두면 좋아요 프론트 할거면

 

  • 날짜를 다루는 클래스
package etc0411;

import java.util.Calendar;
import java.util.Date;

public class DateTest0415 {

	public static void main(String[] args) {
		// 날짜를 다루는 클래스
		// Date, Calendar 두 가지 클래스가 있음
		// 서로 호환이 가능
		
		
		// Date 사용법
		Date today = new Date(); // import java.util.Date; 추가.
		System.out.println(today); // 내 컴퓨터에 표시된 날짜가 나옴
		
		System.out.println(today.getYear() + 1900);  // 1900년을 기준으로 흘러간 연도를 표시해줌
		System.out.println(today.getMonth() + 1);  // 0 ~ 11 월까지 되어있기 때문에 + 1
		
		
		
		// Calendar 사용법
		Calendar cal = Calendar.getInstance();
		System.out.println(cal);  // 나오는 상수값이 모두 사용할 수 있는 값들
		
		System.out.println(cal.get(Calendar.YEAR));
		System.out.println(cal.get(Calendar.MONTH) + 1);  // 0 ~ 11 월까지 되어있기 때문에 + 1
		System.out.println(cal.get(Calendar.WEEK_OF_YEAR));
		System.out.println(cal.get(Calendar.DATE));
		System.out.println(cal.get(Calendar.DAY_OF_WEEK));  // 1. 일요일 2. 월요일 ... 7. 토요일
		
		System.out.println(cal.get(Calendar.HOUR));
		System.out.println(cal.get(Calendar.HOUR_OF_DAY));  // 24시간 표기법
		System.out.println(cal.get(Calendar.MINUTE));
		System.out.println(cal.get(Calendar.SECOND));		
		System.out.println(cal.getActualMaximum(Calendar.DATE)); // 달의 마지막 날짜를 알 수 있게 해줌
		
		
		// 날짜 계산
		Calendar cal = Calendar.getInstance();
		
		// 내가 원하는 날짜로 세팅 가능
		cal.set(2005, 7, 31);  // 3을 넣었다는 것은 4월을 의미함.
		System.out.println(toString(cal));
		
		cal.add(Calendar.DATE, 1);
		System.out.println(toString(cal));
		
		cal.add(Calendar.MONTH, -6);
		System.out.println(toString(cal));
		
		cal.roll(Calendar.DATE, 31); // 날짜만 더함
		System.out.println(toString(cal));
		
		cal.add(Calendar.DATE, 31); // 전체적인 영향을 줌
		System.out.println(toString(cal));
		
	} // main end
	
	public static String toString(Calendar cal) {
		return cal.get(Calendar.YEAR) + "년 " + (cal.get(Calendar.MONTH) + 1) + "월 " + (cal.get(Calendar.DATE)) + "일";
	}

}

 

이어진 코드

// 날짜 계산하는 프로그램 
		// time1 과 time2 의 차를 구하기
		
		final int[] TIME_UNIT = {3600, 60, 1};
		final String[] TIME_UNIT_NAME = {"시간 ", "분 ", "초"};
		
		Calendar time1 = Calendar.getInstance();
		Calendar time2 = Calendar.getInstance();
		
		time1.set(Calendar.HOUR_OF_DAY, 10);
		time1.set(Calendar.MINUTE, 20);
		time1.set(Calendar.SECOND, 30);
		
		time2.set(Calendar.HOUR_OF_DAY, 20);
		time2.set(Calendar.MINUTE, 30);
		time2.set(Calendar.SECOND, 10);
		
		long difference = Math.abs(time2.getTimeInMillis() - time1.getTimeInMillis()) / 1000;
		System.out.println("time1과 time2의 차이는 " + difference + "초 입니다."); // time1과 time2의 차이는 36580초 입니다.
		
		// 두 시간의 차이를 담는 곳
		String tmp = "";
		
		for (int i = 0; i < TIME_UNIT.length; i++) {
			tmp += difference / TIME_UNIT[i] +  TIME_UNIT_NAME[i];
			difference %= TIME_UNIT[i];
		}
		
		System.out.println("시분초의 차이 : " + tmp);
		
		
	} // main end
	
	public static String toString(Calendar cal) {
		return cal.get(Calendar.YEAR) + "년 " + (cal.get(Calendar.MONTH) + 1) + "월 " + (cal.get(Calendar.DATE)) + "일";
	}

}

 

 

국비 단위평가를 처음으로 보았다~

난 그냥 결과만 나왔다;; .. 기능 구현은 하나도 못한듯

그에 대한 셀프 고문으로 학원에 거의 10시까지 남아서 이러고 있다..

나 계속 여기 다닐 수 있을까..?

 

 

암튼 문제)

다음은 키보드로부터 계좌 정보를 입력받아서, 계좌를 관리하는 프로그램입니다. 실행 결과를 보고, 알맞게 BankApplication 클래스의 메소드를 작성해보세요.

→ 알고보니 ‘이것이 자바다’ 예제 문제를 그대로 낸 것이었다.

 

내가 푼 반쪽짜리 답 :

public class BankApplication {
	private static Account[] accountArray = new Account[100];
	private static Scanner scanner = new Scanner(System.in);

	public static void main(String[] args) {
		boolean run = true;
		while (run) {
			System.out.println("------------------------------------------");
			System.out.println("1.계좌생성 | 2.계좌목록 | 3.예금 | 4.출금 | 5.종료");
			System.out.println("------------------------------------------");
			System.out.print("선택> ");

			int selectNo = scanner.nextInt();

			if (selectNo == 1) {
				createAccount();
			} else if (selectNo == 2) {
				accountList();
			} else if (selectNo == 3) {
				deposit();
			} else if (selectNo == 4) {
				withdraw();
			} else if (selectNo == 5) {
				break;
			}
		}
		System.out.println("프로그램 종료");
	}

	// 계좌생성하기
	private static void createAccount() {

		Scanner scanner = new Scanner(System.in); // nextLine()을 쓸 때는 반드시 이게 들어가야 한다!

		System.out.println("------------------------------------------");
		System.out.println("계좌생성");
		System.out.println("------------------------------------------");
		System.out.print("계좌번호 : ");
		String ano = scanner.nextLine();

		System.out.print("계좌주 : ");
		String owner = scanner.nextLine();

		System.out.print("초기입금액 : ");
		int balance = scanner.nextInt();

		for (int i = 0; i < accountArray.length; i++) {
			if (accountArray[i] == null) {
				accountArray[i] = new Account(ano, owner, balance);
				System.out.println("결과 : 계좌가 생성되었습니다.");
				break;
			}
		}
	}

	// 계좌목록보기
	private static void accountList() {
		System.out.println("------------------------------------------");
		System.out.println("계좌목록");
		System.out.println("------------------------------------------");

		for (int i = 0; i < accountArray.length; i++) {
			if (accountArray[i] != null) {
				accountArray[i].show();
			}
		}
	}

	// 예금하기
	private static void deposit() {

		Scanner scanner = new Scanner(System.in);

		System.out.println("------------------------------------------");
		System.out.println("예금");
		System.out.println("------------------------------------------");

		System.out.print("계좌번호 : ");
		String ano = scanner.nextLine();
		System.out.print("예금액 : ");
		int newbalance = scanner.nextInt();

		if (findAccount(ano) == null) {
			System.out.println("결과 : 계좌가 없습니다.");
		} else {
			findAccount(ano).setBalance(findAccount(ano).getBalance() + newbalance);
			System.out.println("결과 : 입금이 성공되었습니다.");
		}
	}

	// 출금하기
	private static void withdraw() {

		Scanner scanner = new Scanner(System.in);

		System.out.println("------------------------------------------");
		System.out.println("출금");
		System.out.println("------------------------------------------");

		System.out.print("계좌번호 : ");
		String ano = scanner.nextLine();
		System.out.print("출금액 : ");
		int newbalance2 = scanner.nextInt();

		if (findAccount(ano) == null) {
			System.out.println("결과 : 계좌가 없습니다.");
		} else {
			if (newbalance2 > findAccount(ano).getBalance()) {
				System.out.println("잔액보다 큰 액수를 입력하셨습니다.");
			} else {
				findAccount(ano).setBalance(findAccount(ano).getBalance() - newbalance2);
				System.out.println("결과 : 출금이 성공되었습니다.");
			}
		}
	}

	private static Account findAccount(String ano) {
		for (int i = 0; i < accountArray.length; i++) {
			if (accountArray[i] == null) {
				break;
			}
			if (accountArray[i].getAno().equals(ano)) {
				return accountArray[i];
			}
		}
		return null;

	}

}
package koreaItTest0415;

public class Account {

	private String ano;
	private String owner;
	private int balance;

	public Account(String ano, String owner, int balance) {
		super();
		this.ano = ano;
		this.owner = owner;
		this.balance = balance;
	}

	// Setter와 Getter 메소드 완성

	public String getAno() {
		return ano;
	}

	public void setAno(String ano) { // 계좌번호
		this.ano = ano;
	}

	public String getOwner() {
		return owner;
	}

	public void setOwner(String owner) { // 이름
		this.owner = owner;
	}

	public int getBalance() {
		return balance;
	}

	public void setBalance(int balance) { // 초기입금액
		this.balance = balance;
	}

	// 목록
	void show() {
		System.out.println(ano + " " + owner + " " + balance);
	}
}

findAccount 메서드를 전혀 활용하지 못했고 문제에서 요구했던 nextLine 을 쓰지 못했다.

시험 끝나고 여쭤보니 강사님이 버퍼에 대해 설명을 많이 해주셨다고 했는데 난 기억이 하나도 안났다..

진짜 출력만 겨우 됐는데 그 마저도 뭔가 중간중간 문제가 생겨서 속이 썩어들어갔다.

 

답답한 마음에 남아서 이것저것 고쳐보고 찾아보면서 결국 다시 풀었는데 다 하고 나니까 이렇게 직관적으로 생각하면 더 쉽게 풀렸을 텐데 뭘 그렇게 꼬아서 생각하고 감을 못잡았나 싶었다.. 사실 감을 되게 늦게 잡기도 했고 다시 봐도 나 혼자 구글에 뭐 물어보고 그냥 코드만 짜보라고 하면 못할 것 같다.. 어느 정도 가지고 있다 안풀리면 그냥 무식하게 계속 코드를 따라 써보기라도 해야겠다. 그리고 보고 또 보고 계속 보며 분석을 하면 괜찮게 쓰여진 남의 코드들이 익숙해서 조금이라도 닮게 되지 않을까?ㅜ

문제가 다행히 책에 나온 거기도 하고 많이 풀리는 예제라 어렵지 않게 찾아서 도움을 받을 수 있었다. 이제 이해를 좀 잘해서 제발 스스로 이렇게 풀어보자..

 

오답노트 :

package koreaItTest0415;

import java.util.Scanner;

public class BankApplication {
	private static Account[] accountArray = new Account[100];
	private static Scanner scanner = new Scanner(System.in);

	public static void main(String[] args) {
		boolean run = true;
		while (run) {
			System.out.println("------------------------------------------");
			System.out.println("1.계좌생성 | 2.계좌목록 | 3.예금 | 4.출금 | 5.종료");
			System.out.println("------------------------------------------");
			System.out.print("선택> ");

			int selectNo = scanner.nextInt();

			if (selectNo == 1) {
				createAccount();
			} else if (selectNo == 2) {
				accountList();
			} else if (selectNo == 3) {
				deposit();
			} else if (selectNo == 4) {
				withdraw();
			} else if (selectNo == 5) {
				break;
			}
		}
		System.out.println("프로그램 종료");
	}

	// 계좌생성하기
	private static void createAccount() {

		Scanner scanner = new Scanner(System.in); // nextLine()을 쓸 때는 반드시 이게 들어가야 한다!

		System.out.println("------------------------------------------");
		System.out.println("계좌생성");
		System.out.println("------------------------------------------");
		System.out.print("계좌번호 : ");
		String ano = scanner.nextLine();

		System.out.print("계좌주 : ");
		String owner = scanner.nextLine();

		System.out.print("초기입금액 : ");
		int balance = scanner.nextInt();

		for (int i = 0; i < accountArray.length; i++) {
			if (accountArray[i] == null) {
				accountArray[i] = new Account(ano, owner, balance);
				System.out.println("결과 : 계좌가 생성되었습니다.");
				break;
			}
		}
	}

	// 계좌목록보기
	private static void accountList() {
		System.out.println("------------------------------------------");
		System.out.println("계좌목록");
		System.out.println("------------------------------------------");

		for (int i = 0; i < accountArray.length; i++) {
			if (accountArray[i] != null) {
				accountArray[i].show();
			}
		}
	}

	// 예금하기
	private static void deposit() {

		Scanner scanner = new Scanner(System.in);

		System.out.println("------------------------------------------");
		System.out.println("예금");
		System.out.println("------------------------------------------");

		System.out.print("계좌번호 : ");
		String ano = scanner.nextLine();
		System.out.print("예금액 : ");
		int newbalance = scanner.nextInt();

		if (findAccount(ano) == null) {
			System.out.println("결과 : 계좌가 없습니다.");
		} else {
			findAccount(ano).setBalance(findAccount(ano).getBalance() + newbalance);
			System.out.println("결과 : 입금이 성공되었습니다.");
		}
	}

	// 출금하기
	private static void withdraw() {

		Scanner scanner = new Scanner(System.in);

		System.out.println("------------------------------------------");
		System.out.println("출금");
		System.out.println("------------------------------------------");

		System.out.print("계좌번호 : ");
		String ano = scanner.nextLine();
		System.out.print("출금액 : ");
		int newbalance2 = scanner.nextInt();

		if (findAccount(ano) == null) {
			System.out.println("결과 : 계좌가 없습니다.");
		} else {
			if (newbalance2 > findAccount(ano).getBalance()) {
				System.out.println("잔액보다 큰 액수를 입력하셨습니다.");
			} else {
				findAccount(ano).setBalance(findAccount(ano).getBalance() - newbalance2);
				System.out.println("결과 : 출금이 성공되었습니다.");
			}
		}
	}

	private static Account findAccount(String ano) {
		for (int i = 0; i < accountArray.length; i++) {
			if (accountArray[i] == null) {
				break;
			}
			if (accountArray[i].getAno().equals(ano)) {
				return accountArray[i];
			}
		}
		return null;

	}

}
package koreaItTest0415;

public class Account {

	private String ano;
	private String owner;
	private int balance;

	public Account(String ano, String owner, int balance) {
		super();
		this.ano = ano;
		this.owner = owner;
		this.balance = balance;
	}

	// Setter와 Getter 메소드 완성

	public String getAno() {
		return ano;
	}

	public void setAno(String ano) { // 계좌번호
		this.ano = ano;
	}

	public String getOwner() {
		return owner;
	}

	public void setOwner(String owner) { // 이름
		this.owner = owner;
	}

	public int getBalance() {
		return balance;
	}

	public void setBalance(int balance) { // 초기입금액
		this.balance = balance;
	}

	// 목록
	void show() {
		System.out.println(ano + " " + owner + " " + balance);
	}
}

Account 는 그나마 같구나;; 하긴 마법사도 사용 못하면 문제가 심각한거지ㅋ..

+ Recent posts