220321 스캐너, 다형성, 객체형변환
1. 스캐너
( 따로 이론은 없고 이클립스 실습을 통해 배움. 자바 기초 수업 때도 별다른 이론은 없었음)
▶ Scanner sc = new Scanner(System.in) > Ctrl + Shift + O 단축키를 이용해 import java.util.Scanner 만들어주기
▶ Scanner sc = new Scanner(System.in)에 빨간 줄이 떴을 때 클릭해도 자동으로 import 해준다.
▶ 입력 받는 형태에 따라 nextInt(), nextDouble(), next() 등 맞게 사용해야 함
▶ sc.next(), sc.nextLine() 모두 String 타입을 입력받지만 공백을 처리하는 방식이 다르다.
next() : 통째로가 사용자가 입력한 문자열 값. 공백 또는 엔터를 구분점으로 판단! 하고 분리하여 입력받는다.
- ex. next(홍 길동) // "홍", "길동" 이렇게 분리하여 "홍"만 입력받는다.
nextLine() : 통째로가 사용자가 입력한 문자열 값. 공백도 문자로 입력받는다.
- ex. nextLine(홍 길동) // "홍 길동" 입력됨
- 앞에 nextLine()을 제외한 다른 입력이 있다면, 의미없는 nextLine()을 미리 하나 써주어야 한다.
- (▶ 앞에서 입력 시 사용한 엔터를 공백으로 받아들여 다음 nextLine()에서 출력하기 때문에)
출처: https://turtlemoon.tistory.com/5 [달거북씨의 코딩생활]
Java 그게 뭐야? 4. printf랑 입력 메소드랑
1일차의 마지막 내용. 배우면서 느끼는 거는 공부 밀리면 답도 없겠다 하는 거... 아, 오늘은 글씨체를 변경해보았다. 티스토리는 처음이라 이것저것 바꿔보는 중 1. printf 메소드 서식문자(format
turtlemoon.tistory.com
▶ Scanner 사용 후 사용하지 않을 시 sc.close();를 써준다.
▶ 하지만 써주지 않아도 문제는 없다. 그저 Scanner cs = new Scanner(System.in); 부분에 노란줄이 뜰 뿐.
▶ 다른 블로거 분의 설명
System.in을 사용하고 close를 해주는 이유는,
JVM이 프로그램이 종료되더라도 System.in을 제대로 종료시키지 않기 때문이에요.
따라서 I/O 관련된 것들은 close로 종료시켜야 해요.
출처: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=reeeh&logNo=220430529916 [pro]
2. 다형성
2-1. 메서드 오버로드(Overload)
- 원칙적으로 하나의 클래스 안에서는 동일한 이름의 메서드가 두 개 이상 존재할 수 없지만, 이를 가능하게 하는 예외적인 처리 기법
2-2. 이름이 동일한 메서드를 정의하기 위한 조건
- 메서드 간의 파라미터가 서로 달라야 한다.
→ 파라미터의 데이터 타입이 서로 달라야 한다.
(데이터 형이 동일하고 변수의 이름이 다른 경우는 동일한 파라미터로 인식된다.)
→ 파라미터의 개수가 다르다.
→ 서로 다른 데이터 형을 갖는 파라미터들의 전달 순서가 다르다. - 리턴형이 다른 경우는 오버로드의 성립에 아무런 영향을 주지 않는다.
- 예시
// 파라미터의 데이터 형이 서로 다르기 때문에 오버로드 성립
public void user(int a){}
public void user(long a){}
// 파라미터의 개수가 다르기 때문에 오버로드 성립
public void user(int a){}
public void user(int a, int b){}
// 데이터 형의 전달 순서가 서로 다르기 때문에 오버로드 성립
public void user(int a, lonb b){}
pulbic void user(long a, int b){}
- 오버로드는 하나의 메서드를 호출할 수 있는 모든 경우의 수를 미리 준비해 놓음으로써, 메서드를 만드는 측은 번거로울 수 있지만 메서드를 호출하는 측은 데이터 타입을 신경쓰지 않고 편리하게 사용할 수 있게 하기 위함이다.
2-3. 생성자의 Overload
- 객체 생성 방법의 다양화
- 생성자 역시 메서드의 한 종류이므로 Overload가 가능하다.
- 생성자를 Overload 할 경우, 해당 클래스에 대해 '객체를 생성하는 방법'을 다양하게 준비할 수 있게 된다.
예제1)
예제2)
▶ 예제1)은 하나의 객체 안에서 setter 메소드를 통해 전역변수에 값을 전달했고,
▶ 예제2)는 각각의 객체를 만들어 오버로드된 생성자를 통해 전역변수에 값을 넣어주었다.
▶ 따라서 String("회사원")만 입력해도 이전에 입력해두었던 age(19)가 함께 출력되었던 예제1)과 달리,
▶ 예제2)에서는 String("웹개발자")만 입력할 경우 age는 기본값(0)으로 출력된다.
2-4. this 키워드를 사용한 생성자 Overload
- this 키워드의 용법
→ 메서드처럼 사용할 경우, 현재 클래스의 다른 생성자를 의미한다. - this 키워드를 사용하여 생성자 Overload를 간결하게 처리하기
→ 파라미터가 서로 다른 생성자들이 하나의 완전한 생성자를 호출하도록 하여, 데이터의 초기화를 한 곳에서 일괄적으로 처리하도록 구현할 수 있다.
class Hello{
public Hello(String msg){
System.out.println(msg)
}
public Hello(){
this("안녕하세요")
}
}
class Main{
public static void main(String[] args){
Hello h1 = new Hello("Hi"); // Hi
Hello h2 = new Hello(); // 안녕하세요
}
}
▶ 기본 생성자 안 this가 String 파라미터를 가진 Hello 생성자를 호출한 것
3. 객체 형변환
3-1. 객체 형변환
- java 기본 유형의 데이터들처럼 객체 참조변수의 경우에도 형변환(casting)이 이루어진다.
- 서로 다른 클래스 유형으로부터 나온 객체 참조변수들 간의 대입에는 일정한 규칙이 있다.
Parent parent = new Child();
- 위의 대입연산에서 왼쪽 항(부모, Parent)과 오른쪽 항(자식, Child)의 객체 유형이 서로 다른 경우, 두 유형이 서로 상속관계에 있고 왼쪽 객체가 오른쪽 객체의 상위 클래스인 경우에만 암묵적 형변환이 일어난다.
- 하위 클래스에서 상위 클래스 유형으로 할당하는 것은 가능하나 그 반대의 경우에는 명시적 형변환을 해야 한다.
3-2. 객체 간의 암묵적 형변환
A a1 = new B(); // 가능
A a2 = new X(); // 가능
-------------------------
A a3 = new C(); // 가능
A a4 = new Y(); // 가능
-------------------------
B b1 = new C(); // 가능
X x1 = new Y(); // 가능
-------------------------
C c = new C(); // 가능
B b2 = c; // 가능
-------------------------
Y y = new Y(); // 가능
X x2 = y; // 가능
-------------------------
3-3. 암묵적 형변환과 메서드 오버라이드
- 암묵적 형변환은 부모를 상속받는 자식객체의 기능 중 부모에게 물려받은 기능만 사용하도록 제한한다.
- 그러므로 암묵적 형변환이 발생하게 되면 오버라이드된 기능만 사용가능 하고, 추가적으로 구현한 기능은 사용할 수 없다.
- 주의할 점은 기능의 제한이지 기능의 변경은 아니라는 것이다.
2022.03.06 - [이론/자바 기초] - JAVA 그게 뭐야? 13. 상속2
JAVA 그게 뭐야? 13. 상속2
전편 상속에서 이어지는 내용이다:) https://turtlemoon.tistory.com/13 JAVA 그게 뭐야? 12. 변수와 상속1 1. 변수 변수의 종류 - 지역변수(Local Variable) : 메소드 영역에 선언된 변수 - 인스턴스 변수(Instan..
turtlemoon.tistory.com
▶ 업캐스팅 부분 참조
▶ 그림까지 그리며 열심히 설명해두었다 핳...
▶ 자식클래스를 부모타입으로 암묵적형변환 시켜줌(업캐스팅)
▶ 따라서 say()는 사용할 수 있지만 talk()는 사용할 수 없다.
▶ talk()가 없어진 것은 아니므로, Korean 객체를 만들면 그대로 사용할 수 있다.