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); //syso(fnd1.toString()
System.out.println(fnd2);//
System.out.print("출력이 ");
System.out.print("종료되었습니다.");
System.out.println("");
}
}
콘솔 입출력, Console Input Output > IO = 이클립스 콘솔 과 cmd
기본 입력 장치: 키보드
기본 출력 장치: 모니터
println 메서드
print line > 값을 행단위로 출력한다. > 값을 출력한 뒤 엔터를 친다. (자동으로 엔터를 치고 끝나는 특성이라 행이 바뀌는것)
print 메서드
값을 출력하고 엔터를 치지 않는다.
printf 메소드
print format > 출력 형식에 맞게 출력한다.
String.format() 메서드와 동일
형식 문자(PlaceHolder)제공
엔터를 쳐주지 않음, 직접 \r,\n 쳐줘야함
가독성 향상(굉장히 많이)
%s > 문자열 (String)
%c > 단일 문자 (char)
%d > Decimal(정수) > byte, short, int, long
%f > Float(실수) > float, double
%o > 정수 8진수
%x > 정수 16진수(알파벳이 사용될때 소문자로 %X면 대문자로)
%g > 소수점 이하 5자리까지 출력
%e > 소수점 이라 6자리 이상이면
%c > char
%b > Boolean
11.%% > %출력
//요구사항) "안녕하세요.홍길동님" 문장을 출력하시오.
String name = "홍길동"; //사용자가 키보드로 입력한 이름
System.out.println("안녕하세요." + name + "님.");
System.out.printf("안녕하세요. %s님",name);바뀌는것
// 쓰는 이유는 이렇게 쓰는게 훨씬 이해하기, 보기 쉽기 때문에 쓰
는것);
//요구사항) "안녕하세요.홍길동님. 안녕히가세요. 홍길동님"
System.out.printf("안녕하세요. %s님. 안녕히가세요. %s님.",name, name);
정수
출력할 내용의 너비를 지정한다.
탭분자처럼 열을 맞추기 위한 기능
(+) 양수 : 우측 정렬
(-) 음수 : 좌측 정렬
사이에는 .(점)숫자 = %.숫자f
소수점 이하 자릿수 지정
double num2 = 3.14;
System.out.printf("%f\n", num2);
//3.140000 이 나오는데 .숫자 하면 .뒤 자릿수만큼을 표시한다는 의미
System.out.printf("%.2f\n", num2);
//숫자를 넣으면 .뒤 2개 자릿수라서 3.14가 나오고
System.out.printf("%.4f\n", num2);
//.4를 넣어서 3.1400이 나왔다.
System.out.printf("%.3f\n", 3.4567);
자릿수 표기 (천단위 표기 - 3자리씩)
int price = 1234567;
System.out.printf("금액: %d원\n", price);
System.out.printf("금액: %,d원\n", price); //,를 찍음으로써 자릿수 표기 가능
System.out.printf("%32d변수 ")//32두칸을 가지고 출력
//천단위 + 소수이하(2자리) + 출력너비(20자리, 우측정렬) 하는법
double num3 = 1234567.7890123; //정수가 7자리 소수 적당히
System.out.printf( "[%20.2f]\n", num3);
//20자리를 확보하는데 .(점)도 자릿수에 포함 + ,도 포함
%-32d변수 > 32두칸을 가지고 좌측 정렬(음수)
%32d변수 > 32두칸을 가지고 우측 정렬(양수)
컴파일러가 번역을 할 때, 소스의 문자를 그대로 출력하지 않고, 미리 약속된 표현으로 바꿔서 출력하는 요소
\n - new line, line feed
"안녕하세요.\n홍길동입니다." 문자열 리터럴내에는 엔터를 작성할 수 없기 때문에 \n을 넣어 엔터역할을 수행해야한다.
\r - carriage return
캐럿(=커서)
캐럿의 위치를 현재 라인의 맨 앞으로 이동(행의 처음으로)
이클립스는 적용 x
"안녕하세요\r홍길동" 커서가 앞으로 돌아가 안녕하가 사라지고 "홍길동세요" 가 출력된다.
\t- tab
"하나 둘 셋" > tab을 쳤지만 몇번 쳤는지 알 수 없다.
"하나\t둘\t\t셋" > \t를 사용해 내가 몇번 쳤는지 볼 수 있어 가독성이 좋다.
\b - backspace
"홍길동\b입니다." > "홍길입니다." 라고 출력
\", \', \\
이미 역할이 있는 문자를 역할이 없게 만드는 작업
컴파일러는 쌍따옴표가 시잘될때 문자열이 시작된다고 인식
"홍길동: \"안녕하세요.\""; > "홍길동: "안녕하세요"";
//요구사항) 수업 폴더의 경로를 출력하시오.
//C:\class\code\java
System.out.println("C:\class\code\java");
Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
escape sequence를 쓰지 않고 역슬래쉬를 입력해서 오류
class PhoneInfo{
private String name, phoneNumber, birthday;
PhoneInfo(String name, String phoneNumber,String birth){
this.name = name; this.phoneNumber = phoneNumber;
this.birthday = birth;
}
public void printCS() {
System.out.printf("이름 : %s / 전화번호 : %s / 생년월일 : %s", name, phoneNumber, birthday);
}
}
class Practice{
public static void main(String[]arg) {
PhoneInfo manage = new PhoneInfo("정현지", "010-3282-", "011030");
manage.printCS();
}
}
생성자에 초기화 시킬때 this(a,b,c,); 이런식도 가능하다.
syso해서 객체 변수이름을 넣으면 toString메소드를 출력하는 메커니즘은 메서드 이름이 꼭 toString이여야하고, 리턴값이 있어야한다.
public 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 PhoneInfo(String name, String phoneNumber)
{
this(name, phoneNumber, null);
}
public void showPhoneInfo()
{
System.out.println("이름 : " + name);
System.out.println("전화번호 : " + phoneNumber);
if(birthday != null)
System.out.println("생년월일 : " + birthday);
}
}
public class PhoneInfoMain
{
public static void main(String[] args)
{
PhoneInfo pInfo1 = new PhoneInfo("홍길동", "01012345678", "19900701");
PhoneInfo pInfo2 = new PhoneInfo("홍길순", "01012345679");
pInfo1.showPhoneInfo();
pInfo2.showPhoneInfo();
}
}
생성자를 두개 만들어서 이름을 같게해 오버로딩시키는것이구나..
위에서 말했던 to String은 없지만 그래도 알아두기!!!
package com.test.blog;
import java.util.Scanner;
class PhoneInfo{
private String name, phoneNumber, birthday;
PhoneInfo(String name, String phoneNumber,String birth){
this.name = name; this.phoneNumber = phoneNumber;
this.birthday = birth;
}
PhoneInfo(String name, String phoneNumber){
this(name, phoneNumber, null);
}
public void printCS() {
if(birthday != null)
System.out.printf("이름 : %s / 전화번호 : %s / 생년월일 : %s", name, phoneNumber, birthday);
}
}
class Practice{
public static void main(String[]arg) {
Scanner sc = new Scanner(System.in);
String name = null, phoneNumber = null, birthday = null;
while(true) {
System.out.println("================================");
System.out.println("선택하세요...");
System.out.println("1. 데이터 입력");
System.out.println("2.프로그램 종료");
System.out.print("선택: ");
String user = sc.next();
sc.nextLine();
if(user.charAt(0) == '1') {
System.out.println("-----------------------------");
System.out.print("이름 : ");
name = sc.nextLine();
System.out.print("전화번호 : ");
phoneNumber = sc.nextLine();
System.out.print("생년월일 : ");
birthday = sc.nextLine();
System.out.println("입력이 완료됐습니다.");
System.out.println();
System.out.println("입력된 정보 출력...");
PhoneInfo manage = new PhoneInfo(name, phoneNumber, birthday );
manage.printCS();
System.out.println();
}
else if(user.charAt(0) == '2') {
System.out.println("프로그램 종료");
break;
}
else System.out.println("잘못된 입력 값 입니다.");
}
}
}
사용자에게 이름을 입력받을때이름은 입력이 안받아지고 바로 전화번호를 입력받아지는 이슈가 발생했다
그 이유는 위에서 사용자에게 값을 받아올때 sc.next()에서 엔터를 제외한 문자를 출력하고 버퍼에는 엔터값이 남아있기때문에 바로 밑에서 입력받는 이름에서 엔터값이 들어가 바로 스킵되는 원리다.
**그래서 sc.nextLine()을 이용해 엔터값을 흡수해야한다. 항상 생각하자!!!

import java.util.Scanner;
public class PhoneInfoMain
{
public static final int INPUT_PHONEINFO = 1;
public static final int PROGRAM_QUIT = 2;
public static void main(String[] args)
{
PhoneInfo info1 = null;
Scanner sc = new Scanner(System.in);
//Scanner sc = new Scanner(System.in, "EUC-KR");
int menu = 0;
String name, phoneNumber, birthday;
while(true)
{
System.out.println("선택하세요...");
System.out.println("1. 데이터 입력");
System.out.println("2. 프로그램 종료");
System.out.print("선택 : ");
menu = sc.nextInt();
sc.nextLine();
switch(menu)
{
case INPUT_PHONEINFO:
System.out.print("이름 : ");
name = sc.nextLine();
System.out.print("전화번호 : ");
phoneNumber = sc.nextLine();
System.out.print("생일 : ");
birthday = sc.nextLine();
System.out.println("입력이 완료되었습니다.");
System.out.println();
System.out.println("입력된 정보 출력...");
info1 = new PhoneInfo(name, phoneNumber, birthday);
info1.showPhoneInfo();
break;
case PROGRAM_QUIT:
System.out.println("프로그램을 종료합니다.");
return;
default:
System.out.println("잘못 입력하셨습니다.");
}
}
}
}
public static final int INPUT_PHONEINFO = 1;
public static final int PROGRAM_QUIT = 2;`
연속된 메모리 공간을 확보한 객체
배열의 인덱스는 0부터 시작
생성과 선언 2단계를 거쳐 이루어진다.
int [] num = new int[3]; //3짜리 배열 생성
num.length; //배열의 길이를 나타내는 메서드호출
int num[] = new int[]의 형태도 가능하나 위처럼 자료형과 변수이름을 구별하는 형태로 선언
배열의 주소값을 가지고있는 참조변수는 int변수에 들어갈 수 x
그러나 배열 안에 값을 넣는것은 가능하다.
int num3 = num2[0] 의 형태
class Practice{
public static void main(String[]arg) {
int temp = 0;
int user = 0;
Scanner sc = new Scanner(System.in);
System.out.println("선택정렬 할 수를 입력하세요 : ");
user = sc.nextInt();
int [] array = {user};
int n = array.length;
}
}
import java.util.Scanner;
public class SelectionSortArray {
public static void main(String[] args) {
final 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");
}
}
배열속 숫자를 for문을 이용해 서로 비교 시켜야 하는 개념이였다.
5를 상수로 지정해서 배열의 길이를 5로 지정한다
for문을 통해 수를 입력받는다. 바깥쪽 for문은 0이 다른값들과 비교하는 코드고, 안쪽 for문은 비교하는 수는 하나 앞에있는 값과 비교하기 때문에 +1하는것
array.length 는 문자열의 길이를 반환해줬던 String.length()와는 다른 메소드호출이다.
지금 사용되는 array.length는 배열의 길이 속성으로, 배열 객체에 내장된 값으로 바로 접근한다.
치환을 최대한 적
import java.util.Scanner;
public class SelectionSortArray {
public static void main(String[] args) {
final 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");
}
}
import java.util.Scanner;
class BubbleSort
{
public static void main(String[] args)
{
final 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=0;j<num.length-1-i;j++)
{
if(num[j]>num[j+1])
{
temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
}
}
for(int i=0;i<num.length;i++)
System.out.print(num[i] + "\t");
}
}
나는 j +1했는데 답은 올바르게 나왔으나 버블정렬은 아니였던
import java.util.Scanner;
class BubbleSort2
{
public static void main(String[] args)
{
final int SIZE = 5;
int[] num = new int[SIZE];
Scanner sc = new Scanner(System.in);
int temp = 0;
boolean flag = true;
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 && flag;i++)//flag가 거짓이 되었을때 이미 정렬이 다 끝난것을 의미해서 치환을 종료
{
flag = false;
for(int j=0;j<num.length-1-i;j++)//마지막 배열과는 비교해야하니까 -1시킨다.
{
if(num[j]>num[j+1])
{
temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
flag = true;//정렬이 덜 되어서 치환할것이 남아있다면 true;
}
}
}
for(int i=0;i<num.length;i++)
System.out.print(num[i] + "\t");
sc.close();
}
}