본문 바로가기

Java

JAVA Programming(Ch 12.콘솔 출력)

12 - 1 콘솔 출력

* 콘솔 : 컴퓨터를 대상으로 데이터를 입력 및 출력하는 장치 총칭 ( 키보드, 모니터 등 )

* System.out.println -> ' 자바의 대표적인 콘솔 출력 메소드 '

 

< AutoCallToString >

class Box {
   
private String conts;
   
   
Box(String cont) {
       
this.conts = cont;
   
}
   
public String toString() {
       
return conts; // 문자열 반환. String 인스턴스의 참조값을 여기서 반환
   
}
}

public class AutoCallToString {
   
public static void main(String args[]){
        StringBuilder stb =
new StringBuilder("12") // 문자열 전달
       
stb.append(34);
       
System.out.println(stb.toString());
       
System.out.println(stb);
       
       
Box box = new Box("camera");
       
System.out.println(box.toString())
        System.
out.println(box);
   
}
}

< 출력 >

1234

1234

camera

camera

* Box 클래스, StringBulider 클래스의 공통점

         -> “문자열을 반환하는 public String toString() 메소드가 정의되어 있다”

* System.out.println은 참조 값이 전달되면, 이 값의 인스턴스를 대상으로 toString 메소드를 호출한다. 그리고 이 때 반환되는 문자열을 출력한다.

 

* System.out.println(stb.toString());   

-> toString 메소드를 호출했을때 반환하는 값 println의 인자로 전달이 되어 출력하도록 함.

* System.out.println(stb);

-> 참조하고 있는 것 StringBulider --> 이 참조값을 바탕으로 참조값이 가리키는 인스턴스의 toString 메소드를 호출. 이 때 반환되는 문자열 println 메소드가 출력

* System.out.println(box.toString())

-> println 메소드에는 Camera라는 String 인스턴스의 참조값이 전달이 된다. -> Camera 출력

* System.out.println(box);

-> box라는 참조변수가 가지고 있는 참조값을 그냥 통째로 전달. toString 메소드를 호출해서 (있다면) 반환되는 값이 아닌 그냥 던짐 --> 여전히 Camera출력

* println 또는 print에 인스턴스의 참조 값이 전달되면 해당 참조값이 참조하는 인스턴스의 toString 메소드가 반환하는 문자열 출력 !

IF) toString 메소드가 정의되어 있지 않다면?

먼저. 자바의 모든 클래스는 toString 클래스를 가지고 있다. 내가 정의하지 않아도 기본적으로 존재.

결론. toString 메소드가 존재하지 않는 인스턴스는 없다.

 

* 인스턴스에 참조값이 전달될 때 println이 내부적으로 하는 일

-> 전달된 참조값을 바탕으로 해당 인스턴스의 toString 메소드 호출                                  ( 인자를 받지 않는 String toString() 형태의 메소드 호출 )

따라서, String 인스턴스의 참조값이 문자열이 반환이 될 것. 이걸 println 메소드가 출력해냄.

 

' 전달되는 인자의 수가 다양 ! '

 

< FormatString >

public class FormatString {
   
public static void main(String args[]) {
       
int age = 20;
        double
height = 178.2;
       
String name = "YOON SUGN WOO";

       
System.out.printf(" name: %s \n", name);
       
System.out.printf(" age: %d \n height: %e \n\n", age, height);

       
System.out.printf(" %d - %o - %x \n\n", 77,77,77);
       
System.out.printf(" %g \n", 0.00014); // 적으면 그냥 소수점으로 나옴
       
System.out.printf(" %g \n", 0.000014); // 소수점 자리 수가 많아지면 지수 표기법으로
   
}
}

 

< 출력 >

name : YOON SUGN WOO

age : 20

height : 1.78000e+02

 

77 - 115 - 4d

 

0.000140000

1.40000e-05

 

 

 

12 -2 콘솔 입력 ( Console Input )

 

* Scanner 클래스 -> ' 데이터를 스캔하는 기능의 클래스. 키보드의 입력을 읽어들이는 코드를 쉽게 구성 ! '

- Scanner 클래스 자체를 이해하기 ! 이 클래스가 속한 패키지는 java.util이다.

Scanner 클래스는 생성자로 전달되는 대상으로부터 데이터를 추출하는 기능 제공( '읽어들인다' 라고 생각하기 ) . 그리고 Scanner 인스턴스들 파일이나 String 인스턴스 등 다양한 대상으로부터의 데이터 추출이 가능.

 

Ex)  < ScanneringString > - String 인스턴스로부터 데이터 추출 ( 사실 이런 코드 작성할 일 ㅂㄹ )

import java.util.Scanner;

public class
ScanneringString {
   
public static void main(String args[]) {
        String source =
"1 3 5";
       
Scanner sc = new Scanner(source); // Scanner 인스턴스 생성 -> 연결돼서 스캔 가능해짐
       
int num1 = sc.nextInt(); // int형 데이터 추출
       
int num2 = sc.nextInt();// int형 데이터 추출
       
int num3 = sc.nextInt(); // int형 데이터 추출

       
int sum = num1 + num2 + num3;
       
System.out.printf("%d + %d +%d = %d \n", num1, num2, num3, sum );
   
}
}

< 출력 >

1 + 3 +5 = 9

 

--> Scanner 클래스의 인스턴스 생성은 데이터를 뽑아 올 대상과의 '연결'을 의미한다.             연결후에는 데이터 스캔 가능 !

* Scanner sc = new Scanner(source);

-> Scanner 인스턴스와 인자로 전달된 source와의 연결로 이어진다. 그래서 참조변수 sc를 통해 데이터를 추출하면 source가 참조하는 대상으로부터 데이터가 추출이 된다.

그런데 , 예제에서 source는 문자열 -> 그러나 그 대상이 문자열이 아니더라도 데이터를 추출하는 방법은 달라지지 않는다.

 

< Scanner 클래스의 키보드 적용 >

* 장점 ) Scanner 인스턴스 생성 이후에 데이터를 스캔하는 방법에 있어서는 차이가 없다 !    ( 연결 만 끝나면 스캔하는 방법 차이 X ) , 연결 대상에 의존적이지 않은 코드의 작성이 가능!

 

앞 예제를 수정해서 Scanner 인스턴스를 키보드와 연결하고자 함

           Scanner sc = new Scanner( source ) ;

                      -> Scanner sc = new Scanner ( System.in ) // in -> static 변수

* Scanner의 생성자로 전달된 ' System.in은 키보드를 의미 -> 키보드를 의미하는 인스턴스의 참조변수 '

 

< ScanningKeyboard >

import java.util.Scanner;

public class
ScanningKeyboard {
   
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);
   
}
}

< 출력 >

12 --> 12 치고 엔터 : 입력의 완료. Scanner클래스는 nextInt를 호츌한 상태니까 12를 불러와서 반환한다.

24

36

--> 3개의 정수형 데이터를 입력받겠다 !

12 + 24 + 36 = 72

 

* nextInt 메소드가 호출되면 키보드로부터 데이터가 입력될 때까지 프로그램 실행 '대기 상태' 

 

< Scanner 클래스의 주요 메소드들 >

* int nextInt ( )

* byte nextByte ( )  -> Byte 형으로 데이터를 읽어들이겠다.

--> 둘 다 정수의 입력을 위한 메소드. 정수의 반환형에 차이가 존재.

Ex) 키보드로부터 8이 입력.

이를 nextByte로 읽으면 8 byte형으로 반환. nextInt로 읽으면 8 int형으로 반환

* String nextLine ( )  -> 문자열을 읽어들이는 메소드

* double nextDouble ( )

* bolean nextBoolean ( ) -> true or false 정보를 읽어들이겠다 

 

< ReadString > -> nextLine 메소드 호출 관련 예제

import java.util.Scanner;

public class
ReadString {
   
public static void main(String args[ ]){
        Scanner sc =
new Scanner(System.in); // 키보드의 입력을 받겠다.

       
System.out.println("문자열 입력 : " );
       
String str1 = sc.nextLine();

       
System.out.println("문자열 입력 : " );
       
String str2 = sc.nextLine();

       
System.out.printf("입력된 문자열 1 : %s \n" ,str1);
       
System.out.printf("입력된 문자열 2 : %s \n" ,str2);
   
}
}

 

문자열 입력 :

Today is Friday // 내가 입력함

문자열 입력 :

I love Java

입력된 문자열 1 : Today is Friday

입력된 문자열 2 : I love Java