본문 바로가기
TIP/Java

[Java] Tips-자바 백문백답 - 전부 모아보기

by SeolLab. 2023. 4. 1.
728x90

Q: 자바에서 한 파일 내에 여러 클래스로 정의가 가능한가? 

 

A: 자바에서는 한 .java 파일 안에 여러개의 클래스를 정의할 수 있다. 그러나 이 경우, 그 중 하나의 클래스는 public으로 선언되어야 하며, 파일의 이름은 public 클래스의 이름과 동일해야 한다.

예를 들어, 다음과 같은 두 개의 클래스가 있는 경우, 

public class MyClass {
  // ...
}

class MyOtherClass {
  // ...
}

와 같이 선언해야 한다. 

위 코드를 MyClass.java 파일에 작성하면 된다. MyClass 클래스가 public으로 선언되어 있으므로, 파일 이름도 MyClass.java로 저장해야 한다.

이제 MyOtherClass 클래스는 MyClass 클래스에서 사용할 수 있으며, 다른 파일에서도 사용할 수 있다. 다른 파일에서 MyOtherClass 클래스를 사용하려면, 해당 클래스를 import하여 사용하면 된다.

 


Q: 자바에선 자동 형변환이 어떻게 이뤄지는가? 파이썬만큼 간결한가? 

 

A: 애석하게도 파이썬만큼 간결하진 않다. 일단 자바에서는 작은 자료형에서 큰 자료형으로의 자동 형 변환이 일어난다. 즉, int 형 변수의 값을 double 형 변수에 할당하면 자동으로 int 형이 double 형으로 형 변환이 된다.

그러나 큰 자료형에서 작은 자료형으로의 형 변환은 자동으로 이루어지지 않는다.
예를 들어, double 형 변수의 값을 int 형 변수에 할당하면 컴파일러가 오류를 발생시킨다. 이 경우에는 명시적으로 형 변환을 해줘야 한다.

아래 코드를 참고하라. 

double myDouble = 3.14;
int myInt = 42;

// 자동 형 변환
myDouble = myInt;

// 명시적 형 변환
myInt = (int) myDouble;

위 예제에서, myInt 변수의 값을 myDouble 변수에 할당하면 자동으로 형 변환이 일어난다. 그러나 myDouble 변수의 값을 myInt 변수에 할당하면 명시적으로 형 변환을 해줘야 한다.

 

 double 형 변수의 값을 int 형 변수에 할당하고 명시적으로 형 변환을 해주면 소수점 이하의 값은 버려지고 정수 값만 할당된다. 이때 값이 반올림되지 않고 그대로 소수점 아래를 버리기 때문에 원하는 결과와 다를 수 있음을 주의해야 한다.

 

double myDouble = 3.14;
int myInt = (int) myDouble;

위 코드에서 myDouble 변수의 값은 3.14다. 이 값을 int 형으로 형 변환하여 myInt 변수에 할당하면, 소수점 아래의 값인 0.14는 버려지고, myInt 변수에는 값 3이 할당된다.

만약 값이 반올림되어야 하는 경우에는 Math.round() 메서드를 사용하여 반올림한 뒤 형 변환을 해줘야 한다.

아래 코드를 참고하라. 

double myDouble = 3.14;
int myInt = (int) Math.round(myDouble);

위 코드에서 Math.round() 메서드는 3.14 값을 반올림하여 3으로 만든 뒤, 이 값을 int 형으로 형 변환하여 myInt 변수에 할당한다. 따라서 myInt 변수의 값은 3이 된다.

※(여기서 사용된 Math는 자바 API- Aplication Programming Interface에서 정의된 클래스 중 하나다. Math 클래스는 수학 함수와 상수를 제공하는 라이브러리 클래스로, 자주 사용되는 수학 함수와 상수를 제공하여 프로그래머가 간단하게 수학 연산을 수행할 수 있도록 돕는다.

Math 클래스에는 대표적으로 아래와 같은 메서드들이 있다.

  • abs(): 절대값을 반환
  • ceil(): 주어진 값보다 크거나 같은 가장 작은 정수를 반환
  • floor(): 주어진 값보다 작거나 같은 가장 큰 정수를 반환
  • max(): 두 값을 비교하여 큰 값을 반환
  • min(): 두 값을 비교하여 작은 값을 반환
  • pow(): 주어진 밑과 지수를 사용하여 거듭제곱 값을 반환(부동소숫점 형태로 반환한다, pow(밑,지수) )
  • random(): 0과 1 사이의 난수를 반환(이 때 1은 포함하지 않는다.)
  • round(): 주어진 값의 반올림 값을 반환
  • sqrt(): 주어진 값의 제곱근을 반환

이러한 메서드들은 자바 API 문서에서 자세하게 설명되어 있다. 따라서 프로그래머는 이 문서를 참조하여 Math 클래스의 메서드를 적절하게 사용할 수 있다.)

 

 


Q: 자바에서 출력할 때 개행여부는 어떤 식으로 반영할 수 있는가? 

 

A: 자바에서 출력할 때 개행여부는 출력 메서드에 따라 다르게 적용된다.

 

 

1) System.out.print() 메서드는 인자로 전달된 값을 출력하고, 개행 문자를 출력하지 않는다. 따라서 이 메서드를 사용하여 값을 출력하면 같은 줄에 출력된다.

System.out.print("Hello");
System.out.print(", ");
System.out.print("World!");

// 출력 결과: Hello, World!

 

2) System.out.println() 메서드는 인자로 전달된 값을 출력하고, 개행 문자를 출력하여 다음 줄로 이동한다. 따라서 이 메서드를 사용하여 값을 출력하면 각각 다른 줄에 출력된다.

System.out.println("Hello");
System.out.println(", ");
System.out.println("World!");

// 출력 결과:
// Hello
// ,
// World!

 

 

3) System.out.printf() 메서드를 사용하여 문자열을 포맷팅하여 출력할 수도 있다. 이 때 개행 문자는 포맷 문자열 내에 %n으로 지정한다. 

String name = "John";
int age = 30;
System.out.printf("My name is %s.%n", name);
System.out.printf("I am %d years old.%n", age);

// 출력 결과:
// My name is John.
// I am 30 years old.

따라서, 출력할 값에 따라 System.out.print() 또는 System.out.println() 메서드를 적절히 선택하여 사용하고, 필요한 경우 개행 문자를 직접 지정하여 출력한다.

 

 

 


Q: 자바의 입력 포맷에는 어떤 것들이 있는가? 

 

A: 

우선 가장 기본적인 자바의 입력 포맷은 Scanner 클래스의 메서드에서 지원되는 형식을 따른다. Scanner 클래스는 사용자로부터 키보드로 입력된 데이터를 읽는 데 사용되는데, 다음과 같은 여러 가지 형식(문자열, 숫자형, 그 외.)으로 입력을 받을 수 있다. 

 

 

1) 문자열

next() : 공백 문자로 구분된 문자열을 읽어들인다.

nextLine() : 한 줄 전체를 문자열로 읽어들인다.

 

 

2) 숫자형

nextInt() : 정수를 읽어들인다.

nextLong() : 긴 정수를 읽어들인다.

nextFloat() : 부동소수점 숫자를 읽어들인다.

nextDouble() : 더블 형태의 부동소수점 숫자를 읽어들인다.

 

 

3) 그 외...

nextBoolean() : boolean 값을 읽어들인다.

nextByte() : 바이트 값을 읽어들인다.

nextShort() : 짧은 정수 값을 읽어들인다.

next(Pattern pattern) : 패턴과 일치하는 다음 토큰을 읽어들인다.

 

 

위의 메서드들은 다양한 데이터 형식을 입력 받을 수 있으며, 입력 데이터의 포맷에 따라 적절한 메서드를 사용하면 된다. 입력 받은 데이터는 해당 메서드가 반환한 형식으로 사용할 수 있다. 

 

# 참고로 붉은 색 함수는 기억해두는 게 좋다. 정말 자주 쓰인다...   

 

 

일단 여기까지가 기본 입력 포맷이고 조금 다른 포맷을 알아보자. 

Scanner 클래스는 사용이 간편하지만 대량의 입력 데이터를 처리할 때는 속도가 느리기 때문에 대안으로 BufferedReader 클래스를 사용하는 것이 좋다.(백준을 풀다 보면 이렇게 풀어야 시간초과가 뜨지 않는 경우를 종종 보게 된다.) BufferedReader 클래스는 문자 입력 스트림으로부터 문자를 버퍼링하여 읽어 들인다.

BufferedReader 클래스에서 가장 빠른 입력 포맷은 readLine() 메서드를 사용하는 것이다. 이 메서드는 한 줄의 문자열을 읽어들이기 때문에 개행 문자까지만 입력을 받는다. 다음의 코드를 참고하라. 

 

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine(); // 한 줄의 문자열을 입력 받음
    }
}

하지만 readLine() 메서드를 사용하는 경우에는 입력 값을 자료형으로 변환해 줘야 한다. 예를 들어, 정수를 입력 받고자 하는 경우에는 다음과 같이 변환해야 한다. 

 

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int input = Integer.parseInt(br.readLine()); // 입력 받은 문자열을 정수형으로 변환
    }
}

 

또 다른 방법readLine() 메서드로 입력 값을 한 줄씩 읽어 들인 다음, String 클래스의 split() 메서드를 사용하여 공백 등의 구분자를 기준으로 입력 값을 분리한다. 분리된 값은 Integer.parseInt() 등의 메서드를 사용하여 필요한 자료형으로 변환한다. 

아래 코드를 참고하라.

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" "); // 입력 받은 문자열을 공백으로 분리하여 String 배열에 저장
        int num1 = Integer.parseInt(input[0]); // 첫 번째 원소를 정수형으로 변환하여 저장
        int num2 = Integer.parseInt(input[1]); // 두 번째 원소를 정수형으로 변환하여 저장
    }
}

위 코드에서 split(" ")는 입력 값을 공백으로 분리하는 역할을 한다. 이렇게 분리된 값은 String 형태로 저장되므로, Integer.parseInt() 등의 메서드를 사용하여 필요한 자료형으로 변환해 줘야 한다.

댓글