# 참고자료 1 (String, StringBuilder, StringBuffer)
String은 변경이 불가능한 문자열의 표현을 위한 클래스이지만,
StringBuilder와 StringBuffer는 변경이 가능한 문자열의 표현을 위한 클래스들이다.
단, String 인스턴스와 달리 StringBuilder와 StringBuffer의 인스턴스를 가리켜 문자열이라 하지는 않는다.
StringBuilder는 문자열의 저장 및 변경을 위한 메모리 공간(이를 가리켜 '버퍼'라 한다)을 내부에 지니는데,
이 메모리 공간은 그 크기가 자동으로 조절된다는 특징이 있다.
- StringBuilder의 특징
StringBuilder는 버퍼의 크기를 스스로 확장한다.
@ public StringBuilder() // 16개의 문자 저장 버퍼 생성
@ public StringBuilder(int capacity) // capacity개의 문자 저장 버퍼 생성
@ public StringBuilder(String str) // str.length() + 16개의 문자 저장 버퍼 생성
- StringBuilder의 효율적인 사용을 위한 지침
버퍼의 크기를 확장하는 작업은 많은 연산이 요구되는 작업이다.
따라서 가급적이면 필요로 하는 버퍼의 크기를 미리 할당하는 것이 성능에 도움이 된다.
- StringBuilder과 StringBuffer의 공통점과 차이점은?
[공통점]
@ 메소드의 수(생성자 포함)
@ 메소드의 기능
@ 메소드의 이름과 매개변수 형
[차이점]
"StringBuffer는 쓰레드에 안전하지만, StringBuilder는 쓰레드에 안전하지 못하다."
StringBuffer 클래스가 제공되기 시작한 시점과 StringBuilder가 제공되기 시작한 시점을 API 문서에서 찾아보자.
StringBuffer since 1.5
StringBuilder since JDK 1.0
# 참고자료 2 (API)
API [ application programming interface ] //함수의 모음
요약 운영체제와 응용프로그램 사이의 통신에 사용되는 언어나 메시지 형식을 말한다.
운영체제나 C, C++, Pascal 등과 같은 언어로 응용 프로그램을 만들 때,
윈도우를 만들고 파일을 여는 것과 같은 처리를 할 수 있도록 1,000여 개 이상의 함수로 구성되어 있다.
API는 프로그래머를 위한 운영체제나 프로그램의 인터페이스로서
사용자와 직접 대하게 되는 그래픽 사용자 인터페이스나 명령형 인터페이스와 뚜렷한 차이가 있다.
API는 응용 프로그램이 운영체제나 데이터베이스 관리 시스템과 같은 시스템 프로그램과
통신할 때 사용되는 언어나 메시지 형식을 가지며,
API는 프로그램 내에서 실행을 위해 특정 서브루틴에 연결을 제공하는 함수를 호출하는 것으로 구현된다.
그러므로 하나의 API는 함수의 호출에 의해 요청되는 작업을 수행하기 위해
이미 존재하거나 또는 연결되어야 하는 몇 개의 프로그램 모듈이나 루틴을 가진다.
좋은 API는 모든 building block을 제공함으로써 프로그램 개발을 쉽게 해준다.
프로그래머는 그 block을 함께 합치기만 하면 된다.
API가 프로그래머를 위해서 만들어지기는 했지만, 사용자 입장에서도 같은 API를 사용한 프로그램은
비슷한 인터페이스를 가지기 때문에 새로운 프로그램의 사용법을 배우기가 쉬워진다.
Q. 전화번호 관리 프로그램 01단계 문제
클래스를 하나 정의하자. 클래스의 이름은 PhoneInfo이다.
그리고 이 클래스에는 다음의 데이터들이 문자열의 형태로 저장 가능해야 하며,
저장된 데이터의 적절한 출력이 가능하도록 메소드도 정의되어야 한다.
*이름 name String
*전화번호 phoneNumber String
*생년월일 birthday String
단, 생년월일 정보는 저장을 할 수도, 저장하지 않을 수도 있게끔 생성자를 정의하자. (오버로딩)
그리고 정의된 클래스의 확인을 위한 main 메소드도 간단히 정의하자.
A.
class PhoneInfo
{
private String name;
private String phoneNumber;
private String birthday;
public PhoneInfo(string name, string phoneNumber, string birthday)
{
this.name=name;
this.phoneNumber=phoneNumber;
this.birthday=birthday;
}
public void showPhoneInfo();
{
System.out.println("이름 : "+name);
System.out.println("전화번호 : "+PhoneNumber);
if(birthday!=null)
System.out.println("생년월일 : "+birthday);
}
}
class PhoneInfoMain
{
public static void main(String[] args)
{
PhoneInfo pInfo1 = new PhoneInfo("홍길동","010-1234-5678","1990.07.01");
PhoneInfo pInfo2 = new PhoneInfo("홍길숙","010-1234-7890");
pInfo1.showPhoneInfo();
pInfo2.showPhoneInfo();
}
}
- PhoneInfo 메소드의 경우 아래와 같이 표현도 가능하다.
public PhoneInfo(string name, string phoneNumber, string birthday)
{
this(name,phoneNumber,null);
}
ex)
public class Number
{
private int num;
public Number(int num)
{
this.num=num;
}
public String toString() // 내용 완벽하게 동일해야 함
{
return "num = "+ num;
} // 이와 같은 형태로 뭘 만들었는지 이 내용 적어주기
}
class NumberMain
{
public static void main(String[] args)
{
Number n1 = new Number(5);
System.out.println(n1);
/* public String toString() 가 자동으로 호출하도록 되어 있다 -
println(Number number) 상속때 배움 */
}
}
ex)
class Friend
{
String myName;
public Friend(String name)
{
myName=name;
}
public String toString() // 직접 만든 클래스의 설명을 할 수 있도록 하기!
{
return "제 이름은 "+myName+"입니다.";
}
}
class StringToString
{
public static void main(String[] args)
{
Friend fnd1=new Friend("이종수");
Friend fnd2=new Friend("현주은");
System.out.println(fnd1);
System.out.println(fnd2);
System.out.print("출력이 ");
System.out.print("종료되었습니다.");
System.out.println("");
}
}
# 서식문자(printf)
서식문자명 | 문자의 의미 |
%s | 문자열 |
%d | 10진수 출력 |
%o | 8진수 출력 |
%x | 16진수 출력 |
%e | e표기법(e02 : 10^2, e-02 : 10^-2) |
%g | 소수점 이하 여섯 째 자리 이상인 경우 %e 방식으로 출력 소수점 이하 여섯 째 미만은 %f인 실수 출력 방식으로 출력 |
\n | 줄바꿈 |
ex)
class FormatString
{
public static void main(String[] args)
{
int age=20;
double tall=175.7;
String name="홍자바";
System.out.printf("제 이름은 %s입니다. \n", name);
//printf 프린트 포맷티드 - 형식에 맞게 출력하라
System.out.printf("나이는 %d이고, 키는 %e입니다. \n", age, tall);
System.out.printf("%d %o %x \n", 77, 77, 77);
System.out.printf("%g %g \n", 0.00014, 0.000014);
}
}
- 서식문자 변수의 갯수와 같아야 한다. ex) 2개면 2개, 3개면 3개
ex)
import java.util.Scanner;
class StringScanning
{
public static void main(String[] args)
{
String source="1 5 7";
Scanner sc=new Scanner(source); // ()에 문자열 넣을 수 있음, 공백 기준으로 값을 가지고옴
int num1=sc.nextInt(); // 결과 : 1
int num2=sc.nextInt(); // 결과 : 5
int num3=sc.nextInt(); // 결과 : 7
int sum=num1+num2+num3;
// 13
System.out.printf(
"문자열에 저장된 %d, %d, %d의 합은 %d \n",
num1, num2,num3, sum);
} // 문자열에 저장된 1,5,7의 합은 13이라고 출력
}
ex)
import java.util.Scanner;
class KeyboardScanning
{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int num1=sc.nextInt();
int num2=sc.nextInt();
int num3=sc.nextInt();
int sum=num1+num2+num3;
System.out.printf(
"입력된 정수 %d, %d, %d의 합은 %d \n",
num1, num2,num3, sum);
}
}
ex)
import java.util.Scanner;
class ScanningMethods
{
public static void main(String[] args)
{
Scanner keyboard=new Scanner(System.in);
System.out.print("당신의 이름은? ");
String str=keyboard.nextLine();
System.out.println("안녕하세요 "+str+'님');
System.out.print("당신은 스파게티를 좋아한다는데, 진실입니까? ");
boolean isTrue=keyboard.nextBoolean();
if(isTrue==true)
System.out.println("오~ 좋아하는군요.");
else
System.out.println("이런 아니었군요.");
System.out.print("당신과 동생의 키는 어떻게 되나요?");
double num1=keyboard.nextDouble();
double num2=keyboard.nextDouble();
double diff=num1-num2;
if(diff>0)
System.out.println("당신이 "+diff+"만큼 크군요.");
else
System.out.println("당신이 "+(-diff)+"만큼 작군요.");
}
}
- nextLine(); : 문자열 입력
nextBoolean(): : true와 false만 입력 받음
nextDouble(); : Double형 입력
- nextLine과 next의 차이점 예시
ex)
String str = sc.nextLine();
System.out.println(str) // "안녕 철수" - 결과 : 안녕 철수
String str2 = sc.next();
System.out.println(str2) // "안녕 철수" - 결과 : 안녕
Q. 선택하세요...
1. 데이터 입력
2. 프로그램 종료
선택 : 1
이름 : 홍길동
전화번호 : 222-3333
생년월일 : 99년12월25일생
입력된 정보 출력...
name : 홍길동
phone : 222-3333
birth : 99년12월25일생
선택하세요...
1. 데이터 입력
2. 프로그램 종료
선택 :
A.
public class PhoneInfo2
{
private String name;
private String phoneNumber;
private String birthday;
public PhoneInfo2(string name, string phoneNumber, string birthday)
{
this.name=name;
this.phoneNumber=phoneNumber;
this.birthday=birthday;
}
public void showPhoneInfo()
{
System.out.println("name = "+name);
System.out.println("phone = "+phoneNumber);
System.out.println("birth = "+birthday);
}
}
import.java.util.Scanner;
class PhoneInfo2Main
{
public static void main(String[] args)
{
PhoneInfo info = null;
Scanner sc=new Scanner(System.in);
int menu=0;
String name=null, phoneNumber=null, birthday=null;
while(true)
{
System.out.println("선택하세요...");
System.out.println("1. 데이터 입력");
System.out.println("2. 프로그램 종료");
System.out.println("선택 : ");
menu=sc.nextInt(); //nextInt 1 엔터 후 바로 전화번호로 넘어가는 문제 생김
sc.nextLine(); // 버퍼에 있는 엔터키값을 없애는 역할로 이름부터 작성가능하게 해줌 Switch(menu)
switch(menu)
{
case 1 :
System.out.print("이름 : ");
name = sc.nextLine();
System.out.print("전화번호 : ");
phoneNumber = sc.nextLine();
System.out.print(“생년월일 : ");
birthday = sc.nextLine();
info = new PhoneInfo(name, phoneNumber, birthday);
System.out.println("입력된 정보 출력...");
info.showPhoneInfo();
break;
case 2 :
System.out.println("프로그램을 종료합니다.");
return;
}
}
}
}
#배열
배열의 인덱스는 0부터 시작한다.
int[ ] arr = new int[3];
arr[0]=10;
arr[1]=20;
arr[2]=30;
System.out.println(arr[0]+" "+arr[1]+" "+arr[2]);
for(i=0;i<3;i++)
{
arr[i]=i; //arr.length
}
for(i=0;i<3;i++)
System.out.println(arr[i]);
Q. 사용자로부터 임의의 숫자 5개를 입력받아 오름차순 정렬하여 출력하시오.(배열, 선택 정렬 이용)
A.
import java.util.Scanner;
public class SelectionSortArray {
public static void main(String[] args) {
int size = 5;
int[] num = new int[size];
Scanner sc = new Scanner(System.in);
int temp = 0;
for(int i=0;i<num.length;i++)
{
System.out.println(i+1+"번째 수를 입력하세요.");
num[i] = sc.nextInt();
}
for(int i=0;i<num.length-1;i++)
{
for(int j=i+1;j<num.length;j++)
{
if(num[i]>num[j])
{
temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
}
for(int i=0;i<num.length;i++)
System.out.print(num[i] + "\t");
}
}
- 배열의 장점 : 많은 값을 컨트롤하기 쉽다.
ex)
int[ ] num = new int[5]; // int형
string[ ] str = new string[5]; // string형
double[ ] number = new double[3]; // double형
Q. 2
A.
import java.util.Scanner;
public class NameArraySort {
public static void main(String[] args) {
int size = 5;
String[] name = new String[size];
Scanner sc = new Scanner(System.in);
String temp = null;
System.out.println(size + "개의 이름을 입력하세요.");
for(int i=0;i<name.length;i++)
{
System.out.println(i+1+"번째 이름을 입력하세요.");
name[i] = sc.nextLine();
}
for(int i=0;i<name.length-1;i++)
{
for(int j=i+1;j<name.length;j++)
{
if(name[i].compareTo(name[j])>0)
{
temp = name[i];
name[i] = name[j];
name[j] = temp;
}
}
}
for(int i=0;i<name.length;i++)
System.out.print(name[i] + "\t");
}
}
# 참조변수를 선언할 때
ex)
int[ ] num;
int num[ ];
두 가지 모두 가능하지만 , 자료형과 변수명을 구분 짓는 첫 번째 방법을 가장 많이 사용한다.
- 선언과 동시에 초기화 하는 방법
ex)
int[ ] num = new int[3]{10,20,30}; // (x)
int[ ] num = new int[]{10,20,30}; // (o)
int[ ] num = {10,20,30} // (o)
① 문법적인 에러 예시이다.
②, ③번 모두 가능한 방법이지만 ③이 훨씬 편리하게 쓸 수 있어 선호되는 방식이다.
ex)
int[ ] num = {10,20,30};
int[ ] num2 = {100,200,300};
System.out.println(num[0]); //결과 : 10
System.out.println(num2[0]); //결과 : 100
int[ ] num3; // 인티져형 1차원 배열을 가리킬 수 있는 num3라는 참조변수를 만든 것
num3 = num; // 객체의 주소값이 들어감 -> 객체 접근 가능
System.out.println(num3[0]); //결과 : 10
System.out.println(num3.length); //결과 : 3
num3 = num2;
System.out.println(num3.length); //결과 : 3
System.out.println(num3[0]); //결과 : 100
System.out.println(num3[1]); //결과 : 200
System.out.println(num3[3]); //결과 : error
ex) 자료형이 다른데 대입한 경우 (error 예시)
num3=num[0];
/* 결과 : error
인티져형 1차원 배열을 가리킬 수 있는 참조변수인데 num[0]은 int형으로 자료형이 달라 불가하다 */
String str="Hi";
int[ ] num = new int[3];
num[0] = str // 결과 : error
String[ ] str={"Hi","Bye"};
int[ ] num={10,20,30};
num=str; // 결과 : error
ex)
import java.util.Scanner;
class WhyNeedArray
{
public static void main(String[] args)
{
int fstHighScore=0; // 1등 점수
int sndHighScore=0; // 2등 점수
Scanner sc=new Scanner(System.in);
System.out.print("점수 입력: ");
int score1=sc.nextInt();
if(score1>=fstHighScore)
{
sndHighScore=fstHighScore;
fstHighScore=score1;
}
else if(score1<fstHighScore && score1>sndHighScore)
{
sndHighScore=score1;
}
System.out.print("점수 입력: ");
int score2=sc.nextInt();
if(score2>=fstHighScore)
{
sndHighScore=fstHighScore;
fstHighScore=score2;
}
else if(score2<fstHighScore && score2>sndHighScore)
{
sndHighScore=score2;
}
System.out.print("점수 입력: ");
int score3=sc.nextInt();
if(score3>=fstHighScore)
{
sndHighScore=fstHighScore;
fstHighScore=score3;
}
else if(score3<fstHighScore && score3>sndHighScore)
{
sndHighScore=score3;
}
System.out.printf("A 학점은 %d점 이상입니다. \n", sndHighScore);
}
}
ex)
class AccessArray
{
public static void main(String[] args)
{
int[] arr = new int[3];
arr[0]=1;
arr[1]=2;
arr[2]=3;
int sum=arr[0]+arr[1]+arr[2];
System.out.println(sum); // 결과 : 6
}
}
ex)
class InstanceArray
{
public static void main(String[] args)
{
String[] strArr=new String[3];
strArr[0]=new String("Java");
strArr[1]=new String("Flex");
strArr[2]=new String("Ruby");
for(int i=0; i<strArr.length; i++) // strArr.length은 3
System.out.println(strArr[i]);
}
}
- strArr[0] ="Java" : 명시적으로 필요한 것이 아니면 “ ”로 객체 생성하는 것이 더 좋은 방법이다.
ex)
class ArrayAndMethods
{
public static int[] addAllArray(int[] ar, int addVal) // ar 지역변수,
{
for(int i=0; i<ar.length; i++)
ar[i]+=addVal;
return ar; // ref에 해당 주소값이 들어감
}
public static void main(String[] args)
{
int[] arr={1, 2, 3, 4, 5};
int[] ref;
ref=addAllArray(arr, 7);
// int[ ]arr처럼 선언되어 있어야 함 , arr은 주소값
if(arr==ref)
System.out.println("동일 배열 참조"); // 결과 : 동일 배열 참조
else
System.out.println("다른 배열 참조");
for(int i=0; i<ref.length; i++)
System.out.print(arr[i]+" "); // 결과 : 8 9 10 11 12
}
}
Q. int형 1차원 배열을 매개변수로 전달받아서, 배열에 저장된 최대값,
그리고 최소값을 구해서 반환하는 메소드를 다음의 형태로 각각 정의하자.
public static int minValue(int[] arr) { ... } // 최소값 반환
public static int maxValue(int[] arr) { ... } // 최대값 반환
물론 위의 두 메소드는 인자로 전달되는 배열의 길이에 상관없이 동작하도록 정의되어야 한다.
그리고 정의가 완료되면, 두 메소드의 실행을 확인하기 위한 main 메소드도 함께 정의하자.
단, 선언된 int형 배열에 채워질 정수는 프로그램 사용자로부터 입력 받아야 하며,
배열의 길이는 임의로 결정하면 된다.
A.
import java.util.Scanner;
class Question13_1
{
public static int minValue(int[] arr)
{
int min = arr[0];
for(int i=1;i<arr.length;i++)
if(min>arr[i]) min = arr[i];
return min;
}
public static int maxValue(int[] arr)
{
int max = arr[0];
for(int i=1;i<arr.length;i++) //min과 부등호 방향만 다르다
if(max<arr[i]) max = arr[i];
return max;
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int[] arr = new int[5];
System.out.println("숫자 " + arr.length + "개를 입력하세요.");
for(int i=0;i<arr.length;i++)
arr[i] = sc.nextInt();
System.out.println("가장 작은 수는 " + minValue(arr)); // 주소번지를 넘김
System.out.println("가장 큰 수는 " + maxValue(arr));
}
}
'SW > Java' 카테고리의 다른 글
[필기정리]Day11 - 전화번호 관리 프로그램 문제 03단계 (0) | 2020.06.24 |
---|---|
[필기정리]Day10 - 2차원배열, 배열 예제문제 등 (0) | 2020.06.24 |
[필기정리]Day8-2 - compareTo, 메소드체이닝 등 (0) | 2020.06.21 |
[필기정리] Day8-1 - static변수, 메소드 오버로딩 등 (0) | 2020.06.21 |
[필기정리] Day7 - 클래스패스, 접근제어 지시자, 엑세스메소드 등 (0) | 2020.06.21 |