JAVA - Scanner, 다형성 - 오버로드

박종휘·2022년 10월 28일
0

JAVA - 국비

목록 보기
18/29
post-thumbnail

1. Scanner

  • 값을 입력받는 클래스

package scanner;

import java.util.Scanner;

public class Main01 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		System.out.println("int type 입력 : ");
		int i = scanner.nextInt();
		System.out.println("int 결과 : " + i);
		
		System.out.println("double type 입력 : ");
		double d = scanner.nextDouble();
		System.out.println("double 결과 : " + d);
		
		System.out.println("String 입력 : ");
		String s = scanner.next();
		System.out.println("String 결과 : " + s);
		
		scanner.close();
	}
}

---------------------------------------------------------

package scanner;

import java.util.Scanner;


/*
 * scanner.next()		: 공백 전 까지 입력을 받음
 * scanner.nextLine()	: 한 줄 전체를 입력 받음
 */

public class Main02 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		System.out.println("문자열 입력 1 : ");
		String str1 = scanner.nextLine();
		System.out.println( str1 );
		
		System.out.println("문자열 입력 2 : ");
		String str2 = scanner.next();
		System.out.println( str2 );
		
		
		scanner.close();
	}
}

---------------------------------------------------------

package scanner;

import java.util.Scanner;

public class Main03 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("---------회원 가입을 시작합니다---------");
		
		System.out.println("아이디를 입력하세요 : ");
		String str1 = scanner.nextLine();
		System.out.println(str1);
		
		scanner.close();
		
		if( str1.length() > 11 ) {
			System.out.println("아이디는 10자 이하의 " 
					+ "글자로만 입력해 주세요.");
		} else {
			System.out.println("입력하신 아이디는 " 
					+ str1 + "입니다. 회원가입을 시작합니다.");
		}
	}

}

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, long b){}
      		public void user(long a, int b){}

-> println()을 보면 이미 오버로드되어있는 메서드를 사용하고 있었다.


  • 오버로드는 하나의 메서드를 호출할 수 있는 모든 경우의 수를 미리 준비해 놓음으로서, 메서드를 만드는 측은 번거로울 수 있지만 메서드들을 호출하는 측은 데이터 타입을 신경쓰지 않고 편리하게 사용할 수 있게 하기 위함이다.
package overload;

public class Charactor {
	private String job;
	private int age;
	
	public void setProperty( String job ) {
		this.job = job;
	}
	
	public void setProperty( int age ) {
		this.age = age;
	}
	
	public void setProperty( String job, int age ) {
		this.job = job;
		this.age = age;
	}
	
	public void setProperty( int age, String job ) {
		this.age = age;
		this.job = job;
	}
	
	public String toString() {
		return "Charactor [ job = " + job + ", age = " + age + "]";
	}
}
package overload;

public class Main01 {

	public static void main(String[] args) {
		Charactor c = new Charactor();
		System.out.println( c.toString() );
		
		c.setProperty(19);
		System.out.println( c.toString() );
		
		c.setProperty("회사원");
		System.out.println( c.toString() );
		
		c.setProperty("자영업", 20);
		System.out.println( c.toString() );
		
		c.setProperty(35, "교수");
		System.out.println( c.toString() );
	}
}
result

Charactor [ job = null, age = 0]
Charactor [ job = null, age = 19]
Charactor [ job = 회사원, age = 19]
Charactor [ job = 자영업, age = 20]
Charactor [ job = 교수, age = 35]

2-3. 생성자의 Overload

  • 객체 생성 방법의 다양화
  • 생성자 역시 메서드의 한 종류이므로 Overload가 가능하다.
  • 생성자를 Overload할 경우, 해당 클래스에 대해 '객체를 생성하는 방법'을 다양하게 준비할 수 있게 된다.
package overload;

class Hello{
	Hello(){
		System.out.println("Hello");
	}
	
	Hello( String msg ){
		System.out.println( msg );
	}
}

public class Main02 {

	public static void main(String[] args) {
		Hello h1 = new Hello();
		Hello h2 = new Hello("월요일 입니다.");
		
	}
}
result

Hello
월요일 입니다.

2-4. this 키워드를 사용한 생성자 Overload

  • this 키워드의 용법
    • 메서드처럼 사용할 경우, 현재 클래스의 다른 생성자를 의미한다.
  • this 키워드를 사용하여 생성자 Overload를 간결하게 처리하기
    • 파라미터가 서로 다른 생성자들이 하나의 완전한 생성자를 호출하도록 하여, 데이터의 초기화를 한 곳에서 일괄적으로 처리하도록 구현할 수 있다.
class Hello {
	public Hello(String msg){
    	System.out.println(msg);
    }
    
    public Hello(){
    	// Hello(String msg) 생성자를 호출 ↓
        this("안녕하세요"); -> 파라미터 생성자 호출 (2)
        // -> 데이터 일괄 초기화를 하기 위해 
    }
}

* 두 개다 객체 생성 가능
1. Hello h1 = new Hello(); -> 기본 생성자 호출 (1)
2. Hello h2 = new Hello("Hi"); -> Hi 출력
package overload;

public class Article {
	private int seq;		// 글 번호
	private String subject;	// 글 제목
	private String writer;	// 글 작성자

	// 파라미터가 있는 생성자
	public Article(int seq, String subject, String writer) {
		super();
		this.seq = seq;
		this.subject = subject;
		this.writer = writer;
	}
	
	public Article(int seq, String writer) {
		this(seq, "제목없음", writer);
//		this.seq = seq;
//		this.subject = "제목없음";
//		this.writer = writer;
	}
	
	public Article(int seq) {
		this(seq, "제목없음", "익명");
//		this.seq = seq;
//		this.subject = "제목없음";
//		this.writer = "익명";
	}

	// toString()
	@Override
	public String toString() {
		return "Article [seq=" + seq 
				+ ", subject=" + subject 
				+ ", writer=" + writer + "]";
	}
package overload;

public class Main04 {

	public static void main(String[] args) {
		Article a1 = new Article(1, "첫 번째 게시물", "자바학생");
		System.out.println(a1.toString());
		
		Article a2 = new Article(2, "자바학생2");
		System.out.println(a2);
		
		Article a3 = new Article(3);
		System.out.println(a3);
	}
}
result

Article [seq=1, subject=첫 번째 게시물, writer=자바학생]
Article [seq=2, subject=제목없음, writer=자바학생2]
Article [seq=3, subject=제목없음, writer=익명]
profile
개린이의 개발 고수되기 작전!

0개의 댓글