#210831#scanner#string객체#equals
배운 내용
import java.util.Scanner; //1. import문 추가
public class ScanfEx1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//2. Scanner 클래스의 객체 생성
Scanner scanner = new Scanner(System.in);
//3. 입력 받기
/* int num = scanner.nextInt();
int num2 = scanner.nextInt();
System.out.println(num);
System.out.println(num2); */
//라인 단위로 입력: 값이 여러개인 경우
//숫자나 문자열 혹은 실수가 섞여있을 때 사용(쪼갤 필요가 있을 때).
String input = scanner.nextLine();
int num = Integer.parseInt(input);
System.out.println(num);
}
}
1. 자바 표준 입력 클래스인 Scanner을 사용하려면 import를 통해 외부 클래스를 호출해야 함.
- Scanner은 java.util 패키지에 있으므로 java.util*; 이라고 작성해도 무관.
2. Scanner 클래스의 객체를 생성한 뒤
3. 정수라는 가정하에 입력을 받는다. 입력받는 방법에는 두 가지가 있다.
1) int num = scanner.nextInt();
바로 화면에 출력하게 하는 입력 구문이다.
2) String input = scanner.nextLine();
int num = Integer.parseInt(input);
a. 한줄 씩, <Line> 단위로 입력을 받는 경우이다.
b. 값이 여러개이거나 숫자, 문자열, 실수가 섞여있을 때 사용한다.
(= 쪼갤 필요가 있을 때)
응용
//Scanner 클래스 응용, 이름과 키와 몸무게 입력받기.
import java.util.Scanner; //1. import를 통해 외부 클래스 호출.
public class ScanfEx1_2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//2. Scanner 객체 생성
Scanner scanner = new Scanner(System.in);
//3. 입력값 받기
System.out.println("이름을 입력해주세요");
String name = scanner.next();
System.out.println("키와 몸무게를 입력해주세요");
int height = scanner.nextInt();
int weight = scanner.nextInt();
//4. 출력
System.out.println(name);
System.out.println(height+"cm");
System.out.println(weight+"kg");
1. 이름, 키와 몸무게를 입력받도록 해보았다.
>> 출력결과
(1차) 190cm에 90kg인 k가 탄생했다.
한 줄로 출력하면 조금 더 가독성이 좋을 것 같다.
(2차) 입력값 3개를 한 줄에 출력하도록 했다.
(3차) 사용자에게 해당 정보가 맞는지 물어보고
맞다면 다음 단계 진행, 틀리다면 재입력 받도록 해보았다.
> 여기서.. 문제 발생.
2. 3차 응용과정에서 문제 발생. 코드는 잘 짠 것 같은데 원하는 내용이 출력되지 않음.
1) 출력 코드
System.out.printf("당신은 %s,\n키는 %dcm, 몸무게는 %dkg입니까?(y/n)", name, height, weight);
String answer = scanner.next();
if (answer == "y")
{
System.out.println("다음 단계를 진행할 수 있습니다.");
}
else System.out.println("다시 입력해주십시오");
입력 받은 값이 y이면 "다음 단계를 진행할 수 있습니다." 가 출력되어야 하는데
입력 받은 값이 n일때의 출력 메세지가 나오는 상황.
2) 구글링을 통해 이유 발견
int, double, float, char 등등의 자료형은
Java에서 제공해주고 있는 기본 자료형(프리미티브 타입의 자료형).
String은 기본자료형(프리미티브)이 아님.
자바에서는 객체의 이름을 설정할때, 맨앞글자를 대문자로 한다.
String을 보면 맨 앞글자가 대문자이다.
이를 보고 String이 객체라는 것을 알 수 있다.
== 연산자를 이용하게 되면, String의 주소를 확인하기 때문에
당연히 다르다고 나온다. (출처: https://hongku.tistory.com/172 [IT에 취.하.개.])
(정리) 문자열은 객체이기 때문에 비교 연산자를 활용하여 if else구문을 작성할 수 없다.
>> 그럼 어떻게 해야 하는가?
객체 내 메소드! String 객체내에 .equals() 라는 메소드를 사용해야 한다.
3. String 객체 내 .equals() 메소드 사용하여 문제 해결
1) 수정 코드
System.out.printf("당신은 %s,\n키는 %dcm, 몸무게는 %dkg입니까?(y/n)", name, height, weight);
String answer = scanner.next();
if (answer.equals(answer))
{
System.out.println("다음 단계를 진행할 수 있습니다.");
}
else System.out.println("다시 입력해주십시오");
if 구문 안이 바뀐 것을 볼 수 있다.
(기존) answer == "y" (수정) answer.equals(answer)
수정 후 오른쪽에 보이듯이 정상적으로 출력됨을 확인할 수 있었다.
2) 참고
응용문을 만들면서 ==, >=, <= 등의 관계연산자를 사용했고
이 과정에서 오류가 생겨 알아본 바, 문자열에서 비교할 때는 .equals 메소드를 사용한다는 것을 알게 됐다.
그러나 주의할 점은 equals()를 단순히 문자열 비교메소드로 생각하면 안된다는 것이다.
equals()는 객체 비교 메소드로, 객체간 비교를 하기 위해서 해당 메소드를 오버라이딩 해야하기 때문이다.
(출처: https://multifrontgarden.tistory.com/89 [우리집앞마당])
* 오버라이딩: 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의하여 사용하는 것.
(오버로딩과 오버라이딩의 차이점, https://private.tistory.com/25)
'[JAVA]' 카테고리의 다른 글
Long과 long은 어떤 차이가 있는 걸까? (0) | 2023.11.03 |
---|---|
자료형 정리 (2) | 2023.10.31 |
try-catch-finally 말고 try-with-resources 사용법 (0) | 2023.06.10 |
객체 / 객체지향 프로그래밍의 특징 (0) | 2021.09.13 |
Anonymous Class - 익명 클래스, 무명 클래스 (0) | 2021.09.13 |