[Java] 가변인자형 / printf / Polymorphism(다형성) / Overload

이승우·2023년 7월 12일

JAVA

목록 보기
14/14
post-thumbnail

▣ 가변인자형 (Variable Arguments)

  • method 호출 시, 입력하는 값을 동적으로 넣어줄 때

  • JDK 1.5부터 지원

  • parameter를 정의할 때 데이터형 ... 매개변수명 형식

  • method 안에서는 배열로 처리

  • System.out.printf / System.out.format

  • method가 여러 개의 parameter를 정의할 때 가변인자형은 마지막에만 사용 가능

형식)

접근지정자 반환형 method명 (데이터형 ... 매개변수명) {

}

호출)

method명();

method명(값);

method명(값, 값, 값...);


▶ 실습 - 가변인자형

package day0619;
/**
 * 가변인자형(Variable Arguments)의 사용 <br>
 * method를 호출할 때 입력값(Arguments)을 동적으로 몇 개를 넣어도 호출 가능한 method 형태. <br>
 * V.A는 parameter를 정의할 때 가장 마지막에만 정의할 수 있다.
 */
public class VariableArguments {

	// 1.method선언
	public void useVariableArgs(int... param) {
		// V.A는 배열로 처리되므로, 참조형 데이터형이고 주소가 출력된다
		// System.out.println(param);
		for (int i = 0; i < param.length; i++) {
			System.out.println(param[i]);
		} // end for
	} // useVariableArgs

	public void useVariableArgs2(int j, char c, int... param) {
		// V.A는 배열로 처리되므로, 참조형 데이터형이고 주소가 출력된다
		System.out.println("int :" + j + ", char :" + c);

		for (int i = 0; i < param.length; i++) {
			System.out.println(param[i]);
		}
	}

	public static void main(String[] args) {
		// 2.객체생성 : 클래스명 객체명 = new 클래스명();
		VariableArguments va = new VariableArguments();

		// 3. method호출
		va.useVariableArgs(); // 호출가능
		va.useVariableArgs(2023); // 호출 가능
		va.useVariableArgs(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 호출가능

		System.out.println("------------------------------");
		// 일반 parameter는 값을 반드시 입력해야하고, V.A는 생략가능
		va.useVariableArgs2(2023, 'A');
		va.useVariableArgs2(2024, 'B', 2023, 6, 19, 12, 30);

	}

}

▶실행결과
2023
0
1
2
3
4
5
6
7
8
9
10
--------------------------------
int :2023, char :A
int :2024, char :B
2023
6
19
12
30


■ printf

  • Variable Arguments를 사용한 출력 method

  • JDK 1.5부터 지원

  • 출력메시지와 출력값 분리 가능

    System.out.printf("출력식", 값...);

● prinf 자릿수 설정

System.out.printf("%5d", 12);

5칸으로 설정하여 정수 값을 출력

===========================

System.out.printf("%-5d", 12);

5칸 설정하고 왼쪽정렬로 출력

===========================

System.out.printf("%.2f", 12.1234);

원하는 소수자릿수(2자리)까지 절삭해 출력

===========================

System.out.printf("%7.2f", 12.1234);

전체자릿수 7자리, 소수자릿수 2자리

● println vs. printf

int year = 2020;

int month = 11;

//오늘은 2020년 11월

System.out.println("오늘은 "+year+"년 "+month+"월");

System.out.prinf("오늘은 %d년 %d월", year, month);

▶ 실습 - printf

public class UsePrintf {

	public static void main(String[] args) {
		int age = 25;
		int year = 2023;

		// 올해는 2023년 내 나이는 25세를 콘솔 출력,
		// println은 출력 메시지와 출력 값이 섞이게 된다.
		System.out.println("올해는 " + year + "년 내 나이는 " + age + "세");

		// printf는 출력메시지와 출력값이 구분된다.
		System.out.printf("올해는 %d년 내 나이는 %d세\n", year, age);
		System.out.format("올해는 %d년 내 나이는 %d세\n", year, age);

		int i = 2023;

		System.out.printf("[%d][%6d][%-6d]\n", year, year, year);

		char c = 'A';
		System.out.printf("[%c][%5c][%-5c]\n", c, c, c);

		double d = 2023.619;
		System.out.printf("[%f][%8.1f][%-8.1f][%.2f]\n", d, d, d, d);

		boolean flag = true;
		System.out.printf("%b\n", flag);

		String msg = "오늘은 월요일 입니다";
		String msg2 = "오후 폭염";

		System.out.printf("%s,[%10s]", msg, msg2);
        
        // err: 출력문자와 출력 값의 개수가 맞지 않을 경우
//		System.out.printf("오늘은 %d년 %월 입니다..",2023));
		// err: 출력문자와 출력 값의 데이터형이 맞지 않을 경우
//		System.out.printf("오늘은 %d년 %d월 입니다..", 2023, 6.20);

 	}//main
}//class      

▶실행결과
올해는 2023년 내 나이는 25세
올해는 2023년 내 나이는 25세
올해는 2023년 내 나이는 25세
[2023][ ​ ​ 2023][2023 ​ ​ ][A][ ​ ​ A][A ​ ​ ]
[2023.619000][ ​​​ ​ 2023.6][2023.6 ​ ​ ​][2023.62]
true
오늘은 월요일 입니다,[ ​ ​ ​ 오후 폭염]


▣ 다형성 (Polymorphism)

  • 하나의 대상을 다양하게 사용하는 것

  • *객체지향언어의 3대 특징 중 하나

    *3대 특징 : 다형성, 상속, 캡슐화

  • 객체다형성과 method다형성 지원

  • 객체다형성 : 부모클래스로 다양한 자식클래스의 객체를 저장 가능(상속)

  • method다형성 : Overload, Override

※ Overload vs. Override

  • Overload : 한 클래스에서 같은 이름의 method를 여러 개 정의하는 방법

  • Override : 상속관계의 클래스에서 같은 이름의 method를 자식클래스에서 재정의하는 방법

■ Overload (Overloading)

  • 하나의 클래스안에서 같은 이름의 method를 여러 개 정의할 수 있는 방법

  • 편의성 향상

  • method명은 같고, 매개변수를 다르게 작성

    ⇒ 호출을 다르게 할 수 있다.

class Test{

 public void temp() { // t.temp();

 }

 public void temp(int i) { // t.temp(11);

 }

public void temp(int i, int j) { // t.temp(1, 2);

 }

public void temp(char c) { // t.temp('A');

 }

public void temp(int paramK) {

 } //호출시 식별되지 않기 때문에 오버로드 불가(error)

}

▶ 실습 - Overload

package day0620;

public class OverloadTest {

	// 호출되면 *을 하나 출력하는 method를 작성
	/**
	 * 별을 하나 출력하는 일
	 */
	public void printStar() {
		System.out.println("★");
	}

	// 호출되면 *을 입력되는 개수만큼 출력하는 method를 작성
	/**
	 * 입력하는 수 만큼의 별을 출력하는 일
	 * 
	 * @param cnt 출력할 별의 개수
	 */
	public void printStar(int cnt) {
		for (int i = 0; i < cnt; i++) {
			System.out.print("☆");
		} // end for
	}// printStar

	public static void main(String[] args) {
		OverloadTest ot = new OverloadTest();
		ot.printStar(10);

	}// main

}// class

▶실행결과
★★★★★★★★★★

profile
🧑🏻‍💻

0개의 댓글