열한 번째 수업

정혅·2024년 2월 22일

더 조은 아카데미

목록 보기
16/76

toString 메커니즘

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("");
    }
}
  • fnd1을 출력하면 자동으로 toString이 실행되는 메커니즘이다.
  • 메서드 이름이 toString이여야하고, 반환값이 반드시 존재해야한다.

콘솔 입출력

콘솔 입출력, Console Input Output > IO = 이클립스 콘솔 과 cmd

  • 기본 입력 장치: 키보드

  • 기본 출력 장치: 모니터

콘솔 출력

  • 클래스 필드 메서드 인자; > 명칭
  1. System.out.println(); - 괄호 안에 값
  • println 메서드

  • print line > 값을 행단위로 출력한다. > 값을 출력한 뒤 엔터를 친다. (자동으로 엔터를 치고 끝나는 특성이라 행이 바뀌는것)

  1. system.out.print();
  • print 메서드

  • 값을 출력하고 엔터를 치지 않는다.

  1. System.out.printf(); 아주 유용!
  • printf 메소드

  • print format > 출력 형식에 맞게 출력한다.

  • String.format() 메서드와 동일

형식문자(printf)

  • 형식 문자(PlaceHolder)제공

  • 엔터를 쳐주지 않음, 직접 \r,\n 쳐줘야함

  • 가독성 향상(굉장히 많이)

  1. %s > 문자열 (String)

  2. %c > 단일 문자 (char)

  3. %d > Decimal(정수) > byte, short, int, long

  4. %f > Float(실수) > float, double

  5. %o > 정수 8진수

  6. %x > 정수 16진수(알파벳이 사용될때 소문자로 %X면 대문자로)

  7. %g > 소수점 이하 5자리까지 출력

  8. %e > 소수점 이라 6자리 이상이면

  9. %c > char

  10. %b > Boolean

11.%% > %출력

//요구사항) "안녕하세요.홍길동님" 문장을 출력하시오.
    String name = "홍길동"; //사용자가 키보드로 입력한 이름
    System.out.println("안녕하세요." + name + "님.");
    System.out.printf("안녕하세요. %s님",name);바뀌는것
    // 쓰는 이유는 이렇게 쓰는게 훨씬 이해하기, 보기 쉽기 때문에 쓰
는것);
    //요구사항) "안녕하세요.홍길동님. 안녕히가세요. 홍길동님"
    System.out.printf("안녕하세요. %s님. 안녕히가세요. %s님.",name, name);
  • %s는 name 대신 줄을 서놨다가 콘솔 들어가기 직전 자리가 바뀐다.

형식문자 확장기능

  1. %d, %s, %f, %c, %b - %알파벳 사이에 정수를 넣을 수 있음
  • 정수

  • 출력할 내용의 너비를 지정한다.

  • 탭분자처럼 열을 맞추기 위한 기능

    • (+) 양수 : 우측 정렬

    • (-) 음수 : 좌측 정렬

%f

사이에는 .(점)숫자 = %.숫자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);
  • 반올림이 되는애가 있고 안되는 애가 있기때문에 항상 확인 마지막 문장은 반올림되서 나왔음
%d

자릿수 표기 (천단위 표기 - 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두칸을 가지고 우측 정렬(양수)

Escape Sequence(특수문자)

컴파일러가 번역을 할 때, 소스의 문자를 그대로 출력하지 않고, 미리 약속된 표현으로 바꿔서 출력하는 요소

  • \n - new line, line feed

    • 개행 문자

"안녕하세요.\n홍길동입니다." 문자열 리터럴내에는 엔터를 작성할 수 없기 때문에 \n을 넣어 엔터역할을 수행해야한다.

  • \r - carriage return

    • 캐럿(=커서)

    • 캐럿의 위치를 현재 라인의 맨 앞으로 이동(행의 처음으로)

    • 이클립스는 적용 x

"안녕하세요\r홍길동" 커서가 앞으로 돌아가 안녕하가 사라지고 "홍길동세요" 가 출력된다.

  • \t- tab

    • 탭문자 > 4칸씩 띄는것 x 고정되어 있는 위치가 존재해 그에 맞춰 옮겨지는 것이다.

"하나 둘 셋" > tab을 쳤지만 몇번 쳤는지 알 수 없다.

"하나\t둘\t\t셋" > \t를 사용해 내가 몇번 쳤는지 볼 수 있어 가독성이 좋다.

  • \b - backspace

    • 원래는 커서를 전으로 옮기는 거지만 사용자 편의성으로 지워지는걸로 바뀐것 이클립스에서만 비지원

"홍길동\b입니다." > "홍길입니다." 라고 출력

  • \", \', \\

    • 이미 역할이 있는 문자를 역할이 없게 만드는 작업

    • 컴파일러는 쌍따옴표가 시잘될때 문자열이 시작된다고 인식

      • 리터럴 안에는 쌍따옴표를 넣을 수 x, 그래서 역슬래쉬를 앞에 붙인다.

"홍길동: \"안녕하세요.\""; > "홍길동: "안녕하세요"";

//요구사항) 수업 폴더의 경로를 출력하시오.
//C:\class\code\java
System.out.println("C:\class\code\java");
Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ )
  • escape sequence를 쓰지 않고 역슬래쉬를 입력해서 오류

    • 그래서 역슬래쉬 앞에 역슬래쉬 덧붙여서 사용해 의미없게 만들

단계별 퀴즈1 - 전화번호 관리 프로그램문제(생성자 오버로딩)

내가한것 - 생성자 오버로딩은 어떻게하는지..
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은 없지만 그래도 알아두기!!!


단계별 퀴즈 2 - 사용자에게 이름, 전화번호, 생년월일을 입력받아서 출력하기

if문 사용해서 내가한것 - 정답
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()을 이용해 엔터값을 흡수해야한다. 항상 생각하자!!!

case문 사용해서 선생님 정답 - 클래스는 같으니 메인만
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;`
  • 위에서 이렇게 상수로 만든 이유는 case문을 쓸 때 1 과 2의 코드를 분석해야만 무슨 코드인지 알 수 있기 때문에, 문장을 상수로 설정해 case문의 이름으로 사용한 것이다. > 처음본 사람도 바로 알 수 있도록

배열(Array)

연속된 메모리 공간을 확보한 객체

배열의 인덱스는 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();
	}
}

0개의 댓글