[JAVA] 변수의 타입과 입출력

2023. 11. 2. 21:42프로그래밍 언어/Java

1. JVM(Java Virtual Machine)

자바는 다른 언어들과 달리 운영체제에 독립적이다. 자바 응용프로그램은 운영체제나 하드웨어가 아닌 JVM 하고만 통신하고 JVM이 해당 운영체제가 이해할 수 있게 변환해서 전달한다. 그래서 자바로 작성된 프로그램은 운영체제나 하드웨어에 관계없이 실행 가능하다. 단, JVM은 OS에 종속적이기 때문에 해당 OS에서 실행가능한 JVM이 필요하다.


2. 변수의 타입

변수의 타입은 크게 기본형과 참조형으로 나눌 수 있다. 기본형 변수는 data를 저장하는 반면, 참조형 변수는 어떤 값이 저장되어 있는 memory address를 값으로 갖는다.

 

기본형 변수 타입은 boolean, char, byte, short, int, long, float, double으로 논리형, 문자형, 정수형, 실수형 변수들이 이에 속한다. 그 외 나머지 타입들은 모두 참조형 변수에 속한다. 참조형 변수를 선언할 때 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 참조변수의 타입이 된다. 따라서 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈이다.

 

참조변수를 선언은 아래와 같이 한다.

Date today = new Date(); (클래스이름 변수이름;)

이런식으로 Date클래스 타입의 참조변수 today를 선언하고 Date 객체를 생성해서 그 주소로 초기화했다. new 연산자는 객체를 생성하고 생성한 객체의 주소를 반환하는 함수이다. 참조형 변수의 가장 큰 특징은 메서드 호출이 가능하다는 것인데, 이건 나중에 공부하자.


3. 상수와 리터럴

상수는 변수와 마찬가지로 값을 저장할 수 있는 공간이지만, 변수와 달리 한 번 저장하면 다른 값으로 변경할 수 없다. final키워드를 붙여 변수를 선언하면 더 이상 변경할 수 없는 상수가 된다. 상수의 이름은 모두 대문자로 하는 것이 암묵적인 관례이다.

final int MAX; //에러, 상수는 선언과 동시에 초기화를 해줘야 한다.
final int MAX2 = 144;
MAX2 = 169; //에러, 상수는 변경할 수 없다.

 

리터럴에 접미사, 접두사를 이용하여 형태를 지정해줄 수 있다. 이게 무슨 말이냐면 123이라고 쓰인 숫자는 long 타입으로 지정하고 싶어도 자동으로 int형으로 지정되는데, 이를 접미사, 접두사로 구분할 수 있다는 말이다.

 

정수형의 경우 아무 접미사가 없으면 int타입의 리터럴이다. 접미사 'l', 'L'이 붙으면 long타입의 리터럴이다. 타입 외에도 진법을 표시해 줄 수 있다. '0b'가 붙으면 2진수, '0'은 8진수, '0x'는 16진수이다.

 

실수형은 아무 접미사가 없거나 'd'를 쓰면 double형, 'f는 float형이다. double형이 더 큰 타입인데 기본형이므로 아래와 같은 실수를 주의해야 한다.

float = pi = 3.14; //에러, 3.14는 double형이고 더 작은 float형 변수에 저장할 수 없다.

e를 이용한 지수 표현식도 알아두면 좋다. 3.14e3는 3.14 * 10^3이다.

 

마지막으로 문자 리터럴과 문자열 리터럴도 꼭 구분해 두자. 문자열 리터럴은 ""안에 아무런 문자도 넣지 않은 빈 문자열을 허용한다. 하지만 문자 리터럴은 ''안에 반드시 하나의 문자가 있어야 한다. 참고로 String은 클래스이므로 new 연산자를 사용해서 초기화해야 하지만 String만은 특별히 String str = "";와 같이 초기화할 수 있다. 그리고 덧셈 연산자로 문자열을 결합할 수 있다. 덧셈 연산자는 피연산자 중 어느 한쪽이 String이면 나머지 한쪽을 먼저 String으로 변환한 후 다음 두 String을 결합한다.


4. 출력 - printf(), println()

println()은 printf()의 편리한 버전이다. println()은 자동으로 줄 바꿈을 해주고, +로 변수와 문자열을 결합해서 출력한다. 이처럼 println()은 편하지만 변수의 값을 그대로 출력하므로 다른 형식으로 출력할 수 없다. 따라서 변수를 지시자로 형식을 직접 지정하여 출력하는 printf()도 알고 있어야 한다. 지시만 몇 개 봐두자.

%b boolean 형식으로 출력
%d 10진수 정수로 출력
%o 8진수 정수로 출력
%x 16진수 정수로 출력
%f float 부동 소수점 형식으로 출력
%e 지수 표현식 형식으로 출력
%c 문자로 출력
%s 문자열로 출력

지시자들에 숫자가 붙는 경우도 볼 수 있는데 먼저 예제로 봐보자.

public class FormatExample {
    public static void main(String[] args) {
        int intValue = 42;
        double doubleValue = 3.1415926535;
        String stringValue = "Hello, Java!";

        // %5d: 5자리의 필드에 정수 출력
        System.out.printf("%5d%n", intValue);

        // %-5d: 5자리의 필드에 정수 출력하고 왼쪽 정렬
        System.out.printf("%-5d%n", intValue);

        // %05d: 5자리의 필드에 정수 출력하고 필요한 경우 0으로 채움
        System.out.printf("%05d%n", intValue);

        // %f: 부동소수점 기본 출력
        System.out.printf("%f%n", doubleValue);

        // %14.10f: 14자리의 필드에 소수점 이하 10자리까지 출력
        System.out.printf("%14.10f%n", doubleValue);

        // %.10f: 소수점 이하 10자리까지 출력
        System.out.printf("%.10f%n", doubleValue);

        // %.8s: 8자리까지 문자열 출력
        System.out.printf("%.8s%n", stringValue);
    }
}

 

출력

   42
42   
00042
3.141593
     3.1415926535
3.1415926535
Hello, J

 

예제처럼 % 5d는 5자리를 확보하고 우측 정렬해서 출력한다는 뜻이다. %-5d는 좌측 정렬이고 % 05d는 5자리를 확보해서 우측정렬한 후 빈 공간을 0으로 채워 출력한다는 뜻이다. 소수점에 대해서는 % 전체자리. 소수점아래자리 f로 이해하면 된다.


5. 입력 - Scanner

Scanner 클래스를 사용하여 콘솔로 입력받을 수 있다. 먼저 Scanner 클래스를 사용하려면 아래의 문장을 추가해줘야 한다.

import java.util.*;

그리고 Scanner 클래스의 객체를 생성한다.

Scanner sc = new Scanner(System.in)

 

이제 sc의 메서드로 입력을 받을 수 있다. nextLine()으로 문자열을 입력받을 수 있고 입력받은 문자열을 Integer.pairseInt() 메서드로 정수로 바꿀 수 있다. 물론 처음부터 nextInt()로도 입력을 받을 수 있다. 하지만 이 메서드로 입력을 받으면 연속적으로 값을 입력받아서 사용하기 까다로우므로 보통 nextLine()으로 입력받고 ***. parse***()로 변환하여 사용하는 편이다.

Scanner scanner = new Scanner(System.in);

System.out.print("정수를 입력하세요: ");
int intValue = scanner.nextInt();
scanner.nextLine(); // 개행 문자 소비

System.out.print("문자열을 입력하세요: ");
String stringValue = scanner.nextLine();

 

여기서 주의해야 할 점이 nextLine()으로 개행문자를 소비해 주는 부분이다. nextInt(), nextDouble() 등의 함수들은 정수와 실수를 읽어오고 그 뒤에 있는 공백이나 개행문자는 모두 무시한다. 하지만 nextLine() 함수는 공백을 포함하여 입력받고 개행문자(엔터키)를 기준으로 라인을 처리하기에 개행문자를 한 번 비워줘야 한다.