이론/자바 풀스택 국비수업

220321 스캐너, 다형성, 객체형변환

달거북씨 2022. 3. 28. 07:11
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)

Chracter 클래스 전역변수와 메소드
setter 메소드에 값을 넣어 toString()으로 출력
Member 클래스 생성자의 오버로드

예제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 생성자를 호출한 것

 

this를 통해 파라미터가 있는 생성자에 값을 넘겨주는 것을 볼 수 있다.

 

 

 

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

▶ 업캐스팅 부분 참조

▶ 그림까지 그리며 열심히 설명해두었다 핳...


 

부모클래스 : Hello / 자식클래스 : Korean

▶ 자식클래스를 부모타입으로 암묵적형변환 시켜줌(업캐스팅)

▶ 따라서 say()는 사용할 수 있지만 talk()는 사용할 수 없다.

▶ talk()가 없어진 것은 아니므로, Korean 객체를 만들면 그대로 사용할 수 있다.

728x90